一、命令语法结构
ss [options] [filter_expression]
ss 是 Socket Statistics 的缩写,是 Linux 下比 netstat 更强大、更高效的网络连接查看工具。它直接从内核获取 socket 信息,速度快、输出详细,是网络排查的首选利器。
二、核心选项详解(Options)
2.1 Socket 类型筛选(可叠加)
| 选项 |
含义 |
使用场景 |
-t |
TCP socket |
最常用,查看 TCP 连接 |
-u |
UDP socket |
查看 UDP 会话 |
-w |
RAW socket |
查看原始套接字(如 ICMP) |
-x |
Unix domain socket |
查看进程间通信 socket |
-d |
DCCP 协议 |
数据报拥塞控制协议(较少用) |
-l |
仅显示 listening |
只看监听中的服务端口 |
-a |
所有状态 |
包含 listening + established + 其他所有状态 |
-r |
解析主机名/服务名 |
默认行为,但会变慢 |
-n |
数字显示(不解析) |
强烈推荐,避免 DNS 卡顿 |
关键点 :TCP 类型(-t)默认只显示 non-listening 状态,即 established、time-wait 等。想看监听端口必须加 -l 或 -a。
2.2 输出格式控制
| 选项 |
含义 |
实战价值 |
-p |
显示进程名和 PID |
排查哪个进程占用了端口 |
-e |
扩展信息(socket 详细信息) |
查看 uid、ino 等底层信息 |
-i |
TCP 内部细节 |
查看 cwnd、rtt、ssthresh、拥塞窗口 ------ 排查网络性能 |
-o |
计时器信息 |
查看重传定时器、keepalive、超时时间 |
-m |
socket 内存用量 |
查看收发缓冲区大小、内存占用 |
-4 |
仅 IPv4 |
过滤 IPv4 连接 |
-6 |
仅 IPv6 |
过滤 IPv6 连接 |
-H |
不打印表头 |
便于脚本解析 |
-O |
JSON 格式输出 |
程序化处理(监控系统采集) |
-b |
显示 cgroup 信息 |
容器环境识别进程归属 |
-s |
汇总统计 |
快速查看协议统计计数 |
三、输出字段详解(看懂每一列)
3.1 标准输出格式(ss -tln)
$ ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
| 字段 |
含义 |
排查要点 |
| State |
socket 状态 |
LISTEN/ESTAB/TIME-WAIT 等 |
| Recv-Q |
接收队列积压字节数 |
>0 表示应用层未及时读取数据 |
| Send-Q |
发送队列积压字节数 |
>0 表示数据未发送完成或对方未确认 |
| Local Address:Port |
本地地址和端口 |
服务监听的 IP 和端口 |
| Peer Address:Port |
对端地址和端口 |
连接的对端 IP 和端口(* 表示监听) |
3.2 高级输出(ss -tin)
$ ss -tin state established sport = :443
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.10:443 10.0.0.5:54321
cubic wscale:7,7 rto:204 rtt:12.5/2.3 ato:40 cwnd:10 ssthresh:256 send 1.2Mbps rcv_rtt:1 rcv_space:29200
TCP 细节字段解读:
| 字段 |
含义 |
排查价值 |
cubic |
拥塞控制算法 |
是否为 cubic/bbr |
wscale |
窗口缩放因子 |
支持大窗口传输 |
rto |
重传超时时间(ms) |
>1000ms 可能网络延迟高或丢包 |
rtt |
往返时延(ms) |
网络延迟指标 |
rttvar |
RTT 方差 |
网络抖动程度 |
ato |
延迟确认超时 |
TCP 延迟确认机制 |
cwnd |
拥塞窗口大小(包数) |
吞吐量关键指标 |
ssthresh |
慢启动阈值 |
拥塞控制状态 |
send |
发送速率 |
实际传输速度 |
rcv_rtt |
接收端 RTT |
对端延迟视角 |
rcv_space |
接收端通告窗口 |
对端缓冲区大小 |
3.3 进程信息(ss -tnlp)
$ ss -tlnp sport = :22
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=4))
四、过滤表达式详解(Filter Expression)
4.1 基本语法结构
ss [options] [state <STATE>] [条件表达式]
重要区别 :ss 的过滤语法不是 tcpdump 的 BPF ,而是键值对匹配 ,推荐始终使用 = 运算符以避免歧义。
4.2 状态过滤(可用的所有状态)
established syn-sent syn-recv fin-wait-1 fin-wait-2
time-wait closed close-wait last-ack listening
closing all
# 只查看已建立连接
ss state established
# 只查看 TIME_WAIT 状态的连接(排查端口耗尽)
ss state time-wait
# 查看所有状态
ss state all
4.3 地址/端口过滤
| 过滤条件 |
语法示例 |
实战场景 |
| 源端口 |
sport = :22 |
查看 SSH 服务端连接 |
| 目标端口 |
dport = :443 |
查看 HTTPS 客户端连接 |
| 源地址 |
src 192.168.1.1 |
查看来自某 IP 的连接 |
| 源网段 |
src 192.168.1.0/24 |
查看内网某网段的连接 |
| 目标地址 |
dst 10.0.0.5 |
查看发往某 IP 的连接 |
| 地址+端口 |
src 192.168.1.1:443 |
精确匹配 |
| 排除条件 |
src != 192.168.1.1 sport != :22 |
过滤掉某个 IP/端口 |
4.4 表达式组合
# OR 组合:匹配 80 或 443 端口
ss -tn '( sport = :80 or sport = :443 )'
# AND 组合:已建立且来自内网
ss state established and src 10.0.0.0/8
# 复杂组合:已建立且(80 或 443)且来自 192.168.x.x
ss -tn state established and src 192.168.0.0/16 and '( sport = :80 or sport = :443 )'
五、实战场景与实例输出
5.1 场景一:服务端口被占用?查谁在用!
# 问题:启动 nginx 报错 "port 80 already in use"
# 排查:查看 80 端口被哪个进程占用
$ ss -tlnp sport = :80
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=12345,fd=6))
LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=12345,fd=7))
# 结论:nginx (PID 12345) 正在占用 80 端口
# 解决方案:kill -9 12345 或修改 nginx 配置
5.2 场景二:网站访问慢?看 TCP 性能参数!
# 问题:用户反馈访问 Web 服务慢
# 排查:查看 443 端口的 TCP 细节
$ ss -tin state established sport = :443
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.10:443 10.0.0.5:39821
cubic wscale:7,7 rto:204 rtt:12.5/2.3 ato:40 cwnd:10 ssthresh:256 send 1.2Mbps rcv_rtt:1 rcv_space:29200
ESTAB 0 0 192.168.1.10:443 10.0.0.8:48123
cubic wscale:7,7 rto:800 rtt:345.2/120.5 ato:40 cwnd:3 ssthresh:10 send 0.2Mbps rcv_rtt:2 rcv_space:29200
# 🔍 分析:
# - 第一个连接:rtt=12.5ms(延迟正常),cwnd=10(窗口适中),速率 1.2Mbps
# - 第二个连接:rtt=345ms(延迟高!),cwnd=3(窗口很小),速率仅 0.2Mbps
# - 且 rto=800ms(重传超时很高),ssthresh=10(已进入拥塞避免)
#
# 🎯 结论:第二个连接可能存在网络丢包或对端带宽受限
# 💡 建议:检查对端 10.0.0.8 的网络状况,或调整拥塞控制算法为 bbr
5.3 场景三:排查大量 TIME_WAIT 连接
# 问题:系统出现 "Cannot assign requested address" 错误
# 排查:查看 TIME_WAIT 数量是否过多
$ ss -t state time-wait | wc -l
8543
# 分析:8543 个 TIME_WAIT,可能耗尽本地端口(默认范围 32768-60999,约 28000 个)
# 如果短期内达到 28000,就会出现端口耗尽
# 查看具体 TIME_WAIT 分布
$ ss -t state time-wait sport = :80 | head -5
TIME-WAIT 0 0 192.168.1.10:80 10.0.0.5:54321
TIME-WAIT 0 0 192.168.1.10:80 10.0.0.5:54322
TIME-WAIT 0 0 192.168.1.10:80 10.0.0.5:54323
...
# 💡 解决方案:调整内核参数 net.ipv4.tcp_tw_reuse=1
# 或减少 net.ipv4.tcp_fin_timeout 值
5.4 场景四:DDoS 攻击检测(单 IP 大量连接)
# 问题:服务器负载飙升,怀疑 CC 攻击
# 排查:查看 ESTAB 连接数 TOP 10
$ ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
1256 203.0.113.100
432 203.0.113.105
89 192.168.1.100
12 10.0.0.5
8 192.168.1.1
# 🔍 分析:203.0.113.100 有 1256 个 ESTAB 连接,远超正常值!
# 🎯 结论:该 IP 疑似攻击源
# 查看该 IP 的详细连接
$ ss -tn state established src 203.0.113.100
ESTAB 0 0 192.168.1.10:443 203.0.113.100:48723
ESTAB 0 0 192.168.1.10:443 203.0.113.100:48724
...(共 1256 行)
# 💡 解决方案:iptables -A INPUT -s 203.0.113.100 -j DROP
5.5 场景五:接收/发送队列积压排查
# 问题:服务响应慢,Recv-Q / Send-Q 数值异常
$ ss -tn | head -5
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.10:80 10.0.0.5:39821
ESTAB 12568 0 192.168.1.10:80 10.0.0.8:48123 # ⚠️ Recv-Q=12568
ESTAB 0 0 192.168.1.10:80 10.0.0.3:51234
ESTAB 0 37654 192.168.1.10:80 10.0.0.9:49123 # ⚠️ Send-Q=37654
# 🔍 分析:
# - Recv-Q=12568:内核接收缓冲区有 12KB 数据,应用层未读取 → 应用处理能力不足
# - Send-Q=37654:内核发送缓冲区有 37KB 数据未发送 → 对端接收慢或网络拥塞
#
# 💡 解决方案:
# - Recv-Q 高:检查应用进程是否卡死,调大应用读取速度
# - Send-Q 高:检查对端处理能力,或网络带宽是否受限
5.6 场景六:查看所有监听服务(安全审计)
# 问题:安全审计,查看服务器开放了哪些端口
# 排查:显示所有监听端口及进程
$ ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=12345,fd=6))
tcp LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=12345,fd=7))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=2345,fd=22))
udp UNCONN 0 0 0.0.0.0:53 0.0.0.0:* users:(("dnsmasq",pid=3456,fd=5))
# 🔍 分析:
# - 22: SSH(外部访问)
# - 80/443: Nginx Web 服务(外部访问)
# - 3306: MySQL 只监听 127.0.0.1(安全,仅本机访问)
# - 53: DNS 服务(UDP)
#
# ⚠️ 检查是否有异常端口开放,如 4444、6667 等可疑端口
5.7 场景七:Unix Domain Socket 排查(进程间通信)
# 问题:Docker/容器服务通信异常
# 排查:查看 Unix socket 状态
$ ss -xlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 /run/docker.sock * users:(("dockerd",pid=5678,fd=3))
LISTEN 0 128 /var/run/dbus/system_bus_socket * users:(("dbus-daemon",pid=7890,fd=3))
# 分析:docker.sock 存在且监听正常,说明 Docker 服务可访问
# 如果 docker.sock 不存在 → Docker 服务未启动
5.8 场景八:JSON 输出(监控系统集成)
# 监控系统采集数据,使用 JSON 格式便于解析
$ ss -tlnO sport = :443
[
{
"netid": "tcp",
"state": "LISTEN",
"recv-q": 0,
"send-q": 0,
"local": "0.0.0.0:443",
"peer": "0.0.0.0:*",
"process": "nginx"
}
]
# 可用 jq 处理
$ ss -tlnO sport = :443 | jq '.[] | {port: .local, state: .state}'
{
"port": "0.0.0.0:443",
"state": "LISTEN"
}
六、统计信息模式(ss -s)
# 查看系统整体 socket 统计
$ ss -s
Total: 1256 (kernel 1892)
TCP: 456 (estab 123, closed 285, orphaned 12, timewait 42)
Transport Total IP IPv6
RAW 2 1 1
UDP 8 6 2
TCP 456 423 33
INET 466 430 36
FRAG 0 0 0
# 🔍 解读:
# - Total: 1256 个 socket,kernel 级 1892(含未显示)
# - estab 123:当前活跃连接数
# - closed 285:已关闭但未释放的 socket
# - timewait 42:TIME_WAIT 状态数量
# - orphaned 12:孤儿连接(需要关注,可能连接泄漏)
# ⚠️ 如果 orphaned 持续增长 → 应用程序可能存在 socket 泄漏
七、状态流转图(帮助理解)
客户端连接流程:
CLOSED
↓ (connect)
SYN-SENT
↓ (收到 SYN+ACK)
ESTABLISHED
↓ (发送 FIN)
FIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT → CLOSED
服务端监听流程:
CLOSED
↓ (bind + listen)
LISTEN
↓ (收到 SYN)
SYN-RECV
↓ (发送 SYN+ACK)
ESTABLISHED
↓ (收到 FIN)
CLOSE-WAIT → LAST-ACK → CLOSED
八、快速故障排查流程图
用户报障 "服务访问不了"
↓
ss -tlnp sport = :端口 → 服务是否在监听?
├─ 否 → 检查服务进程是否启动
└─ 是 → ss -tn state established dst 对端IP
├─ 无连接 → 检查防火墙/网络路由
└─ 有连接 → ss -tin 查看性能参数
├─ rtt > 200ms → 网络延迟高
├─ cwnd < 10 → 拥塞控制受限
├─ rto > 500ms → 丢包重传
└─ Recv-Q/Send-Q > 0 → 应用层瓶颈
九、推荐最佳实践
9.1 常用别名配置
# 添加到 ~/.bashrc 或 ~/.zshrc
alias ssall='ss -tunap' # 所有连接 + 进程
alias ssl='ss -tlnp' # 所有监听端口 + 进程
alias ssc='ss -tunp state established' # 仅已建立连接
alias ssw='ss -tn state time-wait' # TIME_WAIT 连接
alias ssm='ss -tin' # TCP 性能参数
# 端口查询函数
ssport() {
ss -tlnp sport = :$1 | grep -v "^State"
}
# 连接数统计
sscount() {
echo "ESTAB: $(ss -t state established | wc -l)"
echo "TIME_WAIT: $(ss -t state time-wait | wc -l)"
echo "LISTEN: $(ss -t state listening | wc -l)"
}
9.2 生产环境排查 checklist
| 步骤 |
命令 |
检查项 |
正常值 |
| 1 |
ss -tlnp sport = :端口 |
服务是否监听 |
LISTEN 状态 |
| 2 |
`ss -tn state established |
wc -l` |
活跃连接数 |
| 3 |
ss -tin state established |
RTT、CWND |
rtt < 100ms |
| 4 |
`ss -tn |
grep -v "0 0"` |
队列积压 |
| 5 |
`ss -t state time-wait |
wc -l` |
TIME_WAIT 数量 |
| 6 |
`ss -s |
grep orphaned` |
孤儿连接 |
9.3 常见问题速查表
| 现象 |
排查命令 |
可能原因 |
解决方案 |
| 端口被占用 |
ss -tlnp sport = :端口 |
进程未退出 |
kill 对应 PID |
| 网站访问慢 |
ss -tin src 客户端IP |
rtt 高/丢包 |
检查网络链路 |
| 连接数暴涨 |
`ss -tn |
awk '{print $5}' |
cut -d: -f1 |
| Cannot assign requested address |
`ss -t state time-wait |
wc -l` |
端口耗尽 |
| Recv-Q 持续增长 |
ss -tnp 查看对应 PID |
应用处理慢 |
检查应用日志 |
| Send-Q 持续增长 |
ss -tnp 查看对端 |
网络拥塞/对端慢 |
检查带宽和对方服务 |