tcp连接状态TIME_WAIT和CLOSE_WAIT
常用的三个状态是ESTABLISHED 表示正在通信TIME_WAIT 表示主动关闭CLOSE_WAIT 表示被动关闭。TCP协议规定对于已经建立的连接网络双方要进行四次握手才能成功断开连接如果缺少了其中某个步骤将会使连接处于假死状态连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接所以很有必要保证无用连接完全断开否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中最值得注意的状态有两个CLOSE_WAIT和TIME_WAIT。TIME_WAIT 是主动关闭链接时形成的等待2MSL时间约4分钟。主要是防止最后一个ACK丢失。由于TIME_WAIT 的时间会非常长因此server端应尽量减少主动关闭连接。CLOSE_WAIT 是被动关闭连接是形成的。根据TCP状态机服务器端收到客户端发送的FIN则按照TCP实现发送ACK因此进入CLOSE_WAIT状态。但如果服务器端不执行close()就不能由CLOSE_WAIT迁移到LAST_ACK则系统中会存在很多CLOSE_WAIT状态的连接。此时可能是系统忙于处理读、写操作而未将已收到FIN的连接进行close。此时recv/read已收到FIN的连接socket会返回0。为什么需要 TIME_WAIT 状态client主动断开连接假设server未收到最终的ACKserver将重发FINclient必须维护TCP状态以便可以重发最终的ACK否则会发送RST结果server认为发生错误。TCP实现必须可靠地终止连接的两个方向(全双工关闭)client必须进入 TIME_WAIT 状态因为client可能面 临重发最终ACK的情形。为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL)第一个连接就正常终止了。第二个拥有相同相关五元组的连接出现而第一个连接的重复报文到达干扰了第二个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现所以让TIME_WAIT状态保持时间足够长(2MSL)连接相应方向上的TCP报文要么完全响应完毕要么被 丢弃。建立第二个连接的时候不会混淆。
