gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:39:28 25 4
gpt4 key购买 nike

在一个TCP连接中,要求执行主动关闭的一端在TIME_WAIT状态停留2MSL的时间。为什么它需要 2MSL?很多人说一个MSL是给最终ACK的,另一个MSL是给重传的FIN的。但是,FIN 的 RTO 比 MSL 短很多,FIN 不需要等待 MSL 重传。所以,他们的解释对我来说没有意义。任何人都可以举出一个具体的例子来说明那段时间段是如何交换的吗?

最佳答案

Figure 1. Packet exchange for TCP connection.

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

为什么会存在TIME_WAIT状态?
< >一书给出了答案:

There are two reasons for the TIME_WAIT state:

  1. To implement TCP's full-duplex connection termination reliably
  2. To allow old duplicate segments to expire in the network

我想这也是这个问题的答案(为什么TIME_WAIT状态需要2MSL长?)

先看原因1,为了可靠终止全双工连接,假设图1中client发送的最后一个ACK丢失,server会重传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。

关于tcp - 为什么 TIME_WAIT 状态需要 2MSL 长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25338862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com