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

一、命令语法结构

bash 复制代码
ss [options] [filter_expression]

ssSocket 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

bash 复制代码
$ 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

bash 复制代码
$ 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

bash 复制代码
$ 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 基本语法结构

bash 复制代码
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
bash 复制代码
# 只查看已建立连接
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 表达式组合

bash 复制代码
# 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 场景一:服务端口被占用?查谁在用!

bash 复制代码
# 问题:启动 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 性能参数!

bash 复制代码
# 问题:用户反馈访问 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 连接

bash 复制代码
# 问题:系统出现 "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 大量连接)

bash 复制代码
# 问题:服务器负载飙升,怀疑 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 场景五:接收/发送队列积压排查

bash 复制代码
# 问题:服务响应慢,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 场景六:查看所有监听服务(安全审计)

bash 复制代码
# 问题:安全审计,查看服务器开放了哪些端口
# 排查:显示所有监听端口及进程

$ 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 排查(进程间通信)

bash 复制代码
# 问题: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 输出(监控系统集成)

bash 复制代码
# 监控系统采集数据,使用 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

bash 复制代码
# 查看系统整体 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 常用别名配置

bash 复制代码
# 添加到 ~/.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 查看对端 网络拥塞/对端慢 检查带宽和对方服务
相关推荐
Zenova EdgeOS1 小时前
C++ 工业边缘 Qt 桌面应用实战:从 QWidget 到模型视图、网络与多线程
网络·c++·qt
szarron1 小时前
HT666 0.6-6GHz 定向高增益手持天线:EMC 测试与频谱定位实战指南
网络·算法·5g·信号处理·射频工程·频谱仪
Shadow(⊙o⊙)1 小时前
Linux网络部分——基于UDP的四大接口,实例应用,常考汇总,完整服务端、客户端设计流程+代码
linux·网络·udp
深念Y1 小时前
老Flyme 官方 root 开启 ADB TCP 方案
linux·数据库·网络协议·tcp/ip·adb·智能手机·emmc
小此方2 小时前
Re:Linux系统篇(五十二)线程篇 · 五:直击 Linux 内核底层:TCB 与 LWP 一体两面全解析(附自定义线程封装)
linux·运维·驱动开发
ltl10 小时前
校验和与数据完整性:CRC32C、xxHash 与端到端校验
linux
我是小灰灰吖11 小时前
Ubuntu 22.04 设置 CPU 性能模式:提升系统响应速度
linux·ubuntu
ltl11 小时前
持续性能分析:Parca、Pyroscope、Grafana Beyla
linux
ltl11 小时前
Direct I/O 与 O_DIRECT:绕过缓存的得与失
linux