为什么TIME_WAIT状态需要长2MSL?

时间:2014-08-16 09:36:57

标签: tcp network-programming

在TCP连接中,执行活动关闭的结束需要在2MSL时间内保持TIME_WAIT状态。为什么它必须是2MSL?许多人说一个MSL用于最终ACK,另一个MSL用于重传FIN。但是,FIN的RTO比MSL短,并且FIN不需要等待MSL重传。所以,他们的解释对我来说没有意义。任何人都可以提供一个特定的例子,说明在此期间如何交换段吗?

6 个答案:

答案 0 :(得分:1)

我也有同样的问题。我想到了一个假设 在极端情况下,假设来自客户端的最后一个ACK花费MSL到达服务器端。此时,终点认为由于MSL超时,此ACK已经消失。所以服务器端立即重新发送FIN。为了确保FIN能够到达客户端(或者如果没有,我们必须确保其消失),我们必须有另一个MSL。

答案 1 :(得分:1)

让我们回顾一下过程

  1. A FIN B
  2. B ACK A
  3. B FI A
  4. A ACK B

经过4个步骤,A现在处于TIME_WAIT阶段,而B处于LASK_ACK。

如果步骤4(A ACK B)丢失了怎么办?

B将为第4步等待1个MSL,但未能获得它,因此B重做第3步,而第3步将花费1个MSL到达A。因此,A必须等待2个MSL才能获得优美的波goodbyte

但是还有另一个问题,如果步骤4再次丢失怎么办? :)

答案 2 :(得分:1)

Figure 1. Packet exchange for TCP connection.

图1. TCP连接的数据包交换。

为什么TIME_WAIT状态存在?
《 UNIX网络编程(第1卷,第3卷)》这本书给出了答案:

TIME_WAIT状态有两个原因:

  1. 可靠地实现TCP的全双工连接终止
  2. 要允许旧的重复段在网络中过期

我认为这也是这个问题的答案(为什么TIME_WAIT状态必须为2MSL长?)

首先查看原因1。为了可靠地终止全双工连接,假设丢失了图1中客户端发送的最后一个ACK,并且服务器将重新传输FIN。为了接收此超时并重新传输FIN,客户端需要TIME_WAIT状态; TIME_WAIT状态必须为2MSL吗?实际上,这取决于服务器端FIN超时重传时间RTO。如果RTO小于MSL,则TIME_WAIT状态为MSL就足够了。如果RTO大于2MSL,则TIME_WAIT状态2MSL是不够的,因此仅当RTO在MSL和2MSL之间时,存在TIME_WAIT状态的原因1是TIME_WAIT的时间为2MSL的原因。实际上,通常,RTO比MSL小得多,但是考虑到最坏的情况,RTO为2MSL,因此TIME_WAIT状态为2MSL,以确保最坏的情况也可以接收随时间重传的FIN。

TIME_WAIT的时间是2MSL的另一个重要原因。原因2,为了确保在此连接期间生成的所有数据包均从网络中消失,即,确保在建立新的TCP连接时,来自该连接的旧重复数据包已从网络中消失。 。这里的某些人可能会有一个问题:客户端回复上一个ACK后,感觉所有数据包都可以通过一个MSL消失。为什么所有2MSL数据包都消失了?原因是:
假设客户端在一个MSL时间后立即发送ACK,并且服务器在接收到ACK之前随时间开始重新传输FIN,因此,如果FIN消失,则需要2MSL。

答案 3 :(得分:0)

TIME-WAIT的目的是防止后来连接接受来自一个连接的延迟数据包。它可能发生在:

  1. 从(地址a,端口p)到(地址b,端口q)的连接终止
  2. 建立从(地址a,端口p)到(地址b,端口q)的第二个连接
  3. 来自第一个连接的重复数据包在网络中被延迟,并在其序列号位于第二个连接的窗口中时到达第二个连接。
  4. 在这种情况下,endponts无法识别以识别数据包所属的连接。

答案 4 :(得分:0)

Tcp必须防止某个连接中的旧副本在以后重新出现,并被误认为属于新的相同连接。为此,Tcp将不会启动当前处于TIME_WAIT状态的新连接。

TIME_WAIT状态是MSL的两倍,这使一个方向上的数据包丢失了MSL秒,而丢失了答复的另一个MSL秒。

答案 5 :(得分:0)

存在TIME-WAIT状态和2SML计时器的两个原因:

  1. 如果最后一个ACK段丢失,则为最后一个FIN(完成)位设置计时器的服务器TCP会假定其FIN丢失并重新发送。如果客户端进入CLOSED状态并在2MSL计时器到期之前关闭连接,则它将永远不会收到此已重发的FIN段,因此服务器将永远不会收到最终的ACK。服务器无法关闭连接。 2MSL计时器使客户端等待足够长的时间,以使ACK丢失(一个SML)和FIN到达(另一个SML)。如果在TIME-WAIT状态期间有新的FIN到达,则客户端发送新的ACK并重新启动2SML计时器。

  2. 来自一个连接的重复段可能会出现在下一个连接中。假定客户端和服务器已关闭连接。短暂的时间后,他们使用相同的套接字地址(相同的源IP地址和目标IP地址以及相同的源端口和目标端口号)打开连接。如果两个连接之间没有足够的时间,则先前连接的重复段可能会到达此新连接,并被解释为属于新连接。为了防止出现此问题,TCP要求除非经过2MSL的时间量,否则化身就不会发生。