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

问题的判断

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值