[笔记]CLOSE_WAIT问题的排查方法

TCP连接的关闭涉及到四次挥手过程,可能导致客户端进入FIN-WAIT-2,服务端进入CLOSE_WAIT状态。如果服务端程序未正确关闭连接或收尾工作过慢,将导致大量CLOSE_WAIT。此外,客户端超时设置也可能影响这一过程。解决此类问题需要检查程序逻辑和网络配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题的判断

netstat -an 命令可以查看网络连接的状态。

网络连接的状态

netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 命令可以查看各种状态连接的数量。

网络连接状态的统计

问题产生的原因

TCP结束时的4次挥手:

  1. 客户端(当前场景意义上的,与应用程序的角色无关)需要关闭TCP连接,首先发送FIN到服务端,发送后客户端进入FIN-WAIT-1状态等待ACK

  2. 服务端接收到FIN,返回ACK进入CLOSE_WAIT状态,等待应用程序进行一些收尾工作

  3. 客户端收到ACK后进入FIN-WAIT-2状态,等待接收服务端之后发送的FIN

  4. 进入CLOSE_WAIT状态的服务端待应用程序完成收尾工作后,发送FIN到客户端,然后进入LAST-ACK状态等待ACK

  5. 客户端收到服务端发送的FIN后返回ACK,并进TIME-WAIT状态,等2个MSL(Maximum Segment Life)后CLOSED

  6. 服务端收到返回的ACK后CLOSED

TCP4次挥手

Linux有一个 tcp_fin_timeout 设置,控制了FIN_WAIT2的最大生命周期,而CLOSE_WAIT没有,所以如果这一个过程出现异常,客户端TCP连接会关闭,而服务端连接一直处在CLOSE_WAIT状态。

造成大量CLOSE_WAIT的可能原因(来自于参考资料):

  1. 服务端程序没有正确关闭连接

  2. 服务端收尾工作太慢,客户端没等到FIN就已经超时了

  3. 客户端设置的超时时间太短

参考资料

浅谈CLOSE_WAIT

线上大量CLOSE_WAIT原因深入分析

又见CLOSE_WAIT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值