面试题-计网:四次挥手而不是三次?为什么`TIME_WAIT`状态需要经历`2MSL`才能转换到`CLOSE`状态?

452 阅读1分钟

为什么挥手要四次,而握手要三次?

  • 在TCP建立连接时,有三次握手,第一次握手SYN=1时发起连接的同步位;第二次握手时,SYN=1和ACK=1同时被发送,也就是对上一次收到的连接请求报文段的确认这一次的连接请求同时发送,也就是请求和确认在同一份报文中都有体现。

  • 但是第二次挥手,确认位ACK=1和终止位FIN=1没有一起发送,只发送了对第一次挥手的请求确认报文。因为服务器的数据可能没有发送完,所以需要在数据发送完后,再一次发送TCP连接释放请求。然后彻底释放连接。不能把第二次和第三次整合在一起。

    不能把第四次挥手去掉,如果第三次挥手报文丢失,没有回应。超时重传没办法开,没办法验证对方收到了该条报文。

为什么TIME_WAIT状态需要经历2MSL才能转换到CLOSE状态?

  • 如果第四次挥手丢失了,将导致第三次握手,也就是服务器的连接释放报文段的超时重传。但是如果这时候客户端已经关闭了,就接受不到了,服务器就会不断地重传,一直处于最后确认状态。
  • 另外,TCP客户进程发送完最后一个TCP确认报文段后,再经过2MSL时间,就可以把本次连接所产生的所以报文段都从网络中消失,防止下一个新的TCP连接中出现旧的报文段(这里的意思是有旧的报文段在网络中延误了吗)。