ss是当前Linux查看网络连接的首选工具,netstat已被标记废弃;新系统默认不带netstat,且高并发下ss响应快数倍,因其直接读取内核tcp_diag模块,而netstat解析/proc/net/tcp等文件,导致万级连接时ss秒出结果、netstat可能卡顿数秒甚至超时。

直接看 ss -tunap,它能同时显示 TCP/UDP 连接、地址端口、进程 PID 和程序名——比 netstat 更快、更可靠,且默认预装在绝大多数现代发行版中。
为什么不用 netstat 查具体连接
netstat 在很多新系统(如 Ubuntu 22.04+、RHEL 9+、Alpine)里已不预装,需手动 apt install net-tools 或 dnf install net-tools;即使装了,它的输出解析慢、字段模糊(比如 Recv-Q/Send-Q 容易被误读为“未收/未发数据”,实际是内核 socket 队列长度),且不支持现代 cgroup 或 namespace 过滤。
-
ss基于netlink直接读取内核 socket 表,延迟低、精度高 -
ss -tunap中的-p要求 root 权限,普通用户运行会提示Permission denied,必须加sudo - 若只关心 ESTABLISHED 状态,用
ss -tun state established,避免混入大量 LISTEN 或 TIME-WAIT
ss -tunap 输出字段怎么看
执行 sudo ss -tunap 后,典型输出类似:
tcp 0 0 192.168.1.10:22 192.168.1.5:54322 ESTABLISHED 1234/sshd: user@pts
-
tcp:协议类型(还有udp、u_str等) -
0 0:Recv-Q / Send-Q,非零值可能表示接收或发送缓冲区积压(需结合应用日志判断) -
192.168.1.10:22:本地地址和端口,*表示监听所有接口 -
192.168.1.5:54322:对端地址和端口,*:*表示尚未建立连接(LISTEN 状态) -
ESTABLISHED:连接状态,常见还有LISTEN、CLOSE_WAIT、TIME-WAIT -
1234/sshd: user@pts:PID 和进程名,注意冒号后是进程的comm名,不是完整命令行
查某个端口被谁占用(最常用排查场景)
当服务启动失败提示 Address already in use,优先用 ss 定位:
- 查监听 8080 端口的进程:
sudo ss -tulpn 'sport == :8080'(单引号防 shell 解析) - 查连接到远程 443 端口的所有本地进程:
sudo ss -tun dst :443 - 查特定 PID 的所有网络连接:
sudo ss -tunp | grep '1234$'(结尾 $ 防匹配到其他 PID 子串) - 如果
ss -tunap没显示进程名,说明该 socket 属于已退出但文件描述符未关闭的僵尸进程,或容器内进程(需进对应 namespace 查)
权限和兼容性容易忽略的点
ss -tunap 必须用 sudo,否则看不到 -p 字段;但 ss -tunl(只看监听端口)普通用户就能跑。另外:
- Docker 容器内执行
ss只能看到容器 namespace 内的连接,看不到宿主机全局视图 - 某些加固系统(如 SELinux enforcing + strict policy)可能拦截
ss -p的进程信息读取,此时会显示users:(("?",pid,fd)) -
lsof -i :端口是备选方案,但它依赖 /proc 文件系统遍历,比ss慢且在容器或 chroot 环境下常失效


















