最推荐用ss -tn state all | awk '{print $nf}' | sort | uniq -c | sort -nr统计全部tcp状态数量,因ss预装、高效、准确;established数反映真实负载,用ss -tn state established | wc -l获取;异常堆积需关注syn-recv、time-wait等状态分布。

Linux 查看 TCP 协议统计数据,核心目标是掌握连接状态分布、活跃连接规模、异常堆积情况(如大量 TIME_WAIT 或 SYN_RECV),以及定位高负载来源。最实用、最稳定的方法不是靠单一命令,而是按需组合工具和参数,兼顾准确性、效率与兼容性。
用 ss 统计所有 TCP 状态数量(推荐首选)
这是当前最稳、最快、无需额外安装的方案:
- ss -tn state all | awk '{print $NF}' | sort | uniq -c | sort -nr —— 一次性列出全部 TCP 状态及数量,如 ESTABLISHED、TIME-WAIT、LISTEN、CLOSE-WAIT、SYN-RECV 等
- 必须加 state all,否则某些内核版本默认只输出部分状态(比如漏掉 SYN-RECV 或 FIN-WAIT-2)
- 用 $NF(最后一列)提取状态,比硬写 $6 更可靠,因为不同 ss 版本字段顺序可能变化;可先运行 ss -tn | head -3 看一眼实际格式
- 不依赖 netstat,执行快、CPU 占用低,万级连接下依然响应迅速
查 ESTABLISHED 连接总数(关注真实通信量)
ESTABLISHED 表示正在双向通信的活跃连接,是衡量服务负载的关键指标:
- ss -tn state established | wc -l —— 简洁准确,ss 原生语法不区分大小写,无误匹配风险
- netstat -tn | awk '$6 == "ESTABLISHED" {++n} END {print n+0}' —— 若必须用 netstat,锁定第六列避免 grep 泛匹配(比如匹配到 established_time 或日志字段)
- 别用 netstat -l,它只显示 LISTEN,和 ESTABLISHED 完全是两回事
- 排除 IPv6 干扰可加:| grep -v '\[.*\]'
按端口或 IP 聚合分析连接来源
定位谁在连你、连了什么端口、是否异常,关键在于分清 sport(源端口)和 dport(目的端口):
- 查本机 80 端口被连了多少次:ss -tn state established sport :80 | wc -l(sport 是服务监听端口,代表“别人连我”)
- 查本机主动连了多少个 80 端口:ss -tn state established dport :80 | wc -l(dport 是目标端口,代表“我连别人”)
- 查哪个远程 IP 连得最多:ss -tn state established sport :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
没有 ss 时的兜底方案:读 /proc/net/tcp
Alpine、distroless 容器等极简环境常不含 ss 或 netstat,此时直接解析内核接口:
- /proc/net/tcp 第 4 列是十六进制状态码:01=ESTABLISHED、06=TIME_WAIT、0A=LISTEN
- 统计 ESTABLISHED 数量:awk '$4 == "01" {++n} END {print n+0}' /proc/net/tcp
- 查看全部状态码含义可查:man 7 tcp 或搜索 “linux tcp state hex”
- 不建议用字符串匹配(如 grep ESTABLISHED),因为该文件里只有十六进制码,没文字状态











