linux查看tcp连接状态本质是读取内核socket表,ss最直接高效,netstat兼容但较慢,lsof侧重进程关联;常见状态包括listen、established、time_wait等,对应连接生命周期各阶段。

Linux 中查看 TCP 连接状态,本质就是查看 socket 的当前状态。系统通过内核维护的 socket 表来跟踪每个连接所处的阶段(如 LISTEN、ESTABLISHED、TIME_WAIT 等),而 netstat、ss 和 lsof 都是读取这些 socket 信息的用户态工具。其中 ss 是最直接、高效且推荐的方式,因为它直接从内核 socket 子系统获取数据,不经过 netlink 的额外转换。
用 ss 查看 TCP socket 状态(首选)
ss(socket statistics)专为现代 Linux 设计,能准确反映内核中 socket 的实时状态:
-
列出所有 TCP socket 及其状态:运行
ss -t -n,输出中 State 列即为 socket 状态(如 ESTABLISHED、LISTEN、FIN-WAIT-1 等) -
只看已建立的连接:用
ss -tn state established,比 grep 更可靠(避免匹配到字符串“established”误判) -
查看监听中的 TCP socket:
ss -tln,State 显示为 LISTEN -
包含进程和端口详情:加
-p参数(需 root 权限),例如sudo ss -tlnp,可看到 PID 和程序名
用 netstat 查看 TCP socket 状态(兼容性好)
netstat 仍广泛用于排查,但依赖较旧的 proc 接口,大数据量时可能延迟或卡顿:
-
显示全部 TCP 连接与状态:
netstat -tn,State 列对应 RFC 793 定义的标准 TCP 状态 -
筛选特定状态:比如查所有 TIME_WAIT 连接,执行
netstat -tn | grep TIME_WAIT -
统计各状态数量:用
netstat -tn | awk '{print $6}' | sort | uniq -c,快速掌握连接分布 -
注意:部分新发行版(如 Ubuntu 22.04+、CentOS Stream)默认不预装 net-tools,需手动安装
sudo apt install net-tools或sudo dnf install net-tools
用 lsof 查看 TCP socket 的关联信息
lsof 把网络连接当作“打开的文件”处理,适合定位具体进程和路径:
-
列出所有 TCP socket 及其状态:
sudo lsof -iTCP -n -P,输出中 STATE 列即 TCP 状态(如 ESTABLISHED、LISTEN) -
查某进程的所有 TCP 连接:例如
sudo lsof -iTCP -n -P -p 1234(1234 是 PID) -
查某端口被谁占用:如
sudo lsof -iTCP:80,能立刻看到监听该端口的进程和用户
TCP socket 常见状态含义
理解这些状态有助于判断连接是否正常:
- LISTEN:服务端正在等待客户端连接请求(典型如 nginx 监听 80 端口)
- ESTABLISHED:双向通信已建立,数据正在收发
- TIME_WAIT:主动关闭方进入此状态,等待足够时间确保对方收到 FIN,防止旧包干扰新连接
- CLOSE_WAIT:被动关闭方收到 FIN 后等待应用调用 close(),若长期存在说明程序未正确释放连接
- SYN_SENT / SYN_RECV:连接建立过程中的中间状态,异常堆积可能表示 SYN Flood 攻击或服务不可达











