如何删除 CLOSE_WAIT 套接字连接

2024-10-29 08:35:00
admin
原创
51
摘要:问题描述:我编写了一个小程序,用于与特定端口上的服务器进行交互。该程序运行正常,但是:一旦程序意外终止,从此套接字连接就处于CLOSE_WAIT状态。如果我尝试运行程序,它会挂起,我必须强制关闭它,这会累积更多的 CLOSE_WAIT套接字连接。有没有办法刷新这些连接?解决方案 1:CLOSE_WAIT意味着...

问题描述:

我编写了一个小程序,用于与特定端口上的服务器进行交互。该程序运行正常,但是:

一旦程序意外终止,从此套接字连接就处于CLOSE_WAIT状态。如果我尝试运行程序,它会挂起,我必须强制关闭它,这会累积更多的 CLOSE_WAIT套接字连接。

有没有办法刷新这些连接?


解决方案 1:

CLOSE_WAIT意味着您的程序仍在运行,并且尚未关闭套接字(内核正在等待它关闭套接字)。添加-pnetstat获取 pid,然后更强制地将其杀死(SIGKILL如果需要)。这应该可以摆脱您的CLOSE_WAIT套接字。您也可以使用ps来查找 pid。

SO_REUSEADDR用于服务器和TIME_WAIT套接字,因此不适用于此处。

解决方案 2:

您可以使用命令强制关闭套接字ss。该ss命令是一个实用程序,它允许您转储套接字统计信息并显示套接字信息,包括网络连接。它与netstat命令类似,但通常更快、更高效。

要使用该命令强制关闭处于 CLOSE_WAIT 状态的套接字ss,可以使用--tcp选项指定要查看 TCP 套接字,使用state CLOSE-WAIT选项指定仅查看处于 CLOSE_WAIT 状态的套接字。例如:

$ ss --tcp state CLOSE-WAIT

这将显示处于 CLOSE_WAIT 状态的所有 TCP 套接字的列表。

要强制关闭这些套接字,可以使用该--kill选项。这将向套接字发送信号,使其关闭。例如:

$ ss --tcp state CLOSE-WAIT --kill

您还可以使用该--tcp选项根据各种条件过滤要关闭的套接字。例如,您可以使用该dport选项指定特定的端口号,或dst使用该选项指定特定的目标 IP 地址。例如:

$ ss --tcp state CLOSE-WAIT '( dport = 22 or dst 1.1.1.1 )' --kill

这将强制关闭所有连接到端口 22 或目标 IP 地址为 1.1.1.1 的处于 CLOSE_WAIT 状态的 TCP 套接字。

需要注意的是,使用该ss命令强制关闭套接字可能会产生意想不到的后果,因为它可能会中断正在进行的网络连接。通常,谨慎使用此命令是个好主意,并且只在必要时才使用。

解决方案 3:

正如克里斯特·克拉克所描述的。

CLOSE_WAIT 表示连接的本地端已经收到来自另一端的 FIN,但操作系统正在等待本地端的程序真正关闭其连接。

问题是您在本地机器上运行的程序没有关闭套接字。这不是 TCP 调整问题。当程序保持连接打开时,连接可以(并且非常正确)永远处于 CLOSE_WAIT 状态。

一旦本地程序关闭套接字,操作系统就可以将 FIN 发送到远程端,在您等待 FIN 的 ACK 时,它会将您转换到 LAST_ACK。一旦收到 ACK,连接就会完成并从连接表中删除(如果您的端处于 CLOSE_WAIT 状态,则不会进入TIME_WAIT 状态)。

解决方案 4:

尽管过多的 CLOSE_WAIT 连接首先意味着您的代码有问题,但还是有一个选择,尽管它不被认为是好的做法。

你可能想看看:https ://github.com/rghose/kill-close-wait-connections

该脚本的作用是发送连接正在等待的 ACK。

这对我有用。

解决方案 5:

我在使用最新的 Tomcat 服务器 (7.0.40) 时也遇到了同样的问题。它有几天没有响应。

要查看打开的连接,您可以使用:

sudo netstat -tonp | grep jsvc | grep --regexp="127.0.0.1:443" --regexp="127.0.0.1:80" | grep CLOSE_WAIT

正如这篇文章中提到的,您可以使用/proc/sys/net/ipv4/tcp_keepalive_time来查看值。该值似乎以秒为单位,默认为 7200(即 2 小时)。

要更改它们,您需要编辑/etc/sysctl.conf

Open/create `/etc/sysctl.conf`
Add `net.ipv4.tcp_keepalive_time = 120` and save the file
Invoke `sysctl -p /etc/sysctl.conf`
Verify using `cat /proc/sys/net/ipv4/tcp_keepalive_time`

解决方案 6:

需要注意的是,Socket客户端和服务器端的实例都需要显式调用close()。如果只有一方调用close(),那么套接字将一直处于 CLOSE_WAIT 状态。

解决方案 7:

还值得注意的是,如果您的程序生成了一个新进程,该进程可能会继承您打开的所有句柄。即使在您自己的程序关闭后,这些继承的句柄仍可以通过孤立的子进程存活。它们不一定在 netstat 中显示完全相同。但同样,当此子进程存活时,套接字将处于 CLOSE_WAIT 状态。

我遇到过一个运行 ADB 的情况。如果服务器进程尚未运行,ADB 本身会生成一个服务器进程。这最初继承了我所有的句柄,但在我调查时并没有显示拥有其中任何一个句柄(macOS 和 Windows 都是如此 - 不确定 Linux 是否如此)。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用