TCP 有很多连接状态,每一个都够聊十块钱儿的,比如我们以前讨论过 TIME_WAIT 和 FIN_WAIT1,最近时不时听人提起 CLOSE_WAIT,感觉有必要梳理一下。

所谓 CLOSE_WAIT,借用某位大牛的话来说应该倒过来叫做 WAIT_CLOSE,也就是说「等待关闭」,如果你还不理解其含义,可以看看 TCP 关闭连接时的图例:

TCP Close

不要被图中的 client 和 server 所迷惑,你只要记住:主动关闭的一方发出 FIN 包,被动关闭的一方响应 ACK 包,此时,被动关闭的一方就进入了 CLOSE_WAIT 状态。如果一切正常,稍后被动关闭的一方也会发出 FIN 包,然后迁移到 LAST_ACK 状态。

通常,CLOSE_WAIT 状态在服务器停留时间很短,如果你发现大量的 CLOSE_WAIT 状态,那么就意味着被动关闭的一方没有及时发出 FIN 包,一般有如下几种可能:

  • 程序问题:如果代码层面忘记了 close 相应的 socket 连接,那么自然不会发出 FIN 包,从而导致 CLOSE_WAIT 累积;或者代码不严谨,出现死循环之类的问题,导致即便后面写了 close 也永远执行不到。
  • 响应太慢或者超时设置过小:如果连接双方不和谐,一方不耐烦直接 timeout,另一方却还在忙于耗时逻辑,就会导致 close 被延后。响应太慢是首要问题,不过换个角度看,也可能是 timeout 设置过小。
  • BACKLOG 太大:此处的 backlog 不是 syn backlog,而是 accept 的 backlog,如果 backlog 太大的话,设想突然遭遇大访问量的话,即便响应速度不慢,也可能出现来不及消费的情况,导致多余的请求还在队列里就被对方关闭了。

如果你通过「netstat -ant」或者「ss -ant」命令发现了很多 CLOSE_WAIT 连接,请注意结果中的「Recv-Q」和「Local Address」字段,通常「Recv-Q」会不为空,它表示应用还没来得及接收数据,而「Local Address」表示哪个地址和端口有问题,我们可以通过「lsof -i:<PORT>」来确认端口对应运行的是什么程序以及它的进程号是多少。

如果是我们自己写的一些程序,比如用 HttpClient 自定义的蜘蛛,那么八九不离十是程序问题,如果是一些使用广泛的程序,比如 Tomcat 之类的,那么更可能是响应速度太慢或者 timeout 设置太小或者 BACKLOG 设置过大导致的故障。

此外还有一点需要说明:按照前面图例所示,当被动关闭的一方处于 CLOSE_WAIT 状态时,主动关闭的一方处于 FIN_WAIT2 状态。 那么为什么我们总听说 CLOSE_WAIT 状态过多的故障,但是却相对少听说 FIN_WAIT2 状态过多的故障呢?这是因为 Linux 有一个「tcp_fin_timeout」设置,控制了 FIN_WAIT2 的最大生命周期。坏消息是 CLOSE_WAIT 没有类似的设置,如果不重启进程,那么 CLOSE_WAIT 状态很可能会永远持续下去;好消息是如果 socket 开启了 keepalive 机制,那么可以通过相应的设置来清理无效连接,不过 keepalive 是治标不治本的方法,还是应该找到问题的症结才对。

谈谈CLOSE_WAIT相关推荐

  1. 反arp攻击软件_谈谈电子欺骗中的ARP欺骗

    ARP欺骗是一种非常古老的电子欺骗攻击,虽然从诞生到现在已经过去了二十多年,但在很多网络中仍然有效.之前写的 沈传宁:谈谈TCP/IP协议的学习​zhuanlan.zhihu.com 文章中也提到,我 ...

  2. mysql注入实例获取答案_本文实例讲述了MySQL解决SQL注入的另类方法。分享给大家供大家参考,具体如下:问题解读我觉得,这个问题每年带来的成本可以高达数十亿美元了。本文就来谈谈,...

    本文实例讲述了MySQL解决SQL注入的另类方法.分享给大家供大家参考,具体如下: 问题解读 我觉得,这个问题每年带来的成本可以高达数十亿美元了.本文就来谈谈,假定我们有如下 SQL 模板语句: se ...

  3. 谈谈C#中类成员的执行顺序.

    今天我们来谈谈C#中子类和父类中静态成员以及构造函数的执行顺序,这个地方向来是初学C#的人比较迷惑的地方,也是各大公司最喜欢拿来出面试题的地方. 下面我们分情况来分析. 1. 普通构造函数和静态构造函 ...

  4. 谈谈UI架构设计的演化

    谈谈UI架构设计的演化 经典MVC 在1979年,经典MVC模式被提出. 在当时,人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来,而Trygve Reenskaug在跟一些人的讨 ...

  5. 谈谈Python那些不为人知的冷知识(二)

    本文转载自Python的编程时光(ID:Python-Time) 小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来. 从上一篇的分享来看,仍然有不少 Pythoner 对这些冷知识存在盲 ...

  6. 谈谈 Java 类加载机制

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:Rainstorm , github.com/c-rainstorm/blog/blob/m ...

  7. 13个Offer,8家SSP,谈谈我的秋招经验

    前言 大家好,我是卖萌屋的小Q,是夕小瑶学姐的同实验室师弟(2020届).在学姐的建(bian)议(ce)下写了本文,希望能够给21届的师弟师妹提供一些启发,秋招之路能够更加顺利~ 往昔的回忆使我们激 ...

  8. 谈谈你对集成学习的见解与认识,描述一下它们的优势所在?

    [每日一问]谈谈你对集成学习的见解与认识,描述一下它们的优势所在? Datawhale优秀回答者:HipHopMan 集成方法有很多种,一种叫做bagging,bagging的思想是,我把我的数据做一 ...

  9. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

最新文章

  1. 机器人~TCP/IP通信
  2. 华为在线题--计算字符个数
  3. [LeetCode 题解]: Rotate List
  4. 重庆市推进组建区块链数字资产交易所
  5. DL之GCN:GCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  6. html菜单浮动,浮动菜单,可实现上下滚动的效果
  7. jQuery 的常用选择器,筛选器
  8. 机器学习与数据挖掘——第二章 数据与数据预处理
  9. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love max and multiply(转化)
  10. RAC集群故障恢复CRS-4047,CRS-4000
  11. python判断网页密码加密方式_Python模拟网页中javascript加密与验证的相关处理
  12. De 30: Decoupling Linear Systems with Constant Coefficients
  13. 更新macOS Big Sur系统后,Parallels Desktop打不开怎么办?教你解决方法!
  14. 为什么大部分的程序员成不了架构师?为什么?
  15. JavaScript:实现ROT13密码算法(附完整源码)
  16. stm32cubeMX配置人体感应器SR505
  17. 2、Terraform-安装
  18. 【前端面试 | css面试题整理】
  19. 备案注销申请表_怎么注销单个网站备案?
  20. 喵星球上的点名——记一个用广义SAM根号维护多串的技巧

热门文章

  1. 【转】TCP协议的无消息边界问题
  2. linux下安装oracle 11g R2
  3. 用数学运算实现数据无损压缩的算法
  4. layui 渲染select下拉选项 ,日期控件的用法
  5. Readhat中升级openssh
  6. Django REST framework 源码解析
  7. java使用xml存储数据_用存储过程和 JAVA 写报表数据源有什么弊端?
  8. 【设计模式 05】工厂方法模式
  9. Machine Learning(Stanford)| 斯坦福大学机(吴恩达)器学习笔记【汇总】
  10. 明细表如何添加重量_关于Revit中明细表标准的导出及导入