TCP链接的Client和Server拆除链接时,主动close链接的一方会出现该状态,原因有二(以Client主动close为例):
1,如果没有TIME_WAIT状态,Client主动关闭时,Client发送ACK后即关闭本端链接。如果ACK传输过程中丢失的话,Server会重发FIN,Client收到该FIN由于本端链接已经关闭,会发送RST给Server,导致Server端关闭异常。
如果ACK一直丢失,Server端一直重发FIN,Client在2*MSL时间内一直发送ACK,直到超时后关闭链接,再收到FIN,发送RST,Server端收到RST异常关闭链接。
2,Client主动拆链后,马上以相同的四元组(local ip,local port,remote ip,remote port)和Server建链后,Server如果收到已经拆链的老链接的报文,会认为是新建链的报文,但是实际上seq number等都是错误异常的,该报文是错乱的,可能引起Server端的未知异常。增加TIME_WAIT状态后,Client进入TIME_WAIT时间后2MSL时间内,local port是处于占用状态的,不能再建立新的链接,避免了上述问题。实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
参考:
http://blog.csdn.net/slvher/article/details/8941873
http://blog.51cto.com/wushank/1135060