在高并发场景下,排查 Linux 网络连接状态,ss 命令是少数能稳定扛住压力、实时输出准确结果的工具。以 5 万连接进行测试:netstat 需要 15 秒才能完成,而 ss 仅需 0.3 秒——它直接读取内核 socket 子系统数据,无需依赖 /proc/net 解析,因此数据更实时准确。同样,ss -tuln 这条命令必须同时带 -t(TCP)、-u(UDP)、-l(监听)、-n(数字格式),缺一个都会引出问题:漏掉 -t 或 -u 就看不到对应协议的监听端口;漏掉 -l 只能看到已建立连接;漏掉 -n 则可能因 DNS 解析阻塞而长时间无响应。查看已建立连接时,ss -tun 默认包含所有非监听状态(如 CLOSE_WAIT、TIME_WAIT),而 ss -tn state established 只筛选真正在通信的 ESTABLISHED 连接。加 -p 需要 sudo 权限才能显示其他用户的进程信息,输出形如 users:(("nginx",pid=1234,fd=6))。ss -s 提供全局连接健康度统计:estab 是活跃连接数,time-wait 后面的斜杠值非零说明哈希桶溢出、内核压力大,CLOSE-WAIT 多通常表示本地方应用没调 close()。状态过滤与语法严格耦合——比如 state listen 只对 -l 有效,dport/sport 过滤必须加引号和冒号,IPv6 地址含方括号需要特殊处理。

简单来说,ss 命令不仅仅是“能看就行”的替代品,而是高并发场景下查询 Linux 网络连接状态的可靠选择——作为 netstat 替代品,在 5 万连接负载下,netstat 需要 15 秒,而 ss 仅需 0.3 秒,并且直接从内核 socket 子系统读取数据,不依赖 /proc/net 解析,确保结果准确可靠。
Linux 查看端口监听:为什么 ss -tuln 必须带这四个字母
漏掉任意一个都会导致关键信息丢失或命令执行变慢:
-t和-u要一起用,否则无法查看 UDP 监听端口(比如 DNS、NTP);-l是“listening”的缩写,不加它就只显示已建立的连接,无法查看正在等待连接的端口;-n强制数字格式,防止 DNS 解析阻塞——尤其当/etc/hosts有异常或网络不通时,ss -tul可能导致命令挂起超过 10 秒;- 如果只关心 IPv4,末尾补
-4(如sudo ss -tulnp -4),否则双栈环境下 IPv6 地址(如[::]:22)会混合在结果中,增加排查难度。
排查已建立连接:ss -tun 和 ss -tn state established 的区别
ss -tun 默认包含所有非监听 TCP/UDP 连接,包括 CLOSE_WAIT、TIME_WAIT、FIN_WAIT1 等,适合排查连接泄漏问题;而 ss -tn state established 是显式过滤,只保留真正通信中的连接,字段第 5 列 Peer Address:Port 就是客户端 IP 和端口。常见误操作:
- 用
ss -tln查客户端——显示的是监听列表,无连接时则为空; - 用
grep :80替代内置过滤——会误匹配到192.168.80.1这类 IP,也会漏掉源端口为 80 的连接; - 正确的过滤语法:
ss -tn 'dport = :80'(别人连你 80),ss -tn 'sport = :80'(你主动用 80 当源端口)。
查看进程归属:加 -p 参数为何提示 Permission denied
-p 本身不报错,但没权限时内核拒绝提供进程信息,ss 会静默跳过——看似无输出,实则是权限不足导致。必须用 sudo ss -tulnp 才能看到其他用户的进程名和 PID;输出中最后一列形如 users:(("nginx",pid=1234,fd=6)),其中 pid 是进程 ID,fd 是该 socket 对应的文件描述符编号。注意:某些 Linux 发行版(如 Alpine)默认禁用 netlink 权限,即使加 sudo 也可能看不到进程,此时需检查内核配置或换用 lsof -i :端口 临时替代。
监控网络连接状态:ss -s 统计数据的含义
ss -s 不列具体连接,只给全局快照,关键看这几项:
tcp行里的estab是当前活跃连接数,time-wait超过 2 万需警惕端口耗尽;timewait 23182/0中斜杠后那个数字是哈希桶溢出次数,非零说明内核连接表压力过大,可能引发丢包或新建连接失败;CLOSE-WAIT多,基本等于本地方应用没调close();FIN-WAIT-2高,大概率是对端没发 FIN,或者本端 close 后没等完就退出进程;
不要使用 wc -l 统计行数来替代 ss -s——它统计的是 socket 实例,不是文本行数,ss -tan | wc -l 在 TIME_WAIT 多时严重低估真实连接负载。
真正容易被忽略的,是 ss 命令状态语义与过滤语法的耦合性:例如 state connected 和 state established 等价,但 state listen 仅对 -l 有效;dport 和 src 不能不加括号混用在同一条命令中;此外,IPv6 地址包含方括号,使用 cut -d: -f1 提取 IP 会截断 [::1] 成为空字符串——这些细节若不经过实践,很难真正掌握并正确使用 ss 命令。
