一般来说,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状态的时间长度默认为2MSL(Max Segment Lifetime),即最大报文段生存时间的两倍。在大多数情况下,这个值被设置为2分钟,在Windows系统中则默认为4分钟。 当服务器处理大量的短连接请求时,这些连接在...
在TCP正常关闭连接的过程中,主动关闭的一方(发起FIN的一方)会经历FIN_WAIT1、FIN_WAIT2和TIME_WAIT状态,而被动关闭的一方(接收FIN的一方)则会经历CLOSE_WAIT、LAST_ACK和CLOSED状态。Close_Wait状态表示被动...
TIME_WAIT是TCP协议中的一个状态,当一个TCP连接正常关闭后,会进入TIME_WAIT状态,等待一段时间(通常是2MSL,即最大段生命周期的两倍)来确保网络中没有残留的数据包。在这个状态下,端口被占用,不能立即复用,这...
在 TCP/IP 协议中,TIME_WAIT 状态是一种正常的连接状态。当一个 TCP 连接关闭时,服务器端会在 TIME_WAIT 状态下等待一段时间,以确保所有的数据包都已经被客户端收到。在这个状态下,服务器端会等待两个最大段生命...
2. **使用长连接**:减少TCP短连接的使用,尽量维持TCP连接的持久化,以减少TIME_WAIT连接的生成。 3. **延迟关闭连接**:在应用层适当延长连接关闭的时间,让连接在完成更多任务后再进入TIME_WAIT状态。 4. **...
当一个TCP连接主动关闭后,发送端会进入TIME_WAIT状态,等待一段时间(通常称为2MSL,即最大段生存期的两倍)再释放连接。在此期间,任何迟到的数据包都可以被正确识别并处理,避免了新连接与旧连接的混淆。这个状态...
2. TCP/IP协议的设计,为了防止旧连接的延迟数据影响新连接,以及确保TCP连接可靠关闭,会将连接保持在TIME_WAIT状态一段时间,通常是两倍的MSL(最大段生存期)。 过多的TIME_WAIT连接虽然在正常情况下不会占用...
在TCP协议中,主动关闭连接的一方,在发送完对被动方FIN(finishing,结束)请求的ACK(acknowledgement,确认)后,会进入TIME_WAIT状态,并在此状态下停留2倍的MSL(最大分段生存期)时间。这是因为TCP设计者考虑...
同时,TIME_WAIT状态的持续时间设定为两倍的最大报文段寿命(MSL),这有助于确保所有因网络延迟或延迟到达的旧分组在新连接建立前已经被丢弃,从而避免旧数据影响新的连接。 尽管TIME_WAIT状态对于网络通信的稳定...
MSL是TCP片段在网络上可能存活的最长时间,TIME_WAIT状态的2倍MSL设置是为了确保旧的TCP片段在网络中消失。 7. **影响分析**: TIME_WAIT状态虽然有其必要性,但过长的等待时间可能影响服务性能。适当减少TIME_...
TIME_WAIT状态存在的主要原因是确保TCP的可靠性和防止旧数据包的干扰。当TCP连接的一方发送FIN包表示关闭连接后,它进入TIME_WAIT状态。在这个状态下,该方等待足够长的时间(2MSL,即两个最大段生存期)以确保任何...
默认情况下,`time_wait`状态会持续2MSL(最大报文段生存时间),这可能占用了大量socket资源,尤其是在大量短连接的情况下。为了缓解这个问题,可以调整`net.ipv4.tcp_tw_reuse`和`net.ipv4.tcp_tw_recycle`参数: ...
TIME_WAIT状态是TCP连接生命周期中的一个阶段,它在客户端主动关闭连接后出现,服务器端的端口在一段时间内保持此状态,以便处理可能在网络中漂浮的旧数据包。这种状态对于确保连接的可靠关闭至关重要,但过多的TIME...
在TCP协议中,TIME_WAIT状态是TCP连接关闭过程中的一个阶段,主要目的是确保数据已经被对方完全接收,并且防止旧的数据在网络中重新出现,干扰新的连接。在这个状态下,TCP连接并没有立即关闭,而是等待一段时间...
通常情况下,一个连接进入TIME_WAIT状态后,会保持该状态大约2倍的最大段生存时间(2MSL)。 #### 三、TIME_WAIT状态的影响及解决方案 **1. 影响** - **资源占用问题:** 处于TIME_WAIT状态的连接会占用系统的...
TIME_WAIT是TCP连接状态中的一种,当一个TCP连接在主动关闭后,等待一段时间(通常为两倍MSL,即报文段最大生存时间)才真正终止。这个状态是为了确保所有在网络中可能漂浮的数据段能被正确处理,防止旧的、重复的...
当一个TCP连接被关闭时,它不会立即释放资源,而是会进入`TIME_WAIT`状态并持续一段时间(通常是2MSL,即最大段生存时间的两倍)。这样做的目的是确保网络中的所有数据包都已经到达目的地,避免旧的数据包在以后被误...
9. **TIME_WAIT**: 发送最后的ACK包后,套接字进入TIME_WAIT状态,等待2MSL(最大分段生存时间)以确保网络中没有丢失的ACK。这是为了防止旧的数据包在网络中重新出现,导致新连接的混淆。 10. **CLOSE_WAIT**: ...
但在实际高并发环境中,由于每个连接在关闭后需要保持2MSL的时间处于`TIME_WAIT`状态,这可能导致端口资源快速耗尽。 2. **性能瓶颈**:对于服务器而言,大量的`TIME_WAIT`连接可能会占据大量的内存资源,并可能...
- TIME_WAIT状态的2MSL设置是为了等待两个来回的时间,这样即使ACK丢失,重发的FIN也能在2MSL时间内到达客户端并得到响应。 4. **MSL与TTL的区别**: - MSL是报文在网络中能存活的最大时间,而TTL是IP数据报经过...