专栏首页皮振伟的专栏[linux][tcp]CLOSE_WAIT的一个TCP问题

[linux][tcp]CLOSE_WAIT的一个TCP问题

前言

某机器上残留了很多CLOSE_WAIT状态的TCP连接,使用netstat却看不到是哪一个进程在使用。

分析

TCP状态机

回顾一下TCP的状态机,处于ESTABLISHED状态的TCP连接收到FIN信号后,回复ACK,会进入到CLOSE_WAIT状态。

通常的CLOSE_WAIT状态的TCP连接

通常情况下,我们可以通过netstat -aptn来获取到TCP连接的信息,如上图,可以知道CLOSE_WAIT状态的TCP连接属于50871进程,大概率是用户逻辑处理有问题,没有执行close/shutdown来关闭TCP连接。

没有进程号的CLOSE_WAIT状态的TCP连接

还有一种情况,没有进程归属的CLOSE_WAIT状态的TCP连接。

同时,我们使用lsof命令,或者ls -al /proc/PID/fd同样也看不到目标进程有对应的fd。

那么,这些连接是怎么来的呢?

在TCP的三次握手之后,TCP连接已经进入了ESTABLISHED。而且,不管server端是否执行accept,都会完成三次握手。

在三次握手完成之后(内核态完成),在用户进程没有执行accept之前,内核会把对应的socket加入到listen的队列中。在队列中的socket,在server端执行accept之前,client执行了close/shutdown操作,在server端就会看到上图中的现象:大量的没有进程归属的CLOSE_WAIT状态的TCP连接。

解决办法

只要server及时执行accept操作即可。否则,因为listen的队列已经满了,无法让其他的连接正常执行。

那么,能不能自动丢弃这种没有进程归属的CLOSE_WAIT状态的TCP连接?作者查询linux-4.19的TCP逻辑,发现只有两种情况下会有从listen的队列中的dequeue操作:1,执行accept操作; 2,关闭listen fd。

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60),作者:AlwaysGeek

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于大量CLOSE_WAIT连接分析

    某日线上登录出现故障,排查日志发现HttpClient请求时随机分配到的端口被占用,导致第三方登录拉取信息时无法拉取成功,错误如下:

    屈定
  • Oracle JDK7 bug 发现、分析与解决实战

    众所周知,Oracle JDK 是 Java 语言的绝对权威,很多时候 JDK 与 Java 语言近似一个概念。但我们始终要保持实事求是的精神,敢于质疑。本文...

    2020labs小助手
  • TCP time_wait close_wait问题(可能是全网最清楚的例子)

    测试老大看到了,根据经验就推测是应该是文件句柄使用完了,应该有TCP连接很多没释放,果真发现是很多CLOSE_WAIT的状态

    千往
  • 测试环境服务器硬盘塞满问题排查

    某天下午测试环境服务器出现tab无法补全命令,给出的提示大概意思就是说,无可用空间无法创建临时文件,不过这次跟上次出现的问题比较像,上次服务器出现的问题,因此楼...

    haifeiWu
  • Linux下查看Nginx的并发连接数和连接状态

    老七Linux
  • 从linux源码看socket的close

    笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。上篇博客讲了socket的阻塞和非阻塞,这篇就开始谈一谈socket的...

    无毁的湖光-Al
  • 解决TCP连接数过多的问题

    大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基本上显示着established,time_wait,close_wait等,这...

    明哥的运维笔记
  • 一次TIME_WAIT和CLOSE_WAIT故障和解决办法

    里头的分析过程有提到,通过查看服务器网络状态检测到服务器有大量的CLOSE_WAIT的状态。

    sunsky
  • SS命令和Netstat命令比较

    在早期运维工作中,查看服务器连接数一般都会用netstat命令。其实,有一个命令比netstat更高效,那就是ss(Socket Statistics)命令! ...

    洗尽了浮华

扫码关注云+社区

领取腾讯云代金券