Linux ss 命令完全指南:网络套接字诊断从入门到精通
前言 在 Linux 服务器运维中,网络套接字诊断是最常见的需求之一。传统上我们用 netstat 查看网络连接状态,但 netstat 已属过时工具,在较新的发行版中甚至不再默认安装。它的现代替代者——ss(Socket Statistics) 凭借更快的速度、更丰富的信息和更灵活的过滤能力,已经成为网络诊断的首选工具。本文将全面介绍 ss 命令的使用方法。
一、ss 与 netstat 对比 ss 命令读取 /proc/net/ 下的内核信息,直接与内核的套接字诊断接口通信,而 netstat 则遍历 /proc 中的每个条目。这使得 ss 在处理大量并发连接时速度远超 netstat。
特性 ss netstat
速度 快(直接读取内核诊断接口) 慢(遍历 /proc 条目)
默认安装 部分发行版默认安装(iproute2 包) 需额外安装(net-tools 包)
TCP 状态过滤 支持(丰富且灵活) 有限
显示进程信息 需 -p 选项 需 -p 选项
UNIX 套接字 支持(显示详细) 支持
内核态连接 支持(需 root) 不支持
二、安装 ss ss 命令包含在 iproute2 软件包中:
1 2 3 4 5 6 7 8 sudo apt install iproute2sudo dnf install iproutess --version
三、基础用法 3.1 查看所有套接字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ss -a ss -l ss -t ss -u ss -x ss -w
3.2 常用选项组合 以下是最常用的组合方式:
1 2 3 4 5 6 7 8 9 10 11 ss -tlnp ss -tup ss -tanp ss -s
各选项含义:
-t:仅显示 TCP 套接字
-u:仅显示 UDP 套接字
-l:仅显示监听状态的套接字
-a:显示所有套接字
-n:不解析服务名(显示数字端口,速度更快)
-p:显示进程信息
-s:打印统计摘要
3.3 统计摘要 ss -s 输出服务端最关心的全局连接概况:
1 2 3 4 5 6 7 8 9 10 11 $ ss -s Total: 432 (kernel 476) TCP: 48 (established 12, closed 30, orphaned 0, synrecv 0, timewait 2, ports 24) Transport Total IP IPv6 * 476 - - RAW 0 0 0 UDP 10 8 2 TCP 18 14 4 INET 28 22 6 FRAG 0 0 0
通过这个输出,你可以快速判断服务器当前的连接压力——established 数量、timewait 数量等。
四、TCP 状态过滤 ss 最强大的功能之一是按 TCP 状态过滤连接。这对排查网络问题极为有用。
4.1 状态过滤语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ss state established ss state time-wait ss state close-wait ss state listening ss state syn-sent
4.2 排除特定状态 1 2 3 4 5 ss -t state established ss -t '( dport = :80 or sport = :80 )' | grep ESTAB
4.3 全部 TCP 状态 TCP 状态名称在 ss 中使用连字符形式:
ss 状态名 说明 排查意义
established已建立的连接 正常连接数
syn-sent正在发起连接(SYN 已发出) 出站连接异常时多发
syn-recv收到 SYN 包 半连接攻击时暴涨
fin-wait-1主动关闭,FIN 已发出 正常情况下短暂存在
fin-wait-2主动关闭,收到 ACK 积压说明对端不关闭
time-wait连接已关闭,等待 2MSL 大量影响端口复用
close-wait被动关闭,等待应用 close() 应用层 bug 的典型表现
last-ack等待最后的 ACK 积压说明对端异常
listening监听状态 服务是否正常监听
closing双方同时关闭 罕见
五、端口和地址过滤 5.1 按端口号过滤 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ss -tlnp sport = :80 ss -tanp dport = :443 ss -tanp '( sport = :3306 or dport = :3306 )' ss -tlnp sport >= :1024 ss -tanp not dport = :22
5.2 按 IP 地址过滤 1 2 3 4 5 6 7 8 ss -tnp src 192.168.1.100 ss -tnp dst 10.0.0.0/16 ss -tnp src 10.0.0.5 and dport = :443
5.3 使用表达式语法 ss 支持逻辑运算符组合多个条件:
1 2 3 4 5 6 7 8 ss -tlnp '( sport = :http or sport = :https )' ss -tnp not src 127.0.0.1 ss -tnp state established and not port = :22
六、UNIX 套接字查看 1 2 3 4 5 6 7 8 9 10 11 ss -x ss -xlp ss -x | grep /var/run/docker.sock ss -x state datagram
UNIX 套接字对于排查本地进程间通信(IPC)问题非常有用,例如 Nginx 与 PHP-FPM 的 Unix Socket 通信问题。
七、实战场景 场景 1:排查端口被占用 1 2 3 4 5 ss -tlnp | grep :8080 LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users :(("java",pid=12345 ,fd=22 ))
看到 LISTEN 状态的记录说明端口已被 Java 进程(PID 12345)占用。
场景 2:排查 TIME_WAIT 积压 1 2 3 4 5 6 7 8 ss -tan state time-wait | wc -l ss -tan state time-wait | awk '{print $4}' | sort | uniq -c | sort -rn | head -10 ss -tan state time-wait | awk '{print $5}' | sort | uniq -c | sort -rn | head -10
如果 TIME-WAIT 数量超过数万,可能需要调整内核参数 net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_fin_timeout。
场景 3:查找 CLOSE_WAIT 连接 CLOSE_WAIT 过多通常表示应用层存在 Bug(未正确调用 close()):
1 2 3 4 5 6 7 8 ss -tan state close-wait | wc -l ss -tanp state close-wait ss -tanp state close-wait | grep -oP 'users:\(\(\K[^,)]+' | sort | uniq -c | sort -rn
场景 4:监控连接变化 1 2 3 4 5 6 7 8 watch 'ss -tanp | head -50' watch 'ss -tan state established | grep :443 | wc -l' watch -n 1 'echo "ESTAB: $(ss -t state est | wc -l)"'
场景 5:检查 Nginx 工作状态 1 2 3 4 5 6 7 8 ss -tlnp | grep nginx ss -tanp state established | grep nginx ss -xlp | grep php
八、输出格式解读 ss 的默认输出格式为:
1 2 3 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp ESTAB 0 0 192.168.1.10:22 192.168.1.5:54321
各字段含义:
Netid :协议类型(tcp、udp、raw、u_str 等)
State :连接状态(LISTEN、ESTAB、TIME-WAIT 等)
Recv-Q :接收队列中等待应用程序读取的字节数
Send-Q :发送队列中等待发送的字节数
Local Address:Port :本地地址和端口
Peer Address:Port :对端地址和端口
提示 :如果 Recv-Q 长期不为 0,说明应用层读取缓慢;Send-Q 长期不为 0 说明对端接收能力不足或网络拥塞。
九、ss 进阶技巧 9.1 显示计时器和拥塞信息
-i 选项会显示 TCP 内部信息,包括拥塞窗口(cwnd)、RTT(往返时间)、重传信息等,对网络调优非常有价值。
9.2 显示内存使用
-m 选项显示套接字的内存使用情况,可用于排查内存泄漏。
9.3 显示所有内核 TCP 参数
9.4 使用 JSON 输出(便于脚本处理)
9.5 不解析主机名和服务名(加快速度)
-n 可大幅提升在大批量连接时的输出速度。
十、常见问题排查
问题 排查命令 可能原因
端口被占用 ss -tlnp | grep :PORT其他进程正在监听该端口
连接不上服务 ss -tlnp | grep :PORT服务未启动或防火墙阻止
TIME-WAIT 过多 ss -tan state time-wait短连接频率过高需调优
CLOSE-WAIT 过多 ss -tanp state close-wait应用层未正确关闭连接
连接数暴增 ss -sCC 攻击或突发流量
Recv-Q 堆积 ss -tan | grep -v 'Recv-Q 0'应用读取性能瓶颈
大量 SYN_RECV ss -tan state syn-recv | wc -l可能是 SYN Flood 攻击
TCP 重传率高 ss -ti | grep retrans网络丢包或带宽不足
十一、命令速查表
场景 命令
所有监听端口(含进程) ss -tlnp
所有已建立 TCP 连接 ss -tan state established
所有 UDP 监听 ss -uln
统计摘要 ss -s
查看 TIME-WAIT 连接 ss -tan state time-wait
查看 CLOSE-WAIT 连接 ss -tan state close-wait
查看指定端口 ss -tanp sport = :80
查看来自 IP 的连接 ss -tnp src 10.0.0.1
UNIX 套接字(含进程) ss -xlp
TCP 内部信息(RTT/拥塞窗口) ss -ti
持续监控连接数 watch -n 1 'ss -s'
JSON 格式输出 ss -tlnj
十二、安全与性能提示
-p 选项需要 root 权限 :普通用户运行 ss -p 可能看不到完整进程信息。
避免在高并发环境默认使用 -j :JSON 输出需要额外的处理开销,对性能有影响。
生产环境慎用 watch 高频刷新 :watch -n 1 每秒执行一次 ss 查询,在高并发服务器上会造成一定的 CPU 开销,建议将间隔设为 3 秒以上。
结合 iptables 日志使用 :ss 无法显示被防火墙丢弃的数据包,需配合 iptables 日志或 nftables 监控。
结语 ss 命令作为 Linux 网络诊断工具箱中的核心工具,其速度优势和处理大量连接时的稳定性使其成为 netstat 的当之无愧的替代者。掌握 ss 的各类过滤语法和状态分析能力,可以大幅提升你在服务器网络问题排查中的效率——从端口冲突到连接状态异常,从性能瓶颈到安全攻击,ss 都能提供第一手的关键信息。
建议你有空时可以执行 ss -s 和 ss -tanp 快速了解服务器当前的连接状况,慢慢地这些命令会成为你下意识的动作。
本文由AI辅助生成,内容仅供参考