当前位置: 首页 > news >正文

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

一、命令语法结构

ss[options][filter_expression]

ssSocket Statistics的缩写,是 Linux 下比netstat更强大、更高效的网络连接查看工具。它直接从内核获取 socket 信息,速度快、输出详细,是网络排查的首选利器。


二、核心选项详解(Options)

2.1 Socket 类型筛选(可叠加)

选项含义使用场景
-tTCP socket最常用,查看 TCP 连接
-uUDP socket查看 UDP 会话
-wRAW socket查看原始套接字(如 ICMP)
-xUnix domain socket查看进程间通信 socket
-dDCCP 协议数据报拥塞控制协议(较少用)
-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 等底层信息
-iTCP 内部细节查看 cwnd、rtt、ssthresh、拥塞窗口 ——排查网络性能
-o计时器信息查看重传定时器、keepalive、超时时间
-msocket 内存用量查看收发缓冲区大小、内存占用
-4仅 IPv4过滤 IPv4 连接
-6仅 IPv6过滤 IPv6 连接
-H不打印表头便于脚本解析
-OJSON 格式输出程序化处理(监控系统采集)
-b显示 cgroup 信息容器环境识别进程归属
-s汇总统计快速查看协议统计计数

三、输出字段详解(看懂每一列)

3.1 标准输出格式(ss -tln

$ ss-tlnState Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN01280.0.0.0:220.0.0.0:* LISTEN0128[::]:22[::]:*
字段含义排查要点
Statesocket 状态LISTEN/ESTAB/TIME-WAIT 等
Recv-Q接收队列积压字节数>0 表示应用层未及时读取数据
Send-Q发送队列积压字节数>0 表示数据未发送完成或对方未确认
Local Address:Port本地地址和端口服务监听的 IP 和端口
Peer Address:Port对端地址和端口连接的对端 IP 和端口(*表示监听)

3.2 高级输出(ss -tin

$ ss-tinstate established sport=:443 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB00192.168.1.10:44310.0.0.5:54321 cubic wscale:7,7 rto:204 rtt:12.5/2.3 ato:40 cwnd:10 ssthresh:256 send1.2Mbps rcv_rtt:1 rcv_space:29200

TCP 细节字段解读

字段含义排查价值
cubic拥塞控制算法是否为 cubic/bbr
wscale窗口缩放因子支持大窗口传输
rto重传超时时间(ms)>1000ms 可能网络延迟高或丢包
rtt往返时延(ms)网络延迟指标
rttvarRTT 方差网络抖动程度
ato延迟确认超时TCP 延迟确认机制
cwnd拥塞窗口大小(包数)吞吐量关键指标
ssthresh慢启动阈值拥塞控制状态
send发送速率实际传输速度
rcv_rtt接收端 RTT对端延迟视角
rcv_space接收端通告窗口对端缓冲区大小

3.3 进程信息(ss -tnlp

$ ss-tlnpsport=:22 State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN01280.0.0.0:220.0.0.0:* users:(("sshd",pid=1234,fd=3))LISTEN0128[::]: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 src10.0.0.0/8# 复杂组合:已建立且(80 或 443)且来自 192.168.x.xss-tnstate established and src192.168.0.0/16 and'( sport = :80 or sport = :443 )'

五、实战场景与实例输出

5.1 场景一:服务端口被占用?查谁在用!

# 问题:启动 nginx 报错 "port 80 already in use"# 排查:查看 80 端口被哪个进程占用$ ss-tlnpsport=:80 State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN01280.0.0.0:800.0.0.0:* users:(("nginx",pid=12345,fd=6))LISTEN0128[::]:80[::]:* users:(("nginx",pid=12345,fd=7))# 结论:nginx (PID 12345) 正在占用 80 端口# 解决方案:kill -9 12345 或修改 nginx 配置

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

# 问题:用户反馈访问 Web 服务慢# 排查:查看 443 端口的 TCP 细节$ ss-tinstate established sport=:443 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB00192.168.1.10:44310.0.0.5:39821 cubic wscale:7,7 rto:204 rtt:12.5/2.3 ato:40 cwnd:10 ssthresh:256 send1.2Mbps rcv_rtt:1 rcv_space:29200 ESTAB00192.168.1.10:44310.0.0.8:48123 cubic wscale:7,7 rto:800 rtt:345.2/120.5 ato:40 cwnd:3 ssthresh:10 send0.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-tstate time-wait|wc-l8543# 分析:8543 个 TIME_WAIT,可能耗尽本地端口(默认范围 32768-60999,约 28000 个)# 如果短期内达到 28000,就会出现端口耗尽# 查看具体 TIME_WAIT 分布$ ss-tstate time-wait sport=:80|head-5TIME-WAIT00192.168.1.10:8010.0.0.5:54321 TIME-WAIT00192.168.1.10:8010.0.0.5:54322 TIME-WAIT00192.168.1.10:8010.0.0.5:54323...# 💡 解决方案:调整内核参数 net.ipv4.tcp_tw_reuse=1# 或减少 net.ipv4.tcp_fin_timeout 值

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

# 问题:服务器负载飙升,怀疑 CC 攻击# 排查:查看 ESTAB 连接数 TOP 10$ ss-tnstate established|awk'{print $5}'|cut-d:-f1|sort|uniq-c|sort-nr|head-101256203.0.113.100432203.0.113.10589192.168.1.1001210.0.0.58192.168.1.1# 🔍 分析:203.0.113.100 有 1256 个 ESTAB 连接,远超正常值!# 🎯 结论:该 IP 疑似攻击源# 查看该 IP 的详细连接$ ss-tnstate established src203.0.113.100 ESTAB00192.168.1.10:443203.0.113.100:48723 ESTAB00192.168.1.10:443203.0.113.100:48724...(共1256行)# 💡 解决方案:iptables -A INPUT -s 203.0.113.100 -j DROP

5.5 场景五:接收/发送队列积压排查

# 问题:服务响应慢,Recv-Q / Send-Q 数值异常$ ss-tn|head-5State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB00192.168.1.10:8010.0.0.5:39821 ESTAB125680192.168.1.10:8010.0.0.8:48123# ⚠️ Recv-Q=12568ESTAB00192.168.1.10:8010.0.0.3:51234 ESTAB037654192.168.1.10:8010.0.0.9:49123# ⚠️ Send-Q=37654# 🔍 分析:# - Recv-Q=12568:内核接收缓冲区有 12KB 数据,应用层未读取 → 应用处理能力不足# - Send-Q=37654:内核发送缓冲区有 37KB 数据未发送 → 对端接收慢或网络拥塞## 💡 解决方案:# - Recv-Q 高:检查应用进程是否卡死,调大应用读取速度# - Send-Q 高:检查对端处理能力,或网络带宽是否受限

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

# 问题:安全审计,查看服务器开放了哪些端口# 排查:显示所有监听端口及进程$ ss-tulnpNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN01280.0.0.0:220.0.0.0:* users:(("sshd",pid=1234,fd=3))tcp LISTEN01280.0.0.0:800.0.0.0:* users:(("nginx",pid=12345,fd=6))tcp LISTEN01280.0.0.0:4430.0.0.0:* users:(("nginx",pid=12345,fd=7))tcp LISTEN0128127.0.0.1:33060.0.0.0:* users:(("mysqld",pid=2345,fd=22))udp UNCONN000.0.0.0:530.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-xlnpState Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN0128/run/docker.sock * users:(("dockerd",pid=5678,fd=3))LISTEN0128/var/run/dbus/system_bus_socket * users:(("dbus-daemon",pid=7890,fd=3))# 分析:docker.sock 存在且监听正常,说明 Docker 服务可访问# 如果 docker.sock 不存在 → Docker 服务未启动

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

# 监控系统采集数据,使用 JSON 格式便于解析$ ss-tlnOsport=: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-tlnOsport=:443|jq'.[] | {port: .local, state: .state}'{"port":"0.0.0.0:443","state":"LISTEN"}

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

# 查看系统整体 socket 统计$ ss-sTotal:1256(kernel1892)TCP:456(estab123, closed285, orphaned12, timewait42)Transport Total IP IPv6 RAW211UDP862TCP45642333INET46643036FRAG000# 🔍 解读:# - 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 或 ~/.zshrcaliasssall='ss -tunap'# 所有连接 + 进程aliasssl='ss -tlnp'# 所有监听端口 + 进程aliasssc='ss -tunp state established'# 仅已建立连接aliasssw='ss -tn state time-wait'# TIME_WAIT 连接aliasssm='ss -tin'# TCP 性能参数# 端口查询函数ssport(){ss-tlnpsport=:$1|grep-v"^State"}# 连接数统计sscount(){echo"ESTAB:$(ss-tstate established|wc-l)"echo"TIME_WAIT:$(ss-tstate time-wait|wc-l)"echo"LISTEN:$(ss-tstate listening|wc-l)"}

9.2 生产环境排查 checklist

步骤命令检查项正常值
1ss -tlnp sport = :端口服务是否监听LISTEN 状态
2ss -tn state established | wc -l活跃连接数无突发暴涨
3ss -tin state establishedRTT、CWNDrtt < 100ms
4ss -tn | grep -v "0 0"队列积压Recv-Q/Send-Q 全为 0
5ss -t state time-wait | wc -lTIME_WAIT 数量< 20000
6ss -s | grep orphaned孤儿连接持续增长需警惕

9.3 常见问题速查表

现象排查命令可能原因解决方案
端口被占用ss -tlnp sport = :端口进程未退出kill 对应 PID
网站访问慢ss -tin src 客户端IPrtt 高/丢包检查网络链路
连接数暴涨ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr流量攻击iptables 封禁
Cannot assign requested addressss -t state time-wait | wc -l端口耗尽调整 tw_reuse/tw_recycle
Recv-Q 持续增长ss -tnp查看对应 PID应用处理慢检查应用日志
Send-Q 持续增长ss -tnp查看对端网络拥塞/对端慢检查带宽和对方服务
http://www.cnnetsun.cn/news/3936065.html

相关文章:

  • Libre Barcode字体:5分钟学会生成专业条码的终极免费方案
  • 2024年到底需要花多少钱建设一个网站平台的费用吗揭秘
  • 爆肝整理!Nginx 从原理到生产实战全套教程(零基础吃透)
  • Less安全特性完全指南:如何在受限环境中安全使用文本查看器
  • Swin2SR快速上手:3步完成压缩图像超分辨率,含Kaggle与Colab实战教程
  • Hunyuan-GameCraft常见问题解答:模型下载、推理报错、视频质量优化全攻略
  • MovieChat OneVision版本深度体验:基于LLaVA-OneVision的新一代长视频理解模型
  • stm32寄存器开发,根据点灯了解寄存器底层逻辑(超详细)
  • 建设旅游服务类网站的可行性报告深度解析与未来趋势洞察
  • 第13章:JDK Unified Logging 与 GC/运行时日志治理
  • 北京安慧桥网站建设:揭秘本地企业如何通过专业建站实现流量变现与品牌突围
  • 领域知识库与RAG技术栈实战:构建智能问答系统
  • Riot 应用开发指南:构建长生命周期进程的终极技巧
  • dtplyr常见操作示例:filter、mutate、group_by等dplyr动词的高效实现
  • AI 音乐生成与智能创作工具实践:并发场景怎样设定保护边界
  • GIS交通应用实战:从数据处理到网络分析,构建智慧交通系统
  • Cocos Creator自定义按钮组件:解决原生Button痛点,实现交互逻辑解耦
  • 系统集成项目管理工程师-信息技术服务(下篇)
  • GIS工程化实战:PostGIS+ArcGIS Pro+Python构建自动化空间分析工作流
  • 揭秘兰州网站建设加王道下拉菜单的深层逻辑,为什么90%的企业都在忽视这个细节
  • 3步实战:用Skynet构建你的第一个游戏微服务
  • HTTP协议核心原理与实战:从请求响应到性能优化全解析
  • 2024年最值得尝试的AI编码助手:Prime Agent核心功能全解析
  • telegram-history-dump高级技巧:增量备份与媒体下载全攻略
  • 如何为小爱音箱搭建终极本地音乐库:3步实现智能语音播放完整指南
  • 三步突破:让旧Mac重获新生的OpenCore Legacy Patcher终极指南
  • 宜兴淘宝网站建设深度解析:从起步到盈利的全流程指南,助力本地商家腾飞
  • 刚性常微分方程组的数值求解方法与工程实践
  • 本地AI图像生成进阶:Stable Diffusion模型融合与LoRA工作流实战
  • 电子商务网站建设选择服务器要考虑的因素有