当前位置:   article > 正文

网络协议:TCP三次握手与四次挥手_tcpip三次握手四次挥手

tcpip三次握手四次挥手

本篇内容包括:TCP/IP 传输协议(TCP/IP 传输协议简介,IP 协议,UDP 协议,TCP 协议介绍),TCP 的三次握手、TCP 的四次挥手 以及 TCP 协议是怎么保证有效传输等内容。

一、TCP/IP 传输协议

1、TCP/IP 传输协议简介

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP 协议不仅仅指的是 TCP 和 IP 两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP 等协议构成的协议簇, 只是因为在 TCP/IP 协议中 TCP 协议和 IP 协议最具代表性,所以被称为 TCP/IP 协议。

TCP/IP 传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

2、关于 IP 协议

IP 协议也就是我们所说的网络层协议,它的主要目的就是将一个 IP 地址的数据发送到另外一个 IP 地址所代表的设备,这两个 IP 地址有可能是隶属于同一个网段,也有可能隶属于不同的网段

IP 协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的 IP 地址。IP 协议将这个 32 位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。如果两个 IP 地址在同一个子网内,则网络地址一定相同。为了判断 IP 地址中的网络地址,IP 协议还引入了子网掩码,IP 地址和子网掩码通过按位与运算后就可以得到网络地址。

3、关于 UDP 协议是什么

UDP 即用户数据报协议,UDP 协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP 协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP 协议就诞生了。

4、关于 TCP 协议是什么

TCP 即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,简单来说 TCP 就是有确认机制的 UDP 协议。TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。 当一个连接被建立或被终止时,交换的报文段只包含 TCP 头部,而没有数据。

一个 TCP 连接由一个 4 元组构成,分别是两个 IP 地址和两个端口号。一个 TCP 连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个连接,通过四次挥手来关闭一个连接。

在这里插入图片描述

TCP协议头最少 20 个字节,包括以下的区域:

  • TCP 源端口(Source Port):16 位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是标示报问的返回地址;
  • TCP 目的端口(Destination port):16 位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口;
  • TCP 序列号(序列码,Sequence Number):32位 的 seq 序列号由接收端计算机使用,重新分段的报文成最初形式。当 SYN 出现,序列码实际上是初始序列码(ISN),而第一个数据字节是 ISN+1。这个序列号(序列码)是可以补偿传输中的不一致;
  • TCP 确认序号(Acknowledgment Number):32 位的序列号由接收端计算机使用,重组分段的报文成最初形式,如果设置了 ACK 控制位,这个值表示一个准备接收的包的序列码;
  • 头长度(Header Length):表示 TCP 头的四字节数,如果转化为字节个数需要乘以 4(如果没有任何选项字段,TCP 头部长度为 20 字节;最多可以有 60 字节的 TCP 头部);
  • 标志位:共 6 个,即 URG、ACK、PSH、RST、SYN、FIN
    • URG:紧急指针(urgent pointer)有效,0 为不使用,1 为使用;
    • ACK:确认序号有效,确认序号 ack 与标志位中的 ACK 不同,确认方 ack = 发起方 seq+1,两端配对,0 为请求,1 为应答;
    • PSH:接收方应该尽快将这个报文交给应用层;
    • RST:重置连接(连线复位,首先断开连接,然后重建);
    • SYN:发起一个新连接(同步连线序号,用来建立连线);
    • FIN:结束/释放一个连接(如果 FIN 为 0 是结束连线请求,FIN 为 1 表示结束连线);
  • 窗口大小(Window):目的机使用 16 位的域告诉源主机,它想收到的每个 TCP 数据段大小;
  • 校验和(Check Sum):这个校验和和IP的校验和有所不同,不仅对头数据进行校验还对封包内容校验;
  • 紧急指针(Urgent Pointer):当 URG 为 1 的时候才有效。TCP 的紧急方式是发送紧急数据的一种方式。

二、TCP 的三次握手

1、TCP 三次握手概述

三次握手的本质是确认通信双方收发数据的能力。

  • 首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了「我的发件能力」和「他的收件能力」是可以的
  • 然后,他给我回信,我若收到了,我便知「我的发件能力」和「他的收件能力」是可以的,并且「他的发件能力」和「我的收件能力」是可以。
  • 最后,我回馈一次,他若收到了,他便清楚了「他的发件能力」和「我的收件能力」是可以的
次数我的发件能力可以我的收件能力可以他的发件能力可以他的收件能力可以
第一次他知道他知道
第二次我知道我知道我知道我知道
第三次他知道他知道
2、TCP 三次握手的详细过程

三次握手详细过程:

  1. 第一次握手,客户端向服务端发起连接请求:
    • 首先,客户端会生成一个随机起始序列号 ISN(比如是100),
    • 然后客户端向服务端发送报文,此时报文段包含 SYN 标志位(也就是 SYN=1),序列号 seq=100;
  2. 第二次握手,服务端收到客户端发来的报文:
    • 首先,服务端发现 SYN=1,确定这是一个连接请求,于是服务端将客户端的起始序列号 100 存起来,并且随机生成一个服务端的起始序列号(比如是200)
    • 然后,服务端给客户端回复一段报文,回复报文包含 SYN 和 ACK 标志(也就是SYN=1,ACK=1)、序列号 seq=200、确认号 ack=101(客户端发过来的序列号+1);
  3. 第三次握手,客户端收到服务端的回复报文:
    • 首先:客户端发现 ACK=1 并且 ack=101,于是知道服务端已经收到了序列号为 100 的那段报文;
    • 同时,客户端发现 SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号 200 给存下来;
    • 然后,客户端再回复一段报文给服务端,报文包含 ACK 标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次 seq 就从 101 开始,需要注意的是不携带数据的 ACK 报文是不占据序列号的,所以后面第一次正式发送数据时 seq 还是 101);
    • 最后,当服务端收到报文后发现 ACK=1 并且 ack=201,就知道客户端收到序列号为 200 的报文了,就这样客户端和服务端通过 TCP 建立了连接。

三、TCP 的四次挥手

四次挥手的目的是关闭一个连接

比如客户端初始化的序列号 ISA=100,服务端初始化的序列号 ISA=200。TCP 连接成功后客户端总共发送了 1000 个字节的数据,服务端在客户端发 FIN 报文前总共回复了 2000 个字节的数据:

  1. 第一次挥手:当客户端的数据都传输完毕后,客户端向服务端发出连接释放报文,报文包含 FIN 标志位(FIN=1)、序列号 seq=1101(100+1+1000,其中的,100 时初始序列号 ISA,1000 是目前总共发送了 1000 个字节的数据, 1 是建立连接时占的一个序列号)Ps:客户端发出 FIN 报文段后只是不能发数据了,但是还可以正常收数据;另外 FIN 报文段即使不携带数据也要占据一个序列号;
  2. 第二次挥手:服务端收到客户端发的 FIN 报文后给客户端回复确认报文,确认报文包含 ACK 标志位(ACK=1)、确认号 ack=1102(客户端 FIN 报文序列号 1101+1)、序列号 seq=2200(200+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发 FIN 报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完;
  3. 第三次挥手:务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含 FIN 和 ACK 标志位(FIN=1,ACK=1)、确认号和第二次挥手一样 ack=1102、序列号 seq=2350(2300+50);
  4. 第四次挥手:客户端收到服务端发的 FIN 报文后,向服务端发出确认报文,确认报文包含 ACK 标志位(ACK=1)、确认号 ack=2351、序列号 seq=1102。Ps:客户端发出确认报文后不是立马释放 TCP 连接,而是要经过 2MSL(最长报文段寿命的 2 倍时长)后才释放 TCP 连接。而服务端一旦收到客户端发出的确认报文就会立马释放 TCP 连接,所以服务端结束 TCP 连接的时间要比客户端早一些。

四、TCP 协议是怎么保证有效传输

1、TCP 协议是怎么保证有效传输的?

TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。

  • 确认应答:TCP 实现可靠传输的方式之一,是通过序列号与确认应答。

  • 连接管理:三次握手、四次挥手

  • 重传机制:但在复杂的网络环境下,并不一定能正常的数据传输,万一数据在传输过程中丢失了呢?所以 TCP 针对数据包丢失的情况,会用重传机制解决。

    • 超时重传:如果发送方发送数据一段时间后没有收到 ACK,那么就重发数据。
    • 此外还有:快速重传、SACK、D-SACK;
  • 滑动窗口:我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。这个模式就有点像我和你面对面聊天,你一句我一句。这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。

    为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

  • 流量控制:发送方不能无脑的发数据给接收方,要考虑接收方处理能力。如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。

    接收方会在返回 ACK 时同时把自己的即时窗口填入,发送方就根据报文中窗口的大小控制发送速度。

  • 拥塞控制:前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大…

    所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。

    拥塞窗口 cwnd 是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/220459
推荐阅读
相关标签
  

闽ICP备14008679号