在TCP连接中,执行活动关闭的结束需要在2MSL时间内保持TIME_WAIT状态。为什么它必须是2MSL?许多人说一个MSL用于最终ACK,另一个MSL用于重传FIN。但是,FIN的RTO比MSL短,并且FIN不需要等待MSL重传。所以,他们的解释对我来说没有意义。任何人都可以提供一个特定的例子,说明在此期间如何交换段吗?
答案 0 :(得分:1)
我也有同样的问题。我想到了一个假设 在极端情况下,假设来自客户端的最后一个ACK花费MSL到达服务器端。此时,终点认为由于MSL超时,此ACK已经消失。所以服务器端立即重新发送FIN。为了确保FIN能够到达客户端(或者如果没有,我们必须确保其消失),我们必须有另一个MSL。
答案 1 :(得分:1)
让我们回顾一下过程
经过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)
为什么TIME_WAIT状态存在?
《 UNIX网络编程(第1卷,第3卷)》这本书给出了答案:
TIME_WAIT状态有两个原因:
- 可靠地实现TCP的全双工连接终止
- 要允许旧的重复段在网络中过期
我认为这也是这个问题的答案(为什么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的目的是防止后来连接接受来自一个连接的延迟数据包。它可能发生在:
在这种情况下,endponts无法识别以识别数据包所属的连接。
答案 4 :(得分:0)
Tcp必须防止某个连接中的旧副本在以后重新出现,并被误认为属于新的相同连接。为此,Tcp将不会启动当前处于TIME_WAIT状态的新连接。
TIME_WAIT状态是MSL的两倍,这使一个方向上的数据包丢失了MSL秒,而丢失了答复的另一个MSL秒。
答案 5 :(得分:0)
存在TIME-WAIT状态和2SML计时器的两个原因:
如果最后一个ACK段丢失,则为最后一个FIN(完成)位设置计时器的服务器TCP会假定其FIN丢失并重新发送。如果客户端进入CLOSED状态并在2MSL计时器到期之前关闭连接,则它将永远不会收到此已重发的FIN段,因此服务器将永远不会收到最终的ACK。服务器无法关闭连接。 2MSL计时器使客户端等待足够长的时间,以使ACK丢失(一个SML)和FIN到达(另一个SML)。如果在TIME-WAIT状态期间有新的FIN到达,则客户端发送新的ACK并重新启动2SML计时器。
来自一个连接的重复段可能会出现在下一个连接中。假定客户端和服务器已关闭连接。短暂的时间后,他们使用相同的套接字地址(相同的源IP地址和目标IP地址以及相同的源端口和目标端口号)打开连接。如果两个连接之间没有足够的时间,则先前连接的重复段可能会到达此新连接,并被解释为属于新连接。为了防止出现此问题,TCP要求除非经过2MSL的时间量,否则化身就不会发生。