Sublarge

// Linux · 2026-08-07

ss 命令指南:网络排查神器

Linux ss 命令详解 ss (Socket Statistics) 是 Linux 下高效查看网络连接信息的工具,直接读取内核 socket 数据,比 netstat 更快更详细。 核心功能 支持 TCP/UDP/RAW/Unix 等 socket 类型筛选 提供连接状态、队列、性能参数等详细信息 可显示占用端口的进程信息 支持地址/端口/状态等多种过滤条件

一、命令语法结构

ss [options] [filter_expression]
bash1 行

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              [::]:*
bash4 行
字段 含义 排查要点
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
bash4 行

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))
bash4 行

四、过滤表达式详解(Filter Expression)

4.1 基本语法结构

ss [options] [state <STATE>] [条件表达式]
bash1 行

重要区别: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
text3 行
# 只查看已建立连接
ss state established

# 只查看 TIME_WAIT 状态的连接(排查端口耗尽)
ss state time-wait

# 查看所有状态
ss state all
bash8 行

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 )'
bash8 行

五、实战场景与实例输出

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 配置
bash10 行

5.2 场景二:网站访问慢?看 TCP 性能参数!

5.3 场景三:排查大量 TIME_WAIT 连接

5.4 场景四:DDoS 攻击检测(单 IP 大量连接)

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 高:检查对端处理能力,或网络带宽是否受限
bash16 行

5.6 场景六:查看所有监听服务(安全审计)

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 服务未启动
bash10 行

5.8 场景八:JSON 输出(监控系统集成)


六、统计信息模式(ss -s)


七、状态流转图(帮助理解)


八、快速故障排查流程图

用户报障 "服务访问不了"
    ↓
ss -tlnp sport = :端口 → 服务是否在监听?
    ├─ 否 → 检查服务进程是否启动
    └─ 是 → ss -tn state established dst 对端IP
              ├─ 无连接 → 检查防火墙/网络路由
              └─ 有连接 → ss -tin 查看性能参数
                          ├─ rtt > 200ms → 网络延迟高
                          ├─ cwnd < 10 → 拥塞控制受限
                          ├─ rto > 500ms → 丢包重传
                          └─ Recv-Q/Send-Q > 0 → 应用层瓶颈
text11 行

九、推荐最佳实践

9.1 常用别名配置

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" 队列积压 Recv-Q/Send-Q 全为 0
5 ss -t state time-wait | wc -l TIME_WAIT 数量 < 20000
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 | sort | uniq -c | sort -nr 流量攻击 iptables 封禁
Cannot assign requested address ss -t state time-wait | wc -l 端口耗尽 调整 tw_reuse/tw_recycle
Recv-Q 持续增长 ss -tnp 查看对应 PID 应用处理慢 检查应用日志
Send-Q 持续增长 ss -tnp 查看对端 网络拥塞/对端慢 检查带宽和对方服务

原文 https://blog.csdn.net/2301_79518550/article/details/163574413