本节将介绍两个用于查看网络连接状态和统计信息的常用命令——ss 和 netstat。它们是排查网络问题、监控服务状态时必不可少的工具。整体而言,ss 是现代替代方案,速度更快、功能更强,但出于兼容性,很多系统上 netstat 仍被广泛使用。
1. 快速查看连接状态汇总
当你需要一眼看出当前服务器各类 TCP 连接的数量(如已建立、监听、TIME_WAIT 等),最快捷的方法是使用 ss 的统计模式。
命令:
ss -s
示例输出:
Total: 738
TCP: 327 (estab 42, closed 204, orphaned 11, timewait 152)
Transport Total IP IPv6
RAW 1 0 1
UDP 11 6 5
TCP 123 78 45
INET 135 84 51
FRAG 0 0 0
输出清晰地显示了 TCP 连接中各状态的计数,以及按协议族(IPv4/IPv6)划分的统计。这在判断服务器是否因 TIME_WAIT 连接过多、是否需要调整内核参数时非常有用。
2. 使用 netstat 按状态统计连接数
netstat 本身没有内置的统计摘要,但通过文本处理工具组合可以轻松实现。
常见命令:
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n
输出示例:
14 LISTEN
36 ESTABLISHED
45 TIME_WAIT
58 SYN_SENT
...
解释:
-a:显示所有连接(包括监听和非监听)。-n:以数字形式显示地址和端口(避免 DNS 反向解析,大幅提速)。-t:仅显示 TCP(若需 UDP 可加-u)。- 随后用
awk、sort、uniq组合统计各个连接状态的出现次数。
注意:由于
netstat需要遍历/proc信息,当连接数极大(数万级)时速度会明显变慢,此时应直接使用ss。
3. 用 ss 精确过滤特定状态的连接
ss 提供了强大的过滤语法,可以直接按 TCP 状态筛选,无需额外的工具拼接。
常用示例:
# 只查看所有处于 LISTEN 状态的 TCP 套接字
ss -tln state listening
# 或简写:
ss -tln state listen
# 查看所有已建立的连接
ss -tan state established
# 查看 TIME-WAIT 状态连接(通常用于观察短连接释放情况)
ss -tan state time-wait
你也可以使用表达式组合,例如查看所有非监听和非已建立的 TCP 连接:
ss -tan state all '!' \( listening or established \)
此外,ss 还可以直接匹配地址和端口:
# 查看所有连接到本地 80 端口的 ESTABLISHED 连接
ss -tan state established dst :80
4. ss 与 netstat 的实际选择指南
- 性能:当连接数超过数千时,
ss的响应速度明显优于netstat,因为它直接读取内核的 socket 信息,而非遍历/proc。 - 功能:
ss的过滤表达式远比netstat+grep的组合强大且精准。 - 兼容性:极少数老旧系统或最小化容器镜像可能默认未安装
ss,此时netstat仍是可靠后备工具。
如果系统同时可用,日常使用建议将 ss 作为首选。
5. 实用场景小记
- 故障排查:当 Web 服务无法绑定端口时,先用
ss -tln | grep :80确认端口是否已被占用。 - 性能预警:突然出现大量
TIME-WAIT连接(可能由短连接泛滥导致),用ss -s观察计数并考虑调整net.ipv4.tcp_tw_reuse等内核参数。 - 安全审计:使用
ss -tanp可以查看每一个已建立或监听的连接所属的进程名和 PID,快速发现异常后门连接。
掌握上述统计与过滤方法后,你将能够迅速锁定网络连接层面的异常,是每个 Linux 运维或开发人员的基础技能。