第一个原因是:数据报文可能在发送途中延迟但最终会到达。如果客户端在发送完 FIN 包后不等待直接进入 CLOSE 状态,过一段时间相同的 IP 和端口号又建立一个新的连接,这样收到的数据包就无法知道到底是旧连接的包还是新连接的包了,造成新连接数据的混乱。如果等待时间是 2 个 MSL,已经足够让一个方向上的包最多存活 MSL 秒就被丢弃,保证了在新创建的 TCP 连接以后,老连接姗姗来迟的包已经在网络中被丢弃消逝,不会干扰新连接。
第二个原因是确保可靠实现 TCP 全双工终止连接。关闭连接的四次挥手中, 最终的 ACK 是由主动关闭方发出,如果这个 ACK 丢失,对端将重发 FIN,如果主动关闭方不维持 TIME_WAIT 直接进入 CLOSED 状态,则无法重传 ACK,被动关闭方因此不能及时可靠释放。1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能够到达对端,1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达。