最近在工作中遇到一个关于TCP/IP中连接异常的问题,加深了对与TCP/IP整套机制的理解。在此,进行分享希望对遇到同样问题的朋友有所帮助。

TCP连接异常问

工作上一个服务端程序,对外提供短连接RPC响应。服务本身有多个节点,偶然发现其中一个节点的ESTABLISHED连接达到6万,并且一直无法降低(其他节点1000左右,qps均衡)。遂跟进排查这个奇怪的现象。在RPC通信中,一般client调用完毕后主动clode connection,服务端被动进行关闭。根据TCP/IP四次挥手的流程,机器不应该保存有大量的ESTABLISHED状态连接。因此,我分为以下几个流程进行排查:

通过awk对这些异常连接进行排序、去重、计算client端分布,以及每个client端有异常连接个数,希望能够查处规律。结果,没有发现明显特征。

通过tcpdump确认异常ESTABLISHED连接,是否正常:发现连接其实已经失效。

为了进步验证2的“连接生效”结论,随机登陆一台client机器;检查是否存在对应服务端的异常连接,发现确实不存。因此,可以确认client已经消耗了connection,但是服务端因为某种情况保留了这些异常的connection,并且维持状态是:ESTABLISHED。

问题比较明确,接下来就是分析原因,找出解决方案来。

原因分析和问题处理

通过查询资料,找到一篇类似现象的文章:时光机。其实,文章中对应上面的问题现象和原因分析的比较明确,也给出了合理的处理方案。

原因分析

TCP是一种可靠传输连接,如果server端没有收到client发送的FIN包,将会一直保持ESTABLISHED状态,不论client是否正常、网络中的路由节点是否正常工作。此外,本身tcp没有心跳探活机制,因此如果client端异常关闭连接,另一端是无法感知到,并且从协议上理解也没必要感知到对端关闭。这也解释,为何TCP优雅关闭connection时需要采用四次挥手机制。

所以,造成服务端大量异常ESTABLISHED连接,并且无法销毁的可能性原因是:

client异常“关闭”了connection:这里的“异常”有多种可能性,client机器奔溃了、client端程序异常退出,这两种情况都没有调用close,发送FIN。另外,也有可能server端机器的中断机制异常,导致对应FIN包的处理出现问题,没有顺利处理TCP的四次挥手接下来流程。总结存在某个“异常”case导致client实际关闭了connection,但是server端未进行响应。

由于是RPC通信,server端只是被动的响应client请求;并不会通过connection主动向client发送数据。因此,当client实际关闭了connct,如果这条连接一直没有数据通信,永远无法感知到connect的异常。所以server将保持connect的ESTABLISHED状态。

问题处理

通过上面的解释,解决方案也已经比较明确。TCP/IP针对通过实际关闭的连接发送数据时,会返回错误,并销毁connect。所以,我们只需要实现一次“发包”,其实就能处理这个问题。当然,TCP协议本身就提供了这个功能,可以在linux中设置tcp_keepalive_time参数时间,它将在timeout后进行“探活”发包,资源这个问题。需要注意的是,设置这个系统参数后,需要重启异常程序,后续不会出现异常ESTABLISHED状态连接的问题。

linux关闭established状态,Linux大量异常ESTABLISHED TCP连接问题排查相关推荐

  1. linux中ftp保持连接,linux – FTP’ing大文件时如何防止TCP连接超时?

    我无法将大型文件从Internet(FTP)检索到我的 Linux VM.一段时间后它会超时. 实际错误是"无法读取控制连接的回复 – 超时". 几分钟后,在传输了大量文件后,会发 ...

  2. linux关闭timewait端口,linux 如何强制关闭 time_wait 连接

    匿名用户 1级 2016-04-16 回答 # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 68 CLOSE_WAIT 2 CLOSING 136 ...

  3. linux 网络端口状态,Linux下用netstat查看网络状态、端口状态(转)

    转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步. n ...

  4. linux关闭防火墙stop,linux如何关闭防火墙

    我的linux不想开启防火墙了,想要关闭,该怎么办呢?下面由学习啦小编给你做出详细的linux关闭防火墙方法介绍!希望对你有帮助! linux关闭防火墙方法一: 重启后生效 开启: chkconfig ...

  5. Linux关闭java命令,Linux系统关闭或重新启动主机的命令详解

    即使现在Linux系统基本都是相对稳定,但有时候驱动程序和应用程序也可能存在一些小问题,这时就需要重新启动Linux系统主机,今天美联科技就来讲解下,关闭或重新启动Linux系统的几个实用命令. 1. ...

  6. 在linux关闭的命令,Linux系统关闭或重新启动主机的命令详解

    即使现在Linux系统基本都是相对稳定,但有时候驱动程序和应用程序也可能存在一些小问题,这时就需要重新启动Linux系统主机,今天美联科技就来讲解下,关闭或重新启动Linux系统的几个实用命令. 1. ...

  7. linux显示内存状态,Linux显示内存状态

    Linux显示内存状态 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free total used free shared buffers cached M ...

  8. 在linux关闭防火墙命令,linux关闭防火墙命令

    在linux中防火墙的开启和关闭是可以通过命令来执行的,那么具体是哪个命令呢?下面由学习啦小编为大家整理了linux关闭防火墙的相关命令,希望对大家有所帮助. 1.Linux关闭防火墙命令 1) 永久 ...

  9. linux 获取phy状态,Linux PHY几个状态的跟踪

    https://blog.csdn.net/subfate/article/details/44900665 前面文章零零星星地分析了PHY,本来想完整地,系统地做分析,发现工程量太大了,而自己又一知 ...

最新文章

  1. ClassNotFoundException: org.apache.catalina.loader.DevLoader 自己摸索,丰衣足食
  2. JVM 最多支持多少个线程?
  3. 【杂谈】如何让你的2020年秋招CV项目经历更加硬核,可深入学习有三秋季划4大领域32个方向(2020.7.23号后涨价)
  4. laravel框架安装(奶妈式手把手一步步操作)
  5. ARM开发板上iconv调用失败的解决方法
  6. matlab利用霍夫,基于matlab的霍夫变换
  7. CSS中的特殊的选择器
  8. 帆软所有销量为0的显示为空值_爆品秘籍?—线上三亚跟团游销量影响因素分析...
  9. Android开发--MVP demo+Jsoup在线小说阅读器(一)
  10. MXF到MP4转换器:如何轻松地将MXF转换成MP4
  11. WIN10系统下命令提示符(cmd)的基本操作
  12. 八爪鱼-自定义模式采集数据_视频教程执行
  13. 【离散数学】命题逻辑
  14. 趣闻-如何下载知乎视频
  15. 开源协同办公软件多人在线编辑office 地址:http://www.dzzoffice.com/
  16. 基于java的简单英雄联盟胜率计算
  17. 【离散数学】数学归纳法
  18. access随系统启动的宏_Access 中启动带宏的excel
  19. 计算机调出任务管理器的组合键是,如何打开任务管理器 打开任务管理器的方法【方法详解】...
  20. 刷脸支付商用之火真正出现燎原的苗头

热门文章

  1. SAN和NAS之间到底有什么区别?
  2. 普中开发板学习(一)
  3. Google浏览器无法访问本地图片问题解决
  4. 【学习】cifar-10-python 手动下载和处理
  5. 草地天空全套26张英文字母
  6. 约战精灵再临服务器维护,约战精灵再临进不了游戏怎么办_无法进入游戏解决方法...
  7. PostMan如何测试上传图片
  8. 非科班不能进大厂?从半路出家到阿里Android高级工程师
  9. 【项目小结】英语语法错误检测(GEC)开题论文阅读记录
  10. Redis——Redis主从复制(工作流程详解)