为什么第四次握手要等待2MSL后客户端才进入CLOSED状态?
MSL(Max Segment Lifetime):最长报文段寿命
- 报文最长存活时间就是1MSL,服务端在第三次挥手后也会等待2MSL时间,为的就是怕第四次挥手的ACK确认报文丢失。
- 因为若不等待2MSL客户端就立即进入CLOSED,有可能ACK包丢失从而导致服务端一直处于LAST_ACK状态,此时即使服务端再怎么重发也没用了,因为客户端已经进入CLOSED状态了。
- 所以客户端发送ACK包后等待2MSL,即假设发ACK包要1MSL,若下一个1MSL服务器没用重发FIN+ACK包就表示ACK包成功发给服务端。因为上面也提到第三次挥手即服务端发FIN+ACK后也会等待2MSL,超时就会重发,即发送FIN+ACK算1MSL,接下来就是等客户端发的ACK,若超过1MSL,这个ACK还没发过来就说明它丢失了,所以就重发续上。
- 从而保证了这个ACK服务端能可靠地收到。