算是面试中比较常问到的题,看过许多版本的解答,但对这个概念一直模模糊糊,今天看了游双的《Linux高性能服务器编程》,里面的解释让我豁然开朗。下图是TCP连接的三次握手 + 四次挥手:
首先 TIME_WAIT 状态存在的原因有两点:
-
可靠地终止 TCP 连接;
解释:假设第四次挥手时客户端发送的报文段 7 丢失,那么服务器将重发结束报文段 6 ,因此客户端需要停留在某个状态(TIME_WAIT)以处理重复收到的结束报文段。否则,客户端将以复位报文段来回应服务器,服务器则认为这是一个错误,因为它期望的是一个像 TCP 报文段 7 那样的确认报文。
-
保证让迟来的TCP报文段有足够的时间被识别并丢弃。
解释:在 Linux 系统中,一个 TCP 端口不能被同时打开多次(两次以上)。当一个 TCP 连接处于 TIME_WAIT 状态时,我们无法立即用该端口建立一个新连接。反过来思考,若不存在 TIME_WAIT 状态,那么我们就能立即用该端口建立一个新连接(与上一个连接有相同的 IP 地址及端口号),则该新连接有可能会接收到属于上一个连接的迟来的 TCP 报文段,这显然是不应该发生的。
最后,TIME_WAIT 状态为什么要持续 2MSL ?
解释:因为 TCP 报文段的最大生存时间是 MSL ,所以坚持 2MSL 时间的 TIME_WAIT 状态能够确保网络上两个传输方向上尚未被接收到的、迟到的 TCP 报文段都已经消失(被中转路由器丢弃)。因此,一个新的连接可以在该端口安全地建立,而绝对不收接收到属于上一个连接的报文段,这就是 TIME_WAIT 状态要持续 2MSL 的原因。
这个在TCP/IP详解卷一中也讲过哦
原来如此,那本巨著还没拜读过😂多谢提醒