TCP IP之TIME_WAIT状态

来源:互联网 发布:适合编程的笔记本2017 编辑:程序博客网 时间:2024/05/23 13:03

     前段时间碰到一个服务器挂死问题,原因是由于服务器上的TCP连接数过多导致程序无法新建SOCKET连接,最后该问题解决了。中间在定位问题的时候查看但是操作系统上的TCP连接数,有几百个连接处于TIME_WAIT状态,这个TIME_WAIT到底是表示什么意思呢?

    于是重新查看了下TCP协议,终于理清了,这里记录一下。下面的是TCP IP的状态变迁图:

   

       从中可以看得出,TCP在建议一个连接后到处于TIME_WAIT状态有三种情况,但无论是那种情况一定是发起了主动关闭,并且已经收到了对方的FIN,这时候进入了TIME_WAIT 状态。TIME_WAIT状态的时间是2倍的MSL(最大生存时间),在TIME_WAIT状态TCP连接实际上已经断掉,但是该插口又不能被新的连接实例使用。这种情况一般都是程序中建立了大量的短连接,而操作系统中可以使用端口使用做了限制,那么非常容易出现连接数占满的异常(比如java中的java.net.SocketException No buffer space available (maximum connections reached?异常)。可以通过修改TcpTimedWaitDelay的值缩短TIME_WAIT状态时间。

       那么为什么需要TIME_WAIT状态呢?一个重要的原因就是防止回给对方FIN的ACK丢失。由于服务端并不会对该ACK做确认,因此只能等待一段时间寄希望于服务端收到,如果服务端没有收到对其FIN的确认会继续发一个FIN,这样客户端还有机会继续回一个ACK。另外一个原因是防止上一次连接中迟到的数据包影响新的连接,而在TIME_WAIT状态中这些包会被丢弃。

 

原创粉丝点击