TIME_WAIT状态

一、TIME-WAIT是什么

        TIME-WAIT状态是在连接拆除阶段开始起作用的。在拆除一个TCP连接通常需要交换 4 个分段。

       (1)主机 1 上的应用程序关闭自己这端的连接,使得 TCP 向主机 2 发送了一个 FIN。

       (2)主机 2 对着(1)中的 FIN 进行 ACK 确认。

       (3)一段时间之后,主机 2 上的应用程序关闭它这端的连接,这样就向主机 1 发送一个 FIN。

       (4)主机 2 会以一个 ACK 应答。

        主机1在收到主机2的结束报文段(报文3中的FIN)之后,并没有直接进入CLOSED状态,而是转到TIME_WAIT状态。在这个状态,客户端连接要等待一段长为 2MSL(Maximum Segment Life,报文段最大生存时间)的时间,才能完全关闭。


        关于TIME-WAIT状态,还要弄清楚三点:

       (1)通常,只有一端——主动关闭的那一端会进入TIME-WAIT状态。

       (2)RFC 793 将 MSL 定义为 2 分钟。根据这个定义,连接会在TIME-WAIT状态停留 4 分钟。但实际上这个值基本上被忽略了。

       (3)如果连接处于TIME-WAIT状态时有分组到达,就重启2MSL的定时器。

二、为什么要使用它

        使用TIME-WAIT状态主要有两个目的:

       (1)可靠地终止TCP连接

       (2)为耗尽网络中所有此连接的“走失段”提供时间

        第一个目的很好理解。假设主动关闭的这一端没有进入TIME-WAIT状态,而只是关闭了连接,并且对最后一条ACK丢失掉了。因为最后一条ACK丢失了,被动关闭的这一端会超时,并重传FIN。而主动关闭端收到重传的FIN时,TCP已经没有这条连接的记录了(已经关闭了连接),所以它会用RST(重置)来响应,对等实体会产生一个错误状态,而不会有序地终止。但如果发送最后一条ACK的这一端处于TIME-WAIT状态,仍然有这条连接的记录,所以它可以对来自对应实体的重传FIN进行正确的响应。

        在Linux系统上,一个TCP端口不能被同时打开多次(两次及以上)。当一个TCP连接处于TIME_WAIT状态时,我们将无法立即使用该连接占用的端口来建立一个新的连接。反过来思考,如果不存在TIME_WAIT状态,则应用程序能够立即建立一个和刚关闭的连接相似的连接。这个新连接可能接受到属于原来的连接的、携带应用程序数据的TCP报文段(迟到的报文段),这显然是不应该发生的。这就是TIME-WAIT状态存在的第二个原因。

        另外,因为TCP报文段的最大生存时间是MSL,所以坚持2MSL时间的TIME_WAIT状态能够确保网络上两个传输方向上尚未被接收到的、迟到的TCP报文段都已经消失(被中转路由器丢弃)。因此,一个连接的新的化身可以在2MSL时间之后完全的建立,而绝对不会接收到属于原来连接的应用程序数据,这就是TIME-WAIT状态要持续2MSL时间的原因。

你可能感兴趣的:(网络,tcp,TIME-WAIT)