TCP 四次挥手时为什么需要 2MSL
Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 381
Author 回答者: zzetao
我们先来看看什么是 2MSL ? MSL: Maximum Segment Lifetime, 最长报文段寿命 意思是,需要等候 2 * MSL 时间,才会进入关闭状态
然后再来看哪个阶段需要 2MSL ?
从上图来看,是在 [发送方] 发送完 ACK 后,进入 TIME_WAIT 阶段,这个阶段需要等候 2*MSL,才将 TCP 关闭
为什么要等候 2*MSL ?
-
用足够长的等候时间,来确保 [接收方] 能收到 ACK 包
- 如果 [接收方] 在一定时间没收到 (ACK),会重发 (FIN, ACK),[发送方] 收到后,会重发 (ACK),再重置 2*MSL 定时器 .
-
防止当前连接延迟到达的数据段,被新的 TCP 连接收到
- 新的 TCP 连接:相同端口,相同地址
TIME_WAIT 等候时间长短问题
-
等候时间过短
- 可能会收到上一个 TCP 连接延迟到达的数据段 .
-
等候时间过长
- TCP 连接一直占用着端口,需要关闭后才能建立新的连接,高并发下压力比较大
Author 回答者: shfshanyue
可以参考知乎这个问题:
目的是为了优雅地关闭 TCP 连接。
#26