`
dengqsintyt
  • 浏览: 291618 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

服务器TIME_WAIT和CLOSE_WAIT区别及解决方案

 
阅读更多

  系统上线之后,通过如下语句查看服务器时,发现有不少TIME_WAIT和CLOSE_WAIT。

 

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

 

打印显示如下:

TIME_WAIT 297
ESTABLISHED 53
CLOSE_WAIT 5

 

     TIME_WAIT:表示主动关闭,通过优化系统内核参数可容易解决。

     CLOSE_WAIT:表示被动关闭,需要从程序本身出发。

     ESTABLISHED:表示正在通信

 

    通过上网了解,总结如下:

 

一、TIME_WAIT(通过优化系统内核参数可容易解决)

       TIME_WAIT是主动关闭连接的一方保持的状态,对于服务器来说它本身就是“客户端”,在完成一个爬取任务之后,它就会发起主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。为什么要这么做?明明就已经主动关闭连接了为啥还要保持资源一段时间呢?这个是TCP/IP的设计者规定的,主要出于以下两个方面的考虑:

        1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)

        2.可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

        解决方案很简单,通过修改/etc/sysctl.conf文件,服务器能够快速回收和重用那些TIME_WAIT的资源  

        

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭  
net.ipv4.tcp_syncookies = 1  
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭  
net.ipv4.tcp_tw_reuse = 1  
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭  
net.ipv4.tcp_tw_recycle = 1
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间  
net.ipv4.tcp_fin_timeout=30

 

        生效,如下命令        

/sbin/sysctl -p

           

 

 

二、CLOSE_WAIT(需要从程序本身出发)

       TCP状态转移要点

       TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源.

        客户端TCP状态迁移:        

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
     
         服务器TCP状态迁移:      
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

       当客户端开始连接时,服务器还处于LISTENING,客户端发一个SYN包后,他就处于SYN_SENT状态,服务器就处于SYS收到状态,然后互相确认进入连接状态ESTABLISHED。

 

       TIME_WAIT状态可以通过优化服务器参数得到解决,因为发生TIME_WAIT的情况是服务器自己可控的,要么就是对方连接的异常,要么就是自己没有迅速回收资源,总之不是由于自己程序错误导致的。

        但是CLOSE_WAIT就不一样了,如果一直保持在CLOSE_WAIT状态,那么只有一种情况,就是在对方关闭连接之后服务器程序自己没有进一步发出ack信号。换句话说,就是在对方连接关闭之后,程序里没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直被程序占着。个人觉得这种情况,通过服务器内核参数也没办法解决,服务器对于程序抢占的资源没有主动回收的权利,除非终止程序运行。

       什么情况下,连接处于CLOSE_WAIT状态呢?

       答案一:在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。

       答案二:出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

        

 

分享到:
评论

相关推荐

    CLOSE_WAIT网络连接无法释放问题解决

    解决CLOSE_WAIT问题的关键在于确保服务器端正确关闭连接。在服务器端,需要在适当的时候调用close()方法,以释放连接资源。在这个例子中,服务器端没有正确关闭连接,导致了CLOSE_WAIT状态的出现。 使用netstat -na...

    系统调优,你所不知道的TIME_WAIT和CLOSE_WAIT1

    系统调优时,理解和处理TIME_WAIT和CLOSE_WAIT状态是关键。TIME_WAIT是为了保证TCP的可靠性,但过多的TIME_WAIT会占用资源。CLOSE_WAIT则可能指示应用程序或系统的问题。解决这些问题需要深入理解TCP连接生命周期,...

    close_wait_0306 close_wait_0306 close_wait_0306 close_wait_0306

    通过分析这些文件,我们可以找到触发`CLOSE_WAIT`状态的具体情况,以及可能的解决方案。 解决`CLOSE_WAIT`问题的方法可能包括: 1. 调整TCP连接超时设置:增加TIME_WAIT和CLOSE_WAIT状态的超时时间,允许服务器有更...

    tomcat-timewait-closewait.zip

    标题 "tomcat-timewait-closewait.zip" 暗示了这个压缩包可能包含与Tomcat服务器在处理TCP连接时遇到的“Time_wait”和“Close_wait”状态相关的问题和解决方案。这两个术语是TCP/IP协议栈中的关键概念,尤其在高...

    [Socket]CLOSEWAIT.rar_Help!

    2. **超时设置**:设置合理的TIME_WAIT和CLOSE_WAIT超时时间,避免资源长时间占用。 3. **异常处理**:完善服务器端的异常处理机制,确保在出现异常时能正确关闭连接。 4. **资源管理**:使用连接池可以有效管理...

    linux_example

    6. **TCP状态机**:理解TCP连接的不同状态,如CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK和TIME_WAIT。 7. **性能优化**:如何调整内核参数以优化...

    服务器调优──提高并发量.docx

    解决方案之一是尽量将类打包成JAR文件,因为一个JAR包只占用一个文件句柄,而不是每个类占用一个。此外,确保正确关闭Socket连接,避免因未执行`close()`而导致文件句柄无法释放。 针对Linux系统,可以通过修改内核...

    php用法curl并发削减后端访问时间的方法分析_.docx

    #### 解决方案:cURL并发请求 cURL是一个非常强大的工具库,用于通过URL传输数据。PHP内置支持cURL,因此可以轻松地在PHP脚本中使用它。下面介绍如何通过cURL并发请求来减少后端访问时间。 ##### 1. 传统cURL访问...

    Linux_套接字编程中的_5_个隐患.pdf

    **解决方案**:为了避免`TIME_WAIT`状态导致的端口不可用问题,可以使用`SO_REUSEADDR`选项来设置套接字。这样做的好处是可以让套接字即使在`TIME_WAIT`状态下也能被立即重用。具体做法如下: ```c int sock; ...

    计算机网络面试问题集锦1

    - **步骤二**:服务器选择一种加密方案和HASH算法,并发送数字证书,其中包含公钥、证书颁发机构信息等。 - **步骤三**:客户端验证证书,生成随机密码,用服务器的公钥加密,并计算握手消息的HASH值,一并发送给...

    ECS 运维指南之Linux系统诊断.pdf

    ECS 运维指南之 Linux 系统诊断 本文档旨在帮助用户了解 ECS ...本文档旨在帮助用户了解 ECS 系统问题诊断的方法,并提供了一些常见问题的排查点和解决方案,以帮助用户更好地服务和自助了解 ECS 系统问题诊断的方法。

    Floodlight TCP连接异常原因分析

    例如,客户端从CLOSED到TIME_WAIT,服务器从CLOSED到CLOSED,每个状态都有其特定的含义和行为。 总之,Floodlight TCP连接异常,特别是“CLOSE-WAIT”状态,通常是由于连接管理不当、资源限制、网络问题或代码缺陷...

    TCP编程进阶与网络通信过程

    ### TCP编程进阶与网络通信过程 #### 一、TCP编程进阶 ##### 1.1 TCP的三次握手与四次挥手 ...通过多进程实现并发服务器是一种常见的方式,尽管它可能不是最高效的解决方案,但对于初学者来说是一个很好的学习起点。

    Linux网络编程之IO复用循环服务器

    ### Linux网络编程之IO复用循环服务器 ...对于需要处理大量并发请求的应用场景来说,这是一种非常实用且高效的解决方案。通过上述分析,我们可以更深入地理解I/O复用循环服务器的工作原理及其实际应用价值。

    Linux系统故障排查手册【云主机ECS版】.pdf

    在Linux主机网络问题方面,重点讲解了ifdown和ifup命令丢失的处理方法,TIME_WAIT和CLOSE_WAIT状态的讨论总结,以及网络抖动的经典案例分析。 为了提供更详细的排查指导,手册还详细讲解了grub.conf文件被清空的...

    超经典运维指南之Linux系统诊断.pdf

    3. **TCP状态问题**:TIME_WAIT和CLOSE_WAIT状态在网络通信中较为常见,可能影响网络性能,需要妥善处理。 4. **网络抖动问题**:网络抖动可能是由多种因素造成的,包括硬件问题、网络配置问题或系统配置问题。对此...

    linux socket编程笔记.rar

    - 常见问题:例如端口复用、半关闭状态、TIME_WAIT状态等,并给出解决方案。 通过对这些笔记的学习,开发者可以掌握Linux环境下进行网络编程的基本技能,从而开发出能够进行高效、稳定网络通信的应用程序。

Global site tag (gtag.js) - Google Analytics