FIN_WAIT_2状态解释

关于网络设备的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 

一、出现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 
二、为何发生 




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。 

三、如何解决 
为 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); html

相关文章
相关标签/搜索