TCP三次握手与四次挥手和TIME_WAIT状态等待2MSL的原因

发布时间 2023-04-18 16:01:48作者: zwjason

TCP三次握手和四次挥手

虽然TCP协议会支持通信双方同时发起连接和关闭连接,但是绝大多数情况下,一条TCP连接的建立和关闭,有主动方和被动方。

一个经典的TCP连接的建立和关闭的例子如图所示:

image-20230418151859392

三次握手的主要特征是报文段中SYN标志位被置位(第三次握手没有)、互相交换初始序列号。

四次挥手的主要特征是报文段中FIN标志位被置位。

TIME_WAIT状态等待2MSL的原因

注意到主动方经过四次挥手关闭TCP连接收到来自被动方的FIN报文段时,没有立刻进入CLOSED状态,而是进入TIME_WAIT状态等待2MSL时间再进入CLOSED状态,为什么呢?

MSL: Maximum Segment Lifetime,最大报文段生存时间

为了防止最后一个ACK丢失带来的两个严重后果:服务器无法关闭TCP连接、服务器误伤关闭客户端新的TCP连接。

分析如下:

一条TCP连接的标识是四元组[客户端IP,客户端端口,服务器IP,服务器端口],默认情况下刚刚关闭的端口需要经过一段时间才可以重用,但是用户也可以解除这个限制。

假设客户端收到的FIN报文段、发送ACK后直接进入CLOSED状态。再假设最后一个ACK丢失,被动方将会超时重传FIN。

原因1:若端口不可重用,客户端已关闭并不会响应发送ACK,被动方永远无法关闭连接。

原因2:若端口可重用,上一条TCP刚关闭,应用程序又恰好复用了相同的端口建立了一条新的TCP连接,超时重传的FIN将会关闭刚刚建立的新TCP连接。

为什么是2MSL呢?

最后一个ACK丢失算一个MSL,超时重传FIN算一个MSL。

等待2MSL时间是如何解决该问题的呢?

若客户端等待2MSL时间则可以收到超时重传的FIN,从而发送ACK帮助服务器关闭连接。

若超时重传的FIN丢失了,而客户端已经过了2MSL关闭了,服务器怎么关闭连接呢?

毁灭吧,TCP设计者聪慧过人,定有办法让服务器关闭该连接,否则服务器资源迟早被耗尽。

参考

《TCP/IP详解卷一:协议》第13.5.1节和第13.5.2节。