最准最快查已建立tcp连接的方式是ss -tn state established;它避免netstat的慢与缺失问题,精准过滤estab状态,不混入非活跃连接,且无需dns解析。

直接用 ss -tn state established,这是最准、最快、最省资源的方式。 其他命令要么慢(netstat),要么默认混入大量非活跃连接(如 ss -tun),容易误判真实通信状态。
为什么不用 netstat 查已建立连接
netstat 在高并发场景下严重拖慢:5 万连接时耗时约 15 秒,且依赖解析 /proc/net,结果可能滞后或不一致;部分新发行版(如 Rocky Linux 9、Ubuntu 22.04+)默认不装 net-tools,还得额外安装。如果你执行 netstat -ant | grep ESTABLISHED 卡住或报 command not found,不是配置问题,是工具本身已被淘汰。
常见替代方案误区:
-
ss -tun默认包含CLOSE_WAIT、TIME_WAIT、FIN_WAIT1等非通信状态,数量常比真实活跃连接多出数倍 -
ss -t -a | grep ESTAB依赖文本匹配,可能漏掉字段对齐异常的行,也不支持 IPv6 地址中的方括号格式
ss -tn state established 的参数含义和必须项
这个命令不是“可选组合”,每个字母都有不可替代的作用:
-
-t:只看 TCP 协议——HTTP/HTTPS/SSH/MySQL 等主流服务都走 TCP,UDP 不适用此状态判断 -
-n:强制数字格式,避免 DNS 反解卡顿;若网络异常或/etc/hosts错误,-n缺失会导致命令挂起 10 秒以上 -
state established:内核级状态过滤,精准命中第 5 列为ESTAB的连接,不依赖字符串匹配 - 不能加
-u:UDP 没有 “established” 状态概念,加了会报错或静默忽略 - 不要加
-l:那是监听状态,和已建立连接互斥;加了反而清空输出
如何快速定位某个服务的活跃连接数
比如查 Nginx 正在处理的客户端连接,或 MySQL 被多少应用连着,关键不是“看到连接”,而是“算得准”:
- 统计总数:
ss -tn state established | wc -l - 按目标端口过滤(别人连你 80):
ss -tn 'dport = :80' state established(注意引号和冒号) - 按源 IP 统计连接数(防爬/限流参考):
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -5 - 带进程信息(需 root):
sudo ss -tn state established -p,输出末尾会出现users:(("nginx",pid=1234,fd=6))这类结构
注意:-p 必须配合 sudo 才能看到其他用户进程,否则静默跳过——这不是报错,是权限限制,容易误以为没连接。
容易被忽略的细节:IPv4/IPv6 混合环境下的干扰
默认 ss 同时查双栈,结果里会夹杂 [::]:22 或 [fe80::...]:54321 这类 IPv6 条目,干扰人工阅读或脚本解析。如果确认只用 IPv4:
- 加
-4参数:sudo ss -tn state established -4 - 不加
-4时,grep -v "\["可临时过滤,但不如原生命令干净 -
ss -s的统计行里estab后斜杠值(如estab 1234/512)若分母远小于分子,说明哈希桶溢出,内核 socket 子系统压力大,此时state established查询仍准,但整体系统已接近瓶颈











