关于网络设备的FIN_WAIT_2状态解释出处:http://hi.baidu.com/netdemon1981/blog/item/584bfbb2aeb1d4acd9335ad9.html
在HTTP应用中,存在一个问题,SERVER由于某种原因关闭连接,如KEEPALIVE的超时,这样,作为主动关闭的SERVER一方就会进入 FIN_WAIT2状态,但TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不象TIME_WAIT状态),所以如果CLIENT不关闭,这个FIN_WAIT_2状态将保持到系统重新启动,越来越多的FIN_WAIT_2状态会致使内核crash。
产生原因:
1。常连接并且当连接一直处于IDLE状态导致SERVER CLOSE时,CLIENT编程缺陷,没有向SERVER 发出FIN和ACK包
2。APACHE1.1和APACHE1.2增加了linger_close()函数,前面的帖子有介绍,这个函数可能引起了这个问题(为什么我也不清楚)
解决办法:
1。对FIN_WAIT_2状态增加超时机制,这个特性在协议里没有体现,但在一些OS中已经实现
如:LINUX、SOLARIS、FREEBSD、HP-UNIX、IRIX等
2。不要用linger_close()编译
3。用SO_LINGER代替,这个在某些系统中还能很好地处理
4。增加用于存储网络连接状态的内存mbuf,以防止内核crash
5。DISABLE KEEPALIVE
TCP FIN_WAIT_2状态问题分析
出处:http://hi.baidu.com/huochai2020/item/eb3fc2530fb52bd6d48bace5
1、出现fin_wait_2一般为客户端,如果为服务端出现,则表明是服务端主动发起的断开。
C:\Documents and Settings\Administrator>netstat -an|findstr 10.208.8.2:
TCP 10.88.2.26:9002 10.208.8.2:1040 FIN_WAIT_2
TCP 10.88.2.26:9002 10.208.8.2:1048 FIN_WAIT_2
TCP 10.88.2.26:9002 10.208.8.2:1051 FIN_WAIT_2
TCP 10.88.2.26:9002 10.208.8.2:1052 FIN_WAIT_2
TCP 10.88.2.26:9002 10.208.8.2:1056 FIN_WAIT_2
TCP 10.88.2.26:9002 10.208.8.2:1058 FIN_WAIT_2 #netstat -an|grep 10.116.50.30
tcp 0 0 192.168.129.44.64306 10.116.50.30.53081 FIN_WAIT_2
tcp 0 0 192.168.129.44.63611 10.116.50.30.57966 FIN_WAIT_2
tcp 0 0 192.168.129.44.57835 10.116.50.30.49188 FIN_WAIT_2
tcp 0 0 192.168.129.44.57502 10.116.50.30.52615 ESTABLISHED
2、为什么发生
a.客户端状态迁移(主动结束连接)CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSEDb.服务器状态迁移CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED 有缺陷的客户端与持久连接
有一些客户端在处理持久连接(aka keepalives)时存在问题。当连接空闲下来服务器关闭连接时(基于KeepAliveTimeout指令), 客户端的程序编制使它不发送FIN和ACK回服务器。这样就意味着这个连接 将停留在FIN_WAIT_2状态直到以下之一发生:
客户端为同一个或者不同的站点打开新的连接,这样会使它在该个套接字上完全关闭以前的连接。
用户退出客户端程序,这样在一些(也许是大多数?)客户端上会使操作系统完全关闭连接。
FIN_WAIT_2超时,在那些具有FIN_WAIT_2状态超时设置的服务器上。
如果你够幸运,这样意味着那些有缺陷的客户端会完全关闭连接并释放你服务器的资源。 然而,有一些情况下套接字永远不会完全关闭,比如一个拨号客户端在关闭客户端程序之前从ISP断开。 此外,有的客户端有可能空置好几天不创建新连接,并且这样在好几天里保持着套接字的有效即使已经不再使用。 这是浏览器或者操作系统的TCP实现的Bug。
3、如何解决
为 FIN_WAIT_2 增加 超时机制
windows:
开始->运行->输入regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在详细信息窗格中双击 TCPFinWait2Delay ,然后从 30 到 300 中输入一个值。
请注意 如果不存在 TCPFinWait2Delay 值,必须为 REG _ DWORD 注册表值来创建它。 注册表该值控制 TCP 连接之前等待的秒数它被强制关闭, 关闭 (s,SD_SEND) 函数调用之后。 在默认值为 240 秒。 此值范围是 30 到 300。 必须手动创建此注册表值。 否则,使用默认值。
HP-UNIX:
#ndd -set /dev/tcp tcp_fin_wait_2_timeout 60000 (1分钟)
执行上述命令,重起系统后将失效,如果需要一致起作用,则修改下列文件:/etc/rc.config.d/nddconf
设置参数tcp_fin_wait_2_timeout值。
禁止KeepAlive
Apache:编辑你的httpd.conf并把"KeepAlive On"改为"KeepAlive Off"。
使用linger:
linger lig;
lig.l_onoff=1;
lig.l_linger=0;
int ilen=sizeof(linger);
setsockopt(Socket,SOL_SOCKET,SO_LINGER,(char*)&lig,ilen);
分享到:
相关推荐
对于服务器挂起中的CLOSE_WAIT & FIN_WAIT2 解决方案。
错误是,如果客户端从不发送 FIN,jetty 将保持连接 FIN_WAIT2 状态。 因此,一段时间后,jetty 会导致崩溃,文件异常过多。 该项目仅包含测试。 不过想解决这个问题的人可以将jetty升级到7.6,好像已经解决了这个...
FIN_WAIT2 6 ESTABLISHED 133 很明显可以看出是请求太多频繁,主要由于后端服务器之间是通过rest请求相互调用的,而java服务器回收tcp线程速度比较慢,虽然已经有显性的关闭连接了,但是实际在调 用的时候连接回收...
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间 这个是TCP/IP必不可少的,也就是“解决”不了的。 也就是TCP/IP设计者本来是这么设计的 主要有两个原因 1。防止上一次连接中的包,迷路后重新出现,...
1731507 EPIC Updated test case for FIN_LOC_CI_16 business function
导致客户TCP发送一个FIN给服务器,服务器则以一个ACK响应,此时服务器处于CLOSE_WAIT状态,客户端处于FIN_WAIT_2状态。服务器接收到FIN,子进程中止。子进程中止内核关闭所有子进程打开的描述符导致服务器向客户端...
tcp fin扫描源代码,在IP包的基础上构建fin 包。
ERP(I)_FIN_操作手册_报表平台
fin_data_v1.exe
Fact_FIN_OrderQTY.sql
BHG_FIN_培训讲义_库存管理_V1.0 ;ebs业务相关知识,对ebs顾问知识积累有很大帮助;
2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。 3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的...
ERP(I)_FIN_操作手册_报表平台_XXXX1231_V0.docx
tcp三次握手四次挥手 TCP(传输控制协议)的三次握手和四次挥手是用于建立连接和释放连接的重要过程。 三次握手的过程如下: ...此时,服务器进入CLOSE_WAIT状态,而客户端进入FIN_WAIT_2状态。 3. 服务器在处理完
ERP(I)_FIN_操作手册_财务管理系统集成_XXXX1121_V30.doc
财务系统功能介绍_FIN_XXXX0526.pptx
为油藏数值模拟做准备的PVT数据形式,为数值模拟做前期准备
油藏数值模拟网格描述有关文件源码为油藏数值模拟做准备
ERP(I)_FIN_操作手册_财务管理系统集成操作手册_XXXX1121_V0.doc