专栏首页皮振伟的专栏[linux][tcp]CLOSE_WAIT的一个TCP问题

[linux][tcp]CLOSE_WAIT的一个TCP问题

前言

某机器上残留了很多CLOSE_WAIT状态的TCP连接,使用netstat却看不到是哪一个进程在使用。

分析

TCP状态机

回顾一下TCP的状态机,处于ESTABLISHED状态的TCP连接收到FIN信号后,回复ACK,会进入到CLOSE_WAIT状态。

通常的CLOSE_WAIT状态的TCP连接

通常情况下,我们可以通过netstat -aptn来获取到TCP连接的信息,如上图,可以知道CLOSE_WAIT状态的TCP连接属于50871进程,大概率是用户逻辑处理有问题,没有执行close/shutdown来关闭TCP连接。

没有进程号的CLOSE_WAIT状态的TCP连接

还有一种情况,没有进程归属的CLOSE_WAIT状态的TCP连接。

同时,我们使用lsof命令,或者ls -al /proc/PID/fd同样也看不到目标进程有对应的fd。

那么,这些连接是怎么来的呢?

在TCP的三次握手之后,TCP连接已经进入了ESTABLISHED。而且,不管server端是否执行accept,都会完成三次握手。

在三次握手完成之后(内核态完成),在用户进程没有执行accept之前,内核会把对应的socket加入到listen的队列中。在队列中的socket,在server端执行accept之前,client执行了close/shutdown操作,在server端就会看到上图中的现象:大量的没有进程归属的CLOSE_WAIT状态的TCP连接。

解决办法

只要server及时执行accept操作即可。否则,因为listen的队列已经满了,无法让其他的连接正常执行。

那么,能不能自动丢弃这种没有进程归属的CLOSE_WAIT状态的TCP连接?作者查询linux-4.19的TCP逻辑,发现只有两种情况下会有从listen的队列中的dequeue操作:1,执行accept操作; 2,关闭listen fd。

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)

    上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使用纯纯的NIO实现一个越聊越上瘾的“群聊系统”。

    彤哥
  • 实现websocket 主动消息推送,用laravel+Swoole

    近来有个需求:想实现一个可以主动触发消息推送的功能,这个可以实现向模板消息那个,给予所有成员发送自定义消息,而不需要通过客户端发送消息,服务端上message中...

    猿哥
  • 用于在无网络环境下传输文件的开源库

    在 2018年2月份 的时候,我先后发布了两个可用于在无网络环境下传输文件的开源库,支持两台 Android 设备通过 Wiif 热点或者 Wifi Dire...

    叶应是叶
  • 【通信】WebSocket

    通常,当客户端访问一个网页时,会向Web服务器发送一个HTTP请求,Web服务器接收该请求,并返回响应,客户端在接收到响应后再将信息呈现出来。

    Html5知典
  • 2019年Spring Boot面试都问了什么?快看看这22道面试题!

    多年来,随着新功能的增加,spring 变得越来越复杂。访问spring官网页面,我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如...

    程序员追风
  • 老李手把手教你写山寨Workerman(一)

    真的是万万没想到,我竟然真的沦落到了用【XXX手把手教你XXX】当标题的一天...

    老李秀
  • WebSocket实现Web端即时通信

    HTTP协议是半双工协议,也就是说在同一时间点只能处理一个方向的数据传输,同时HTTP消息也是过于庞大,里面包含大量消息头数据,真正在消息处理中很多数据不是必须...

    黄泽杰
  • 彤哥说netty系列之Java BIO NIO AIO进化史

    (1)上周五的那篇文章发重复了,是定时任务设置错误导致,给大家带来干扰,这里说声抱歉。

    彤哥
  • Kafka 安装与启动

    Kafka 依赖 ZooKeeper,如果你还没有 ZooKeeper 服务器,你需要先启动一个 ZooKeeper 服务器。可以先参考ZooKeeper 安装...

    smartsi
  • Java nio 空轮询bug到底是什么

    epoll机制是Linux下一种高效的IO复用方式,相较于select和poll机制来说。其高效的原因是将基于事件的fd放到内核中来完成,在内核中基于红黑树+链...

    luoxn28

扫码关注云+社区

领取腾讯云代金券