题目
为什么 TIME_WAIT 状态持续时间是 2MSL?
答案
`MSL` 是 Maximum Segment Lifetime,**报文最大生存时间**,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
TIME_WAIT 状态持续 2MSL 时间的目的是:**让一个 TCP 连接的两端发出的报文都从网络中消失**
**举个例子**,客户端发送给服务端的最后一个 ACK 有两种可能性:
- 正常发送:如果 ACK 报文能够正常发送,假设客户端发送了 ACK 报文后过了一段时间 t 之后服务端才收到该 ACK,则有 0 < t <= MSL。因为客户端并不知道它发送出去的 ACK 要多久对方才能收到,所以客户端至少要维持 MSL 时长的 TIME_WAIT 状态才能保证这个 ACK 报文从网络中消失
- 丢失:如果客户端发出来的 ACK 报文丢失了,也就是第四次挥手丢失,那么服务端会重传 FIN 报文,所以,处于 TIME_WAIT 状态的客户端,要在收到这个 FIN 报文后再发送 ACK 报文,这两个报文需要经过 2MSL 的时间才能在网络中消失
所以,为了确保一个 TCP 连接的两端发出的报文都从网络中消失,客户端需要等待 2MSL 的时间
