首页 > 其他分享 >TIME_WAIT和CLOSE_WAIT的区别

TIME_WAIT和CLOSE_WAIT的区别

时间:2022-11-10 14:22:46浏览次数:34  
标签:TCP 关闭 TIME 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,就断开连接。
   
   

标签:TCP,关闭,TIME,CLOSE,连接,WAIT
From: https://www.cnblogs.com/MoDian/p/16876869.html

相关文章

  • simpread-(128 条消息) js 函数柯里化 + class + async await 思想封装我们的 Api_fro
    柯里化所谓"柯里化",就是把一个多参数的函数,转化为单参数函数在项目中,例如定义了如下请求接口的方法:类中也是可以使用async和await1.柯里化封装之前//a.js文......
  • Promise与async、await结合使用
    Promise与async、await结合使用functionfun(){returnnewPromise((resolve,reject)=>{//返回一个Promise对象setTimeout(()=>{//此处也可以使用调其......
  • RealTimeWarningServiceImplTest
    1importorg.junit.Assert;2importorg.junit.Before;3importorg.junit.Test;4importorg.junit.runner.RunWith;5importorg.mockito.InjectMocks;......
  • Error:Handshake inactivity timeout
    链接远程数据库时,出现如下错误 解决办法:找到本地sequence.js文件,修改文件中的this._timeout,由原来的参数调整改为确定值:this._timeout=100000 ......
  • Setup time和Hold time:早来、晚走
    最近看时序分析,关于建立时间和保持时间,《时序约束和分析》里面有非常详细的描述,但是看起来太痛苦了。对于建立时间和保持时间浅显理解归为一句话:数据传输相对于clk不能太......
  • 7.1.3 TimePicker结合案例详解
    TimePicker是Android的时间设置控件。TimePicker类的继承图如下:java.lang.Object↳android.view.View↳android.view.ViewGroup↳andro......
  • git clone 失败 443 timeout 解决方法
    添加gitclone.com比如:gitclonehttps://github.com/he1pu/JDHelp.git修改为:gitclonehttps://gitclone.com/github.com/he1pu/JDHelp.git亲测完美!!成功点赞!—————......
  • Filebeat启动失败,filebeat.service holdoff time over
    systemctlstatusfilebeat●filebeat.service-FilebeatsendslogfilestoLogstashordirectlytoElasticsearch.Loaded:loaded(/usr/lib/systemd/system/f......
  • STC32G12K128-timer
    定时器部分,一般个人习惯,我喜欢用定时器做任务周期/***********************************************************定时器0初始化,系统时钟24M************************......
  • 微信小程序中使用Async-await方法异步请求变为同步请求方法
    微信小程序中有些Api是异步的,无法直接进行同步处理。例如:wx.request、wx.showToast、wx.showLoading等。如果需要同步处理,可以使用如下方法:注意:Async-await方法属于ES7......