TCP连接中的TIME_WAIT状态
2013-04-17 09:11
337 查看
一般来说,tcp正常关闭需要四个包。比如a和b关闭连接,a先 给b发一个fin,b会进行确认ack,然后b也会发出fin,当a接受到这个fin,并发出最后一个ack后,就会处于time_wait状态。这个时 间长短跟操作系统有关,一般会在1-4分钟,也就是两倍的数据包(2msl)最大生存时间。TCP主动关闭方采用TIME_WAIT主要是为了实现终止 TCP全双工连接的可靠性及允许老的重复分节在网络中消逝,等过了2msl(大约1~4分钟)后TIME_WAIT就会消失。TIME_WAIT状态的目 的是为了防止最后a发出的ack丢失,让b处于LAST_ACK超时重发FIN。
所以说,主动发起关闭连接的一方会进入time_wait状态,这个时候,进程所占用的端口号不能被释放。除非在你的程序中用setsockopt设置端口可重用(SOCK_REUSE)的选项,但这不是所有操作系统都支持的。
解决TIME_WAIT的办法主要有以下几种:
1、修改LINGER值,缩短关闭时间;
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt(m_socket,SOL_SOCKET,SO_LINGER,(char *)&lingerStruct,sizeof(lingerStruct));
不过这种办法不是很安全的,不过现在网络都很好啦,不会有问题的。
2、修改注册表;
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:00000005
这个值好像是300秒到30秒之间,改成30秒后你会发现TIME_WAIT很快就会消失了。
3、禁用LINGER;
//如果你使用的是Socket API,可以这样
BOOL bDontLinger=FALSE;
setsockopt(m_socket,SOL_SOCKET,SO_DONTLINGER,(LPCTSTR)&bDontLinger,sizeof(BOOL));
closesocket(s);
//如果你使用的是CAsyncSocket,需要响应的修改,例如禁用LINGER可以这样
BOOL bDontLinger=FALSE;
m_socket->SetSockOpt(SO_DONTLINGER,(const char *)&bDontLinger,sizeof(bDontLinger),SOL_SOCKET);
m_socket->Close();
4、客户端可以不BIND(),这样,即使断开连接后再次连接,SOCKET将使用不同的端口(1025-5000), 等几分钟后,原有的端口就会自动关闭。
所以说,主动发起关闭连接的一方会进入time_wait状态,这个时候,进程所占用的端口号不能被释放。除非在你的程序中用setsockopt设置端口可重用(SOCK_REUSE)的选项,但这不是所有操作系统都支持的。
解决TIME_WAIT的办法主要有以下几种:
1、修改LINGER值,缩短关闭时间;
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt(m_socket,SOL_SOCKET,SO_LINGER,(char *)&lingerStruct,sizeof(lingerStruct));
不过这种办法不是很安全的,不过现在网络都很好啦,不会有问题的。
2、修改注册表;
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:00000005
这个值好像是300秒到30秒之间,改成30秒后你会发现TIME_WAIT很快就会消失了。
3、禁用LINGER;
//如果你使用的是Socket API,可以这样
BOOL bDontLinger=FALSE;
setsockopt(m_socket,SOL_SOCKET,SO_DONTLINGER,(LPCTSTR)&bDontLinger,sizeof(BOOL));
closesocket(s);
//如果你使用的是CAsyncSocket,需要响应的修改,例如禁用LINGER可以这样
BOOL bDontLinger=FALSE;
m_socket->SetSockOpt(SO_DONTLINGER,(const char *)&bDontLinger,sizeof(bDontLinger),SOL_SOCKET);
m_socket->Close();
4、客户端可以不BIND(),这样,即使断开连接后再次连接,SOCKET将使用不同的端口(1025-5000), 等几分钟后,原有的端口就会自动关闭。
相关文章推荐
- 转--一个解除TCP连接的TIME_WAIT状态限制的简便方法
- 主动关闭TCP连接的一方为什么要有TIME_WAIT状态
- TCP连接中的TIME_WAIT状态
- 网络编程(25)—— 详解TCPIP断开连接后的Time-wait状态
- 一个解除TCP连接的TIME_WAIT状态限制的简便方法
- netstat下time_wait状态的tcp连接
- TCP/IP TIME_WAIT状态原理(四次握手关闭连接原理)
- 怎样kill掉TCP连接状态是TIME_WAIT的而且找不到PID
- TCP连接终止前的TIME_WAIT状态
- TCP可靠传输及流量控制系列六:TCP连接中的TIME_WAIT状态
- 理解tcp关闭连接中的time_wait状态
- TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT
- Linux系统消除未被及时释放的TIME_WAIT状态的TCP连接
- TCP连接状态:CLOSE_WAIT和TIME_WAIT
- TCP/IP详解--TCP连接中TIME_WAIT状态过多
- [svc]tcp三次握手四次挥手&tcp的11种状态(半连接)&tcp的time-wait
- TCP连接的TIME-WAIT状态
- 唯快不破:TCP/IP详解--TCP连接中TIME_WAIT状态过多
- TCP连接状态详解及TIME_WAIT过多的解决方法
- TCP/IP详解--TCP连接中TIME_WAIT状态过多