ss 比 netstat 快十倍以上,可直接查看连接状态、端口占用和进程归属;常用命令包括 ss -tuln 查监听端口、ss -tun 查已建立连接、ss -s 查统计摘要,并需注意 ipv4/ipv6 处理差异及状态语义。

ss 能直接看到连接状态、端口占用、进程归属,比 netstat 快十倍以上,尤其在高并发场景下不卡顿。
查监听端口:用 ss -tuln 看谁在听
这是最常用组合,-t(TCP)、-u(UDP)、-l(listening)、-n(不解析域名)缺一不可。漏掉 -n 会导致输出卡顿,尤其当 DNS 解析慢或 hosts 配置异常时;漏掉 -l 就看不到监听项,只看到已建立的连接。
- 普通用户可执行,但看不到进程名;加
-p必须用sudo ss -tulnp - 若只关心 IPv4,补上
-4:例如sudo ss -tulnp -4 - 输出中
Local Address:Port列显示*:80表示监听所有接口,127.0.0.1:3306表示仅本地可连
查已建立连接:用 ss -tun 找活跃会话
ss -tun 显示所有非监听的 TCP/UDP 连接(如 ESTABLISHED、CLOSE_WAIT),适合排查长连接堆积或客户端未断开问题。注意它默认不含监听项,和 ss -tuln 是互补关系,不是替代关系。
- 统计当前 ESTABLISHED 连接数:
ss -tun state established | wc -l - 过滤特定远程 IP:
ss -tun dst 192.168.1.50或ss -tun src 10.0.2.15 - 若看到大量
CLOSE_WAIT,大概率是本地方应用没调用close();大量TIME_WAIT可能影响新连接,用ss -tan state time-wait | wc -l确认数量
查连接来源 IP 和端口分布:用管道组合分析
ss 本身不提供聚合统计,需靠 awk、cut、sort 配合。关键点在于字段顺序和分隔符:ss 输出列固定,第5列是 Peer Address:Port(远程端),第4列是 Local Address:Port(本地方)。
- 统计每个远程 IP 的连接数:
ss -tun | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr - 只看 8080 端口的 ESTABLISHED 连接来源:
ss -tun state established '( dport = :8080 or sport = :8080 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c - 注意:如果输出含 IPv6 地址(如
[::1]:12345),cut -d: -f1会截错,应改用awk -F'[ :]+' '{print $6}'或先过滤-4
快速诊断连接异常:用 ss -s 和状态过滤
ss -s 是第一眼判断整体健康度的命令,它不列具体连接,只给汇总数字,比如 timewait 23182/0 表示有 23182 个 TIME_WAIT 连接,括号里第二个数是哈希桶溢出次数 —— 若该值非零,说明内核连接表压力大,可能触发丢包或新建连接失败。
- 查 FIN_WAIT2 堆积:
ss -tan state fin-wait-2 | wc -l,值高通常意味着对端没发 FIN,或本端 close 后没等完就退出 - 查 synrecv(半连接):
ss -s中的synrecv 0应接近 0;若持续 >100,可能是 SYN Flood 攻击或服务响应慢 - 实时观察变化:
watch -n 1 'ss -s | grep -E "(estab|time_wait|closed)"',避免刷屏干扰核心指标
真正容易被忽略的是状态语义和字段边界:比如 CLOSE_WAIT 不代表“对方关了”,而是“对方发了 FIN,本端还没调 close”;又比如 ss -tun 输出中 IPv6 地址的冒号分割逻辑和 IPv4 完全不同,直接套用 cut -d: -f1 会把 [::1] 截成空。这些细节不踩一遍坑很难记住。










