TCP 三次握手和四次挥手

文章目录

    • UDP 和 TCP 对比
    • TCP
      • 三次握手
        • TCP为何要采用三次握手来建立连接,2次握手可以吗?
      • 四次挥手
      • TCP状态分析
        • TIME_WAIT状态


UDP 和 TCP 对比


UDP (User Datagram Protocol) TCP (Transmission Control Protocol)
无连接协议 面向连接的协议
不可靠协议 可靠性协议
不保证各个数据报的先后顺序跨网络保持不变 给所发送数据的每一个字节关联一个序列号进行排序
不提供确认、序列号、超时重传机制,不能保证最终到达目的地;不保证每个数据报只到达一次 TCP发送数据要求另一端返回一个确认。没收到确认,会自动重传数据并等待更长的时间。数次重传失败后,TCP才放弃
不提供流量控制 提供流量控制
TCP总是告诉对端它能够接收多少字节的数据,称为通告窗口。该窗口在任何时候都指出接收缓冲区中的可用空间,从而确保发送端发送的数据不会溢出接收缓冲区
全双工 全双工
IPV4 + IPV6 IPV4 + IPV6



TCP


TCP链接过程中的一些名词的意义:

字符缩写 描述
SYN 同步序号,表示此报文是一个连接请求或接收报文
ACK 确认位,对接收到报文的确认
FIN 终止位,表示发送方完成数据发送,用来释放一个连接
RST 复位连接,表示TCP连接中出现严重错误
PSH 推送位,尽可能快地将数据送往接收进程


三次握手

TCP 三次握手和四次挥手_第1张图片
(1)第一次握手:建立连接,客户端发送SYN J给服务器端,进入SYN_SENT状态。
(2)第二次握手:服务器收到客户端的SYN J报文后,向客户端响应一个SYN K,并对SYN J 回应确认ACk J + 1
(3)第三次握手:客户端收到服务器的SYN K报文后,在向服务器发送一个确认ACK K + 1
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

注意 :
(1)如果接收到的ACK是有值的,那么发送的SYN就等于ACK的值 。
(2)序列号是一个相对值。在三次握手的时候是不允许进行数据传递的,因此len是为0,ACK确认序号的值=seq+1。
     但是如果当三次握手以后,开始传递数据的时候,确认序号的值 = seq + len。确认序号的意义就是告诉对方,这个确认序号之前的所有报文我都接受到了,保证TCP协议的稳定可靠的传输。




TCP为何要采用三次握手来建立连接,2次握手可以吗?

不可以。三次握手是为了防止失效的连接请求报文段突然又传送到服务器,从而发生错误。

当客户端发出的连接请求报文段由于某些原因没有及时到达服务器,而客户端在等待一段时间后,又重新向服务器发送连接请求,且建立成功,顺序完成数据传输,那么第一次发送的连接请求报文段就称为失效的连接请求报文段。
考虑这样一种特殊情况,客户端第一次发送的连接请求并没有丢失,而是因为网络问题延迟到达服务器,服务器以为是客户端又发起的连接,于是服务器同意连接,并发回确认,但此时客户端不予理会,服务器就一直等待客户端发送数据,导致服务器资源的浪费




四次挥手

当建立了TCP连接以后,数据传送完毕后,要断开TCP连接,这个时候就有了四次挥手。
建立一个连接只需要三次握手,而终止一个连接则需要经过四次挥手,这是因为TCP的半关闭造成的。我们知道TCP是全双工的(即两个方向上都能同时传递),因此每个方向必须单独进行关闭。
TCP 三次握手和四次挥手_第2张图片
(1)某个应用程序先调用close,我们称这一端执行主动关闭,成为A。发送一个FIN报文,表示数据发送完毕。A------FIN------>B
(2)另一端(称为B)接收到FIN报文之后,执行被动关闭,对这个FIN进行确认。
它的接收也作为文件结束符传递给接收端的应用程序,因为FIN的接收即表示在相应连接上再也接收不到额外数据。 B-------ACK------->A
(3)一段时间后,接收到文件结束符(B端)的应用进程调用close关闭它的套接口,导致B端的TCP也发送一个FIN。 B------FIN------>A
(4)接收到FIN的原发送端(A端)对它进行确认。A------ACK----->B

这样每个方向上都有一个FIN和ACK,一共需要四个分节。因为有时(1)中的FIN随着数据一起发送;或者B端的TCP把(2)(3)中的FIN和ACK合成一个分节。



TCP状态分析

TCP 三次握手和四次挥手_第3张图片



TIME_WAIT状态

执行主动关闭的一方,在收到被动关闭方发送的FIN报文后进入TIME_WAIT状态。
TIME_WAIT状态持续时长为2 * MSL(最长分节生命周期,Maxmum Segment Lifetime),即2MSL。


TIME_WAIT状态的目的:

  • 实现终止TCP全双工连接的可靠性。
    假设最终的ACK丢失,服务器会重发最终的FIN,客户端必须维护信息以允许它重发最终的ACK,如果不维护状态信息,它将响应RST,而服务器则把该分节解释成一个错误。
  • 允许老的重复分节在网络中消失。
    假设A、B之间有个TCP连接,关闭这个连接后,在后面的某个时候又重新建立起相同的A、B之间的TCP连接,后一个连接称为前一个连接的化身,因为他们的IP和端口号是一样的。
    TCP不能给处于TIME_WAIT状态的连接启动新的化身,既然TIME_WAIT状态的持续时间是2MSL,这就足够让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答做多存活MSL秒也被丢弃,这样能保证当成功建立一个TCP连接时,来自先前化身的老重复分组都已经在网络中消失了。

你可能感兴趣的:(计算机网络)