TCP 四次挥手过程中,为什么需要等待 2MSL, 才进入 CLOSED 关闭状态?

为什么需要等待?

  1. 为了确保客户端发送的最后一个ACK报文段能够到达服务端,因为这个ACK报文段有可能会丢失,导致处于LAST-ACK状态的服务端无法收到对已发送的FIN+ACK报文段的确认。在这种情况下,服务端会超时重传该FIN+ACK报文段,而客户端能够在2MSL的时间内(超时 + 1MSL传输)接收到这个重传的FIN+ACK报文段。然后,客户端会重传一次确认,重新启动2MSL计时器。最终,客户端和服务器都能够正常进入CLOSED状态。
  1. 为了防止已失效的连接请求报文段出现在当前连接中,客户端在发送完最后一个ACK报文段后,经过2MSL的时间,可以确保本连接持续的时间内所产生的所有报文段都已经从网络中消失。这样可以避免下一个连接中出现旧的连接请求报文段。

为什么等待的时间是2MSL呢?

MSL代表最大报文生存时间(Maximum Segment Lifetime),它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

TIME_WAIT等待2倍的MSL的合理解释是:在网络中可能存在来自发送方的延迟数据包,当这些发送方的数据包被接收方处理后,接收方会向发送方发送响应。因此,为了确保在当前连接中所有可能的延迟数据包都被处理完毕,需要等待2倍的时间。

weixin-mianznxjsjwllsewswztwxxssc-0ad2ab5b-d0e6-4985-bfbe-1d0c8ae25dd2.png

⽐如如果被动关闭⽅没有收到断开连接的最后的 ACK 报⽂,就会触发超时重发 Fin 报⽂,另⼀⽅接收到 FIN 后,会重发 ACK 给被动关闭⽅, ⼀来⼀去正好 2 个 MSL。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题, 计算机网络, 计算机网络面试题