1.time_wait状态是什么java
2.为何会有time_wait状态网络
3.哪一方会有time_wait状态socket
4.怎样避免time_wait状态占用资源tcp
通讯双方创建TCP链接后,主动关闭链接的一方就会进入TIME_WAIT状态。操作系统
客户端主动关闭链接时,会发送最后一个ack后,而后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。 server
1)可靠地实现TCP全双工链接的终止进程
TCP协议在关闭链接的四次握手过程当中,最终的ACK是由主动关闭链接的一端(后面统称A端)发出的,若是这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,所以A端必须维护状态信息(TIME_WAIT)容许它重发最终的ACK。若是A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。图片
于是,要实现TCP全双工链接的正常终止,必须处理终止过程当中四个分节任何一个分节的丢失状况,主动关闭链接的A端必须维持TIME_WAIT状态 。ip
2)容许老的重复分节在网络中消逝资源
TCP分节可能因为路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引发问题。在关闭“前一个链接”以后,立刻又从新创建起一个相同的IP和端口之间的“新链接”,“前一个链接”的迷途重复分组在“前一个链接”终止后到达,而被“新链接”收到了。为了不这个状况,TCP协议不容许处于TIME_WAIT状态的链接启动一个新的可用链接,由于TIME_WAIT状态持续2MSL,就能够保证当成功创建一个新TCP链接的时候,来自旧链接重复分组已经在网络中消逝。
MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。
TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟。Windows操做系统就是4分钟。
假设是client,咱们通常不用操心,因为client通常选用暂时port。再次建立链接会新分配一个port。
除非指定client使用某port,只是通常不需要这么作。
假设是server主动关闭链接后异常终止。则因为它老是使用用一个知名serverport号,因此链接的time_wait状态将致使它不能从新启动。只是咱们可以经过socket的选项SO_REUSEADDR来强制进程立刻使用处于time_wait状态的链接占用的port。 经过socksetopt设置后,即便sock处于time_wait状态,与之绑定的socket地址也可以立刻被重用。
此外也可以经过改动内核參数/proc/sys/net/ipv4/tcp_tw/recycle来高速回收被关闭的socket,从而是tcp链接根本不进入time_wait状态,进而赞成应用程序立刻重用本地的socket地址。