为什么TCP4次挥手时等待为2MSL?

问题:

B收到ACK,关闭连接。但是A无法知道ACK是否已经到达B,于是开始等待?等待什么呢?假如ACK没有到达B,B会为FIN这个消息超时重传 timeout retransmit ,那如果A等待时间足够,又收到FIN消息,说明ACK没有到达B,于是再发送ACK,直到在足够的时间内没有收到FIN,说明ACK成功到达。这个等待时间至少是:B的timeout + FIN的传输时间
那么B的timeout时间不应该是FIN传送时间的最大值MSL+ACK传送时间的最大值MSL=2MSL吗?
这样一来整个等待时间不应该是3MSL吗

 

解答 1:

先上答案:time_wait= 被动关闭一侧的FIN重传 time_out+2ML

RFC793中明确了2MSL的作用:
represents waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request.
可能会造成误解的应该是下面这个设定被大多数人忽略:
The only thing that can arrive in this state is a retransmission of the remote FIN. Acknowledge it, and restart the 2 MSL timeout.(每次收到FIN,会重设2MSL的等待时间)
上次连接依然存活的报文对未来的连接影响是很大的,为了防止这种情况的出现,还有The TCP Quiet Time Concept这样的概念.按照这个理念,2MSL时间的设定应该是一个很宽裕的值.
附RFC793原文

https://link.zhihu.com/?target=https%3A//tools.ietf.org/html/rfc793%23section-3.5

附加一张图辅助理解

TCP采用的是相对时间的设定,这种设定在特定条件下是会产生问题的,但是可以有效快速的回收资源,支持高并发.


作者:宫崎骏
链接:https://www.zhihu.com/question/67013338/answer/1306447281
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

解答 2:

先上结论:即保证 B 能够收到自己的 ACK 报文。那么 A 完美的等待时间不是 2MSL,而应该是从 B 发送第一个 FIN 报文开始计时到它最后一次重传 FIN 报文这段时长加上 MSL

time_wait = 从 B(被动关闭端) 发送第一个 FIN 报文开始计时到它最后一次重传 FIN 报文这段时长加上 MSL

我觉得各位的答案都不对,特别是高赞答案。
 

可以看看这个解释。

那些说 3MSL 的同学虽然不对,但是他们动过脑子,真正有思考过的。

根据第三版《UNIX 网络编程 卷 1》2.7 节,TIME_WAIT 状态的主要目的有两个:

+ 优雅的关闭 TCP 连接,也就是尽量保证被动关闭的一端收到它自己发出去的 FIN 报文的 ACK 确认报文;

+ 处理延迟的重复报文,这主要是为了避免前后两个使用相同四元组的连接中的前一个连接的报文干扰后一个连接。

> 注:很多博文只讨论了第一点,并且轻易的给出了错误的理由:最坏情况,ACK 报文的发送和 FIN 报文的重传各自需要 1MSL,因此是 2MSL。仔细想想之后,这些人的文章简直就是不经脑子的生搬硬套

假设 A 是主动关闭的一方,B 是被动关闭。

假如现在 A 收到 FIN 之后,为了实现目标 1,即保证 B 能够收到自己的 ACK 报文。那么 A 完美的等待时间不是 2MSL,而应该是从 B 发送第一个 FIN 报文开始计时到它最后一次重传 FIN 报文这段时长加上 MSL。但这个计算方式过于保守,只有在所有的 ACK 报文都丢失的情况下才需要这么长的时间;

另外,第一个目标虽然重要,但并不十分关键,因为既然已经到了关闭连接的最后一步,说明在这个 TCP 连接上的所有用户数据已经完成可靠传输,所以要不要完美的关闭这个连接其实已经不是那么关键了。因此,(我猜)RFC 标准的制定者才决定以网络丢包不太严重为前提条件,然后根据第二个目标来计算 TIME_WAIT 状态应该持续的时长。

 

等待 2MSL 的真正目的是为了避免前后两个使用相同四元组的连接中的前一个连接的报文干扰后一个连接,换句话说,就是为了让此次 TCP 连接中的所有报文在网络中消失。

 

假如现在 A 发送 ACK 后,最坏情况下,这个 ACK 在 1MSL 时到达 B;此时 B 在收到这个 ACK 的前一刹那,一直在重传 FIN,这个 FIN 最坏会在 1MSL 时间内消失。因此从 A 发送 ACK 的那一刹那开始,等待 2MSL 可以保证 A 发送的最后一个 ACK,和 B 发送的最后一个 FIN 都在网络中消失

作者:Gypsophila N
链接:https://www.zhihu.com/question/67013338/answer/1032098712
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值