最近写了一个进程,需要通过20个线程循环600个用户获取每一个用户的xx信息,是通过socket连接oracle mdb服务器获取的,但是在本机windows上测试发现大量的TIME_WAIT状态,按照网上的说法,调了注册表的参数,但是无济于事,Socket.setReuseAddress方法也是没有效果,最后放弃了,在测试环境的unix上也是一样,但是没有去调节测试环境的参数,最后直接上了生产,生产上的参数应该是设置过的,最后复习了下这个经典的TIME_WAIT状态状态
tcp建立连接需要3个握手,但是关闭连接需要4个握手,关闭连接后主动关闭的一方会处于time_wait状态一段时间,这个是可以设置的,好像windows最少是30s,这个time_wait状态的目的大概有两个
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED
这是tcp关闭连接的client/server直接的数据交互过程
还有一种close_wait
在客户端主动关闭时,服务器端也要被动关闭(服务器端也要主动调用closesocket),如果服务器端不被动关闭,客户端就收不到服务器端发来 的FIN,就一直在FIN_WAIT_2了,而此时服务器端只收到客户端发来的FIN(自己只向客户端发了ACK,没有向客户端发FIN),也一直停留在 CLOSE_WAIT
出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。
解决方法
基本的思想就是要检测出对方已经关闭的socket,然后关闭它。
可以参考tomcat server 源码如何检测client 关闭了socket,server端的socket可以循环的read,一旦出现timeout异常就可以关闭了
相关推荐
近期服务器出现大量time_wait的TCP连接造成服务器连接数过多而最终导致tomcat假死状态。连接服务器查看连接数的时候提示如下。 [root@test apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a...
是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢? 有没有什么情况使主动关闭的socket直接进入CLOSED状态呢? 主动关闭的一方在发送最后一个 ack 后 就会进入 TIME_WAIT 状态 停留2MSL(max segment life...
详细描述TCP的各个状态,初学者可以快速理解掌握tcp状态图
LINUX 大量TIME_WAIT状态的连接解决方法
tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为“长连接”和“短...长短连接的优点和缺点这里就不详细展开了,有心的同学直接去google查询,本文主要关注如何解决tcp短连接的TIME_WAIT问题。
摘要视图订阅01.02.03.04.05.06.162149次第9644名99篇1篇0篇30条【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导
tcp连接出现close_wait状态?
windows 2008 R2解决socket连接不释放补丁包_time-wait过多注册表修改, Windows time_wait过多解决办法解决办法: 修改注册表中的tcpip的TIMEWAIT回收时间属性值,需要重启后生效 在HKEY_LOCAL_MACHINE\SYSTEM...
如果大量的 Time_wait ...使用 TCP Keepalive:TCP Keepalive 可以在服务器端和客户端之间建立持久连接,避免连接断开后导致的 TIME_WAIT 状态。 使用传输层网关:传输层网关可以代替服务器端和客户端之间的直接连接,
NULL 博文链接:https://bert82503.iteye.com/blog/2147899
linux c 网络编程 测试tcp连接的TIME_WAIT状态 非常适合于初学者
关于系统端口出现CLOSE_WAIT状态的解决方案,讲解明确清晰,值得参考
netstat显示 TIME_WAIT 的原因及解决办法 netstat显示TCP连接进入TIME_WAIT状态的原因及解决办法
tcp几种状态和time_wait过高处理
3.3 timestack数据包-Wireshark3.4 内核协议栈相关主要源码Time_wait状态生成及快速回收相关代码:开启timestamps引起的丢
对于服务器挂起中的CLOSE_WAIT & FIN_WAIT2 解决方案。
1 检测web服务器的链接数量及状态: netstat -ant|awk '{print $5 \t $6}'|grep ::ffff:|sed -e 's/::ffff://' -e 's/:[0-9]*//' |sort|uniq -c| sort -rn|head -10 结果: 122 125.162.71.199 TIME_WAIT 99 79.119...
简单的纯正TCP客户端程序,配置好TCP服务端的IP地址和端口号,即可按照纯正的TCP模式建立连接。我测试的时候用的是TCP串口调试助手,模拟TCP服务端
VC++编写的TCP连接通信程序,含客户端和服务端