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 查看对端 网络拥塞/对端慢 检查带宽和对方服务
相关推荐
攻城有术6 分钟前
专项攻克——研发排查Linux各类问题命令+实战案例
linux·运维·服务器
明志数科28 分钟前
具身智能数据工程全链路解析:从真实产线采集到LeRobot适配
网络·人工智能·算法
自动化和Linux44 分钟前
【win11+virtual Box简单安装centos7,不使用GPT分区】
linux·gpt·虚拟现实
Acrellea1 小时前
当机柜功率冲向 50kW,配电运维如何跟上算力的进化速度?
大数据·运维
牛油果子哥q1 小时前
C++ Socket精讲:TCP/UDP套接字、客户端服务端实现、字节序、粘包拆包、简单HTTP服务、网络踩坑与面试全解
网络·c++·tcp/ip
M158227690551 小时前
三格串口服务器:RS232/485 设备联网解决方案
运维·服务器·单片机
A hao1 小时前
户外LED广告牌需要什么防护等级IP级别?
大数据·网络·图像处理·人工智能·网络协议·tcp/ip·广告
rcms152702692181 小时前
Nikon 4S013-684-1 半导体放大器模块
网络
云上工程笔记1 小时前
ELI5:如何把复杂概念自动画成图,方便写文档、做分享、带新人
运维·服务器·网络·云计算
饼饼学习空间智能2 小时前
具身智能实训平台有哪些供应商?2026年机器人教学与仿真平台选型指南
运维·人工智能