最稳的命令是 ss -tn state all | awk '{print $nf}' | sort | uniq -c | sort -nr,因它覆盖tcp全状态、大小写不敏感、字段自适应、不依赖netstat且性能稳定;而netstat存在大小写不一、默认不预装、解析慢、漏中间状态等问题。

最稳的命令是 ss -tn state all | awk '{print $NF}' | sort | uniq -c | sort -nr,它能一次性列出所有 TCP 状态(如 ESTAB、TIME-WAIT、LISTEN、CLOSE-WAIT)及其数量,不漏状态、不依赖 netstat、字段位置自适应。
为什么不用 netstat -an | grep ESTABLISHED 这类写法
大小写不统一:netstat 在不同内核或发行版里可能输出 ESTABLISHED 或 established;grep 还容易误匹配路径、日志、变量名里带 “established” 的干扰项。更关键的是,netstat 在 CentOS 8+、Ubuntu 20.04+ 及多数容器中默认不预装,ss 才是现代标准。
-
netstat -l只列监听端口,和活跃连接(如ESTABLISHED)完全无关 -
netstat -an | awk '$6 ~ /ESTABLISHED/'看似精准,但高并发时解析慢、CPU 占用高,万级连接下延迟明显 - 想统计
TIME-WAIT时,ss -tn | grep 'TIME-WAIT'可能因字段对齐不一致而漏行——state time-wait是原生语法,大小写不敏感且字段无关
ss -tn state all 必须加 state all
不加的话,某些内核版本(如较老的 RHEL 7 内核或部分定制 kernel)默认只输出 ESTABLISHED 和 LISTEN,SYN-RECV、FIN-WAIT-2、CLOSE-WAIT 这些中间状态会直接消失。加了 state all 才真正覆盖 TCP 状态机全貌。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 先跑
ss -tn | head -3看一眼字段顺序,确认状态列确实是最后一列(即$NF),避免硬写$6或$1 -
state established、state time-wait等子命令支持小写,比正则更稳,也无需担心空格或连字符差异 - 若要排除 IPv6 干扰,加
| grep -v '\[.*\]';若只看 IPv4,可加-4参数:ss -4tn state all
没有 ss 怎么办?读 /proc/net/tcp 是最后手段
Alpine、distroless 容器里常连 ss 都没有,这时只能解析内核原始数据文件:/proc/net/tcp。它的第 4 列是十六进制状态码:01 = ESTABLISHED,06 = TIME_WAIT,0A = LISTEN。
- 安全写法:
awk '$4 == "01" {++n} END {print n+0}' /proc/net/tcp—— 精确匹配,不靠字符串模糊判断 - 别硬记状态码,查
man 7 tcp或搜 “linux tcp state hex” 就能确认最新映射 -
/proc/net/sockstat提供轻量全局统计(比如tw字段就是当前TIME-WAIT总数),适合监控脚本高频采集,但不细分单个连接
状态码不是字符串,是内核内存里的整数值转成的十六进制;字段顺序在不同 ss 版本间可能浮动;sport 和 dport 写反会导致统计对象彻底错误——这些点,不实际跑一遍、不看一眼 head -3 输出,很容易踩坑。










