`

网络的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

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网络连接无法释放问题解决

    1. CLOSE_WAIT状态的定义和产生原因 2. CLOSE_WAIT状态的解决方法 3. TCP连接的结束流程 4. 使用netstat -na命令查看TCP连接状态 5. 编程的重要性在于确保正确关闭连接 延伸阅读: * CLOSE_WAIT状态的详细解释 * ...

    CLOSE_WAIT错误详解

    因此,理解和正确处理CLOSE_WAIT状态对于维持稳定、高效的网络服务至关重要。开发者应当重视这个问题,通过代码优化和系统配置调整来预防和解决CLOSE_WAIT错误。在遇到此类问题时,分析日志、排查代码、调整系统参数...

    close_wait_0306 close_wait_0306 close_wait_0306 close_wait_0306

    1. 调整TCP连接超时设置:增加TIME_WAIT和CLOSE_WAIT状态的超时时间,允许服务器有更多时间处理剩余的数据。 2. 优化应用程序:确保程序在完成数据传输后立即关闭连接。 3. 监控和限制并发连接:设置上限以防止过多...

    nginx+php产生大量TIME_WAIT连接解决办法1

    在IT行业中,网络服务的稳定性是至关重要的,尤其是对于使用Nginx和PHP-FPM搭建的Web服务器。当服务器出现大量TIME_WAIT连接...同时,定期检查和分析网络连接状态,及时发现和解决问题,也是维护服务器稳定运行的关键。

    四次挥手中收到乱序的FIN包如何处理542 - 557

    客户端和服务器之间的 TCP 连接,在关闭连接时,需要经历四个阶段:FIN_WAIT_1、CLOSE_WAIT、FIN_WAIT_2 和 TIME_WAIT。其中,FIN_WAIT_2 状态是指客户端已经发送了 FIN 报文,并等待服务器的确认响应。 现在,假设...

    Wireshark分析TCP连接断开过程分析与总结.docx

    3. FIN_WAIT_2 状态:当对方回应 ACK 报文后,则主动断开连接方(客户端)进入到 FIN_WAIT_2 状态。 4. LAST_ACK 状态:被动方关闭主动方的连接,发送一个 FIN 给主动方, 被动方(服务器端)进入LAST_ACK 状态。 5....

    TCP_SYNC基础

    如果对方在第三次握手的时候出问题,例如发 FIN 包的时候,不知道什么原因丢了这个包,客户端会一直处在 FIN_WAIT_2 状态,服务器端则处在 CLOSE_WAIT 状态。如果这种情况持续很长时间,系统可能会崩溃。 问题分析 ...

    Close_Wait问题相关资料

    当服务器接收到客户端的FIN(结束)标志,它会进入Close_Wait状态,表示服务器已经接收到了客户端想要关闭连接的请求,但服务器自己还有数据需要发送。这个问题在高并发服务器或长时间运行的服务中尤为常见,可能会...

    状态机的使用

    例如,在TCP连接中,我们可以有以下几种状态:CLOSED、LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK和TIME_WAIT。 1. **CLOSED**: 这是所有TCP连接的初始...

    netstat查看linux服务器网络连接状态.docx

    "netstat 命令在 Linux 服务器网络连接状态查看中的应用" Netstat 命令是一个功能强大且广泛使用的...Netstat 命令是一个功能强大且实用的网络命令行工具,能够帮助系统管理员快速了解和分析服务器的网络连接状态。

    10如何提升TCP四次挥手的性能?1

    3. `tcp_fin_timeout`:控制FIN_WAIT2和TIME_WAIT状态的超时时间。 4. `tcp_orphan_retries`:控制孤儿连接的重试次数,不只对孤儿连接有效,也可能影响非孤儿连接。 需要注意的是,错误配置这些参数可能会导致性能...

    TCP状态机详细描述

    - 主动关闭方接收到ACK报文段后,状态变为`FIN_WAIT_2`。 - 被动关闭方接收到FIN报文段并发送ACK报文段后,状态变为`CLOSE_WAIT`。 - 被动关闭方发送FIN报文段后,状态变为`LAST_ACK`。 - 被动关闭方接收到ACK报文段...

    计算机网络实践_TCP 的连接与释放_实验七.doc

    在实验中,通过科来网络分析系统捕获的数据包,可以观察到TCP首部的SYN、ACK标志以及序号和确认号的变化,这些字段的变化反映了连接建立的过程。 二、TCP连接释放 TCP连接的释放通常称为四次挥手(Four-Way ...

    tomcat-timewait-closewait.zip

    2. **Close_wait**: 另一方面,当服务器接收到FIN报文段后,它进入Close_wait状态。在此状态下,服务器确认收到关闭请求,但尚未准备好完全关闭连接,因为它还在等待应用层(如Tomcat)告知其可以关闭连接。一旦应用...

    apache time_wait连接数太多问题解决方法

    一般情况下,可以尝试将其设置为较低的时间(如30秒),以加速TIME-WAIT状态的释放过程。 #### 五、实施步骤 1. **编辑配置文件**:使用文本编辑器打开`/etc/sysctl.conf`文件,添加或修改上述内核参数的设置。 ...

    网络游戏-基于LSTM循环神经网络的TCP状态估计方法研究.zip

    TCP状态机由多个状态组成,包括SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、TIME_WAIT等,这些状态之间的转换依赖于特定的网络交互。TCP状态的准确估计有助于优化...

    TCP_IP算法.rar_C++算法_TCP/IP协议_TCP_IP_网络 协议 源码_网络协议

    源码分析可能涉及理解TCP的状态机,如CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、TIME_WAIT等状态及其转换。同时,还会涉及IP头部的解析,以及错误...

    计算机网络基础.docx

    2. **第二次挥手**:服务器收到客户端的FIN报文后,必须发出确认报文ACK(u+1),确认序号为客户端的序列号加1,此时服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。 ``` Server → Client: ACK(u+1) ``` ...

Global site tag (gtag.js) - Google Analytics