1 谁先主动关闭tcp连接,谁将进入Time_wait状态。
2 Time_wait状态是在等最后的ack,如果没有最后的ack。本端不清楚连接状态,没有办法正常释放socket,比如没有等到ack,就会重发FIN,对端就会回RST,这样本端解释为错误,无法正常释放socket。
3 TIME WAIT允许老的重复网络分节在网络中消失,避免老的分节在新的连接中出现。
4 客户端大量time wait可以通过端口复用解决。
5 服务端如何解决呢?(1 最好打开timestamp,2 打开SO_LINGER选项,对端close的时候,直接RST,不进入TIMEWAIT状态)
如果服务端出现大量time wait,虽然只占用一个端口,但是4元组不一定能被重复使用,这样客户端端口复用了也不一定能连上。
当新到来的连接syn的seq小于之前的,会被忽略,只有当seq大于之前的才会被接受。
具体我们读一下内核这一块的代码
tcp_timewait_state_process 函数
上面是被动关闭tcp的处理情况,这种是对端关闭了自己,自己回了ACK,但是还没有发FIN的处理。
下面我们看看真实的TIME WAIT处理逻辑



