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

Good Bye:wave:

February 11, 2021 · 6 mins read

网上搜答案的时候,在知乎找到了这个问题:为什么TCP4次挥手时等待为2MSL? :arrow_upper_right:

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吗

感觉没有完全解除我和题主的疑惑,这是我的回答 :arrow_upper_right:

下面是博客版的回答:

为什么是2MSL而不是3MSL

研究了各位的回答,写写自己的思考。

第一步先回答题主为什么是2MSL而不是3MSL的疑问。

等待时间至少是:B的timeout + FIN的传输时间

顺着题主的思路,有个计算问题是:把B的timeout全部算到了A头上,B从发出FIN开始倒计时,而A是收到FIN发出ACK后才开始倒计时,所以多算了一个MSL

为什么是2MSL而不是其他MSL

但还是没有解决根本问题,为什么是2MSL而不是其他MSL?下面继续分析:

假设双方都是理智的,在最悲观(每个数据段都需要MSL才能抵达目的地)的情况下:

B的timeout考虑BX:发出FIN + [*收到ACK*] = 2MSL

A的TIME_WAIT等待考虑AX: [*发出ACK*] + {B timeout剩余时间} + 再次收到FIN = 2MSL,只是刚好{B timeout剩余时间} = BX - 发出FIN - 收到ACK = 0

注意[…]括起来的在时间区间上刚好是重叠的,注意到大部分答案有个暗含的假定:A的ACK到达之日就是B重发FIN之时。B就是要磨蹭一会儿呢?

所以我认为:

  1. B的timeout不一定要小于MSL,小于2MSL也可以

  2. B的timeout反而很关键,不得不考虑。换句话说,通信是双方的,A在预估的时候不可能不考虑B的做法。假设B任性了,timeout就是要10MSL,A等2MSL显然是不够的。

A都关闭连接了,但路上还有B的FIN,即满足不了“优雅的关闭TCP连接”也满足不了“处理延迟的重复报文”的目的。

现在将{B timeout剩余时间}公式代入A的公式,反正一个单程就是MSL,最后得出AX = BX。也就是说,如果B的timeout是3MSL,那A也要等3MSL

最后我的结论是:A的TIME_WAIT等待时间就是理智B的最大timeout


:clock9:上次更新: 2021-05-26