// Linux · 2026-08-07
ss 命令指南:网络排查神器 Linux ss 命令详解 ss (Socket Statistics) 是 Linux 下高效查看网络连接信息的工具,直接读取内核 socket 数据,比 netstat 更快更详细。 核心功能 支持 TCP/UDP/RAW/Unix 等 socket 类型筛选 提供连接状态、队列、性能参数等详细信息 可显示占用端口的进程信息 支持地址/端口/状态等多种过滤条件
一、命令语法结构
ss [options] [ filter_expression ] bash 1 行 复制
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 [ :: ] : * bash 4 行 复制
字段
含义
排查要点
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 bash 4 行 复制
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 )) bash 4 行 复制
四、过滤表达式详解(Filter Expression)
4.1 基本语法结构
ss [options] [ state < STATE > ] [ 条件表达式 ] bash 1 行 复制
重要区别 :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 text 3 行 复制
# 只查看已建立连接
ss state established
# 只查看 TIME_WAIT 状态的连接(排查端口耗尽)
ss state time-wait
# 查看所有状态
ss state all bash 8 行 复制
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.1sport != :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 ) ' bash 8 行 复制
五、实战场景与实例输出
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 配置 bash 10 行 复制
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 展开全部 18 行 bash 18 行 复制 展开
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 值 展开全部 18 行 bash 18 行 复制 展开
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 展开全部 20 行 bash 20 行 复制 展开
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 高:检查对端处理能力,或网络带宽是否受限 bash 16 行 复制
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 等可疑端口 展开全部 18 行 bash 18 行 复制 展开
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 服务未启动 bash 10 行 复制
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 "
} 展开全部 21 行 bash 21 行 复制 展开
六、统计信息模式(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 泄漏 展开全部 21 行 bash 21 行 复制 展开
七、状态流转图(帮助理解)
客户端连接流程:
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 展开全部 19 行 text 19 行 复制 展开
八、快速故障排查流程图
用户报障 "服务访问不了"
↓
ss -tlnp sport = :端口 → 服务是否在监听?
├─ 否 → 检查服务进程是否启动
└─ 是 → ss -tn state established dst 对端IP
├─ 无连接 → 检查防火墙/网络路由
└─ 有连接 → ss -tin 查看性能参数
├─ rtt > 200ms → 网络延迟高
├─ cwnd < 10 → 拥塞控制受限
├─ rto > 500ms → 丢包重传
└─ Recv-Q/Send-Q > 0 → 应用层瓶颈 text 11 行 复制
九、推荐最佳实践
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 )"
} 展开全部 18 行 bash 18 行 复制 展开
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