[转帖]TIME_WAIT和CLOSE_WAIT的区别

time,wait,close,区别 · 浏览次数 : 0

小编点评

**TIME_WAIT:** 表示主动关闭连接的一方保持的状态,服务器在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。 **CLOSE_WAIT:** 表示被动关闭连接,需要从程序本身出发。 **TIME_WAIT的作用:** 1. **防止上一次连接中的包,迷路后重新出现,影响新连接:** 当服务器收到多个SYN包时,如果某些包被丢弃,会导致连接一直处于SYN_ESTABLISHED状态,无法建立新的连接。 2. **可靠的关闭TCP连接:** 在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin,如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。 **CLOSE_WAIT的状态:** 在被动关闭连接情况下,如果对方关闭连接后,服务器程序没有进一步发出ack信号,就会一直保持在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
        
        但是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,就断开连接。

        转载https://dengqsintyt.iteye.com/blog/2086485

          </article>
          

          与[转帖]TIME_WAIT和CLOSE_WAIT的区别相似的内容:

          [转帖]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

          [转帖]TIME_WAIT和CLOSE_WAIT状态区别

          在服务器的日常维护过程中,会经常用到下面的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 它会显示例如下面的信息: TIME_WAIT 814 CLOSE_WAIT 1 FIN_WAIT1 1 ESTA

          [转帖]高性能网络 | 你所不知道的TIME_WAIT和CLOSE_WAIT

          https://zhuanlan.zhihu.com/p/528747315 你遇到过TIME_WAIT的问题吗? 我相信很多都遇到过这个问题。一旦有用户在喊:网络变慢了。第一件事情就是,netstat -a | grep TIME_WAIT | wc -l 一下。哎呀妈呀,几千个TIME_WAIT

          [转帖]高性能网络 | 你所不知道的 TIME_WAIT 和 CLOSE_WAIT

          高性能网络 | 你所不知道的 TIME_WAIT 和 CLOSE_WAIThttps://my.oschina.net/fdhay/blog/638631 本文是我将最近两篇文章,重新整理成一篇,方便收藏。如果你已经阅读过前两篇,并且已经做了收藏,可以重新收藏本文即可。 你有收藏和整理文章的习惯吗?

          [转帖]关于线上环境CLOSE_WAIT和TIME_WAIT过高

          https://www.cnblogs.com/Bozh/p/3752476.html 运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了。 首先是TIME_WAIT: 理解一

          [转帖]TIME_WAIT连接过多解决办法

          问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。 问题排查: 通过 netstat -

          [转帖]性能案例-Linux下解决time_wait连接过多(Linux内核优化)

          一、性能测试的主要概念和计算公式 系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。 单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。 系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间

          [转帖]彻底理解并解决服务器出现大量TIME_WAIT

          https://zhuanlan.zhihu.com/p/567088021?utm_id=0 首先我们说下状态 TIME_WAIT 出现的原因 TCP的新建连接,断开连接的流程和各个状态,如下图所示 由上图可知:TIME_WAIT 是主动断开连接的一方会出现的,客户端,服务器都有可能出现 当客户端

          [转帖]TIME_WAIT 过多导致的问题

          https://www.cnblogs.com/byfboke/p/14431176.html 背景:由于秒杀业务需求,会有持续并发连接的情况 问题:鉴于成本问题,业务项目会有交叉部署的情况,某个服务的TIME_WAIT 网络连接数过多,导致了其他应用不可用 解决:基于三个层面考虑 1>调优系统网络

          [转帖]time_wait与close_wait

          https://www.cnblogs.com/zh-dream/p/13620175.html 为什么要有TIME_WAIT呢? 1.可靠地实现TCP全双工连接的终止。A发送FIN到B,B收到FIN后发送ACK到A,然后再发送FIN到A,A最后发送ACK到B,之后进入到TIME_WAIT状态。如果