网上搜答案的时候,在知乎找到了这个问题:为什么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吗
感觉没有完全解除我和题主的疑惑,这是我的回答 。
下面是博客版的回答:
研究了各位的回答,写写自己的思考。
第一步先回答题主为什么是2MSL而不是3MSL的疑问。
等待时间至少是:B的timeout + FIN的传输时间
顺着题主的思路,有个计算问题是:把B的timeout全部算到了A头上,B从发出FIN开始倒计时,而A是收到FIN发出ACK后才开始倒计时,所以多算了一个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就是要磨蹭一会儿呢?
所以我认为:
B的timeout不一定要小于MSL,小于2MSL也可以
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