人人都会AI编程

ss、netstat:连接状态统计

更新时间:2026-07-12

本节将介绍两个用于查看网络连接状态和统计信息的常用命令——ssnetstat。它们是排查网络问题、监控服务状态时必不可少的工具。整体而言,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)。
  • 随后用 awksortuniq 组合统计各个连接状态的出现次数。

注意:由于 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. ssnetstat 的实际选择指南

  • 性能:当连接数超过数千时,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 运维或开发人员的基础技能。