MSL(maximun segment Lifetime): 报文的最大生存时间, 是任何报文在网络上生存的最大时间。
如果client直接closed, 那么由于IP协议的不可靠性或者是其它的网络原因, 导致Server没有收到客户端最后回复的ACK。那么服务器就会在超时之后继续发送FIN,此时由于客户端已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST(表示复位、用来异常的关闭连接)而不是ACK。 Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次受到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
如果client直接closed,然后又向server发起了一个新连接,我们不能保证这个新连接和刚关闭的连接的端口号是不同的。假设新连接和已经关闭的老端口号是一样的,如果前一次滞留的某些数据仍然在网络中,这些延迟数据会在新连接建立后到达Server,所以socket就认为那个延迟的数据是属于新连接的,数据包就会发生混淆。所以client要在TIME_WAIT状态等待2倍的MSL,这样保证本次连接的所有数据都从网络中消失。