首页 > 其他分享 >TCP连接中CLOSE_WAIT状态的原因与解决方法?

TCP连接中CLOSE_WAIT状态的原因与解决方法?

时间:2023-06-27 19:44:28浏览次数:37  
标签:socket TCP 关闭 CLOSE 连接 WAIT

       关闭socket分为主动关闭和被动关闭两种情况。前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接;

将关闭部分的状态转移摘出来,就得到了下图:

 

产生原因?
通过图上,我们来分析,什么情况下,连接处于CLOSE_WAIT状态呢?
在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。
通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。
出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。

 

linux查看close_wait命令:

netstat -antp | grep CLOSE_WAIT
netstat -tunpl |grep 端口号

解决方法?
基本的思想就是要检测出对方已经关闭的socket,然后关闭它。
1、代码需要判断socket,一旦read返回0,断开连接,read返回负,检查一下errno,如果不是EAGAIN,也断开连接。
2、给每一个socket设置一个时间戳last_update,每接收或者是发送成功数据,就用当前时间更新这个时间戳。定期检查所有的时间戳,如果时间戳与当前时间差值超过一定的阈值,就关闭这个socket。
3、使用一个Heart-Beat线程,定期向socket发送指定格式的心跳数据包,如果接收到对方的RST报文,说明对方已经关闭了socket,那么我们也关闭这个socket。
4、设置SO_KEEPALIVE选项,并修改内核参数
{
echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes

除了修改内核参数外,可以使用setsockopt修改socket参数
int KeepAliveProbes=1;
int KeepAliveIntvl=2;
int KeepAliveTime=120;
setsockopt(s, IPPROTO_TCP, TCP_KEEPCNT, (void *)&KeepAliveProbes, sizeof(KeepAliveProbes));
setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&KeepAliveTime, sizeof(KeepAliveTime));
setsockopt(s, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&KeepAliveIntvl, sizeof(KeepAliveIntvl));

}

标签:socket,TCP,关闭,CLOSE,连接,WAIT
From: https://www.cnblogs.com/lyfily-p-7439305/p/17509769.html

相关文章

  • Modbus RTU 转 Modbus TCP协议转换网关
    现今,工业自动化系统中,西门子和欧姆龙PLC是最常用的控制器之一。然而,由于PLC之间使用的通信协议不尽相同,因此需要一种能够实现多种协议转换的采集网关产品。BL110采集网关就是一款能够支持西门子和欧姆龙PLC远程数据上云平台的产品。BL110采集网关采用嵌入式Linux系统开发,具有高度的......
  • 监听调试web service的好工具TCPMon
    一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢。 首先我们先介绍一下一个简单的远程监控程序的实现原理。 功能一,远程屏幕监视 (1)必须要有监控端与被监控端,而且程序保持启动。 (2)被监控端获取本机的屏幕截屏发图给监控端。 (3)监控端在......
  • tcpdump捕获网络http流量
    tcpdump-iany-s0-A|egrep-i"POST/|GET/|Host:" 这个命令将使用tcpdump捕获网络流量,并过滤出包含POST、GET和Host字段的流量。具体各选项的含义如下:*`-iany`:捕获任何网络接口的流量。*`-s0`:指定抓包时每个数据包的只捕获前0个字节,即只捕获数据包的头部信息,......
  • jmeter测试tcp接口
    Jmeter测试tcp接口一.tcp接口结构Tcp接口:只有ip和port传参数据类型根据开发定义的类型需要添加一个ascii码的十进制字节结束符,tcp才会关闭二.Tcp接口环境搭建在testfan-tcp-server.jar目录下,启动cmd命令行,输入:java-jartestfan-tcp-server.jar三.Jmeter测试tcp接口1.添加tc......
  • await/async/Promise
    await关键字:在JavaScript中,await关键字用于等待一个异步函数的完成,并暂停当前函数的执行,直到异步函数返回一个解决的值(resolvedvalue)或被拒绝的原因(rejectedreason)。await关键字只能在async函数内部使用。使用await时,需要将其放置在一个返回Promise的异步函数前面,并使用await......
  • Nginx-PHP优化设置 + lnmp调优的关键影响因素 + php-fpm + nginx返回码 + tcp调优 +
    最大文件描述符Linux内核本身有文件描述符最大值的**,你可以根据需要更改:系统最大打开文件描述符数:/proc/sys/fs/file-max临时性设置:echo1000000>/proc/sys/fs/file-max永久设置:修改/etc/sysctl.conf文件,增加fs.file-max=10000002、用户级设置vi/etc/security/limits.confhttp......
  • cpp condition_variable wait_for unique_mutex,chrono::seconds
    #include<chrono>#include<condition_variable>#include<ctime>#include<fstream>#include<future>#include<iomanip>#include<iostream>#include<thread>#include<uuid/uuid.h>#include<vector......
  • 仙境传说脚本RO:NPC对话| mes/next/close函数用法详解
    仙境传说脚本RO:NPC对话|mes/next/close函数用法详解大家好,我是艾西,今天跟大家讲解下仙境传说mes/next/close函数,在游戏中所有的NPC对话都是用mes函数来创建的。我们先打开官方文档的script_commands.txt文件,搜索*messearch*mesmes"Hello,world!";注意:默认是没有关团或next按......
  • MySQL的wait_timeout 参数 set global 设置不生效
    MySQL服务连接数突然暴增,登录服务查看大都是sleep进程,并且1分钟会启用一个新的连接,紧急处理方案是需要手动去释放连接数。登录服务器查看当前超时时间mysql>showvariableslike'%timeout%';+-----------------------------+----------+|Variable_name|Valu......
  • leetcode 16 最接近的三数之和 3sum-closest【ct】
    ===思路:在遍历中去计算,每一轮循环中都去计算,如果distance更小就去更新distance。如果sum>target,end--,如果sum<target,start++,如果等于,就可以直接返回target  ......