Linux ss 命令完全指南:网络套接字诊断从入门到精通

Linux ss 命令完全指南:网络套接字诊断从入门到精通

Someone Lv5

前言

在 Linux 服务器运维中,网络套接字诊断是最常见的需求之一。传统上我们用 netstat 查看网络连接状态,但 netstat 已属过时工具,在较新的发行版中甚至不再默认安装。它的现代替代者——ss(Socket Statistics) 凭借更快的速度、更丰富的信息和更灵活的过滤能力,已经成为网络诊断的首选工具。本文将全面介绍 ss 命令的使用方法。

一、ss 与 netstat 对比

ss 命令读取 /proc/net/ 下的内核信息,直接与内核的套接字诊断接口通信,而 netstat 则遍历 /proc 中的每个条目。这使得 ss 在处理大量并发连接时速度远超 netstat。

特性ssnetstat
速度快(直接读取内核诊断接口)慢(遍历 /proc 条目)
默认安装部分发行版默认安装(iproute2 包)需额外安装(net-tools 包)
TCP 状态过滤支持(丰富且灵活)有限
显示进程信息需 -p 选项需 -p 选项
UNIX 套接字支持(显示详细)支持
内核态连接支持(需 root)不支持

二、安装 ss

ss 命令包含在 iproute2 软件包中:

1
2
3
4
5
6
7
8
# Ubuntu/Debian
sudo apt install iproute2

# CentOS/RHEL/Fedora
sudo dnf install iproute

# 验证安装
ss --version

三、基础用法

3.1 查看所有套接字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 显示所有套接字(TCP、UDP、UNIX、RAW)
ss -a

# 仅显示监听的套接字(类似 netstat -l)
ss -l

# 仅显示 TCP 套接字
ss -t

# 仅显示 UDP 套接字
ss -u

# 仅显示 UNIX 套接字
ss -x

# 仅显示 RAW 套接字
ss -w

3.2 常用选项组合

以下是最常用的组合方式:

1
2
3
4
5
6
7
8
9
10
11
# 显示所有 TCP 监听端口(含进程信息)
ss -tlnp

# 显示所有已建立的 TCP 连接(含进程)
ss -tup

# 显示所有 TCP 连接(监听 + 已建立)
ss -tanp

# 显示所有套接字统计摘要
ss -s

各选项含义:

  • -t:仅显示 TCP 套接字
  • -u:仅显示 UDP 套接字
  • -l:仅显示监听状态的套接字
  • -a:显示所有套接字
  • -n:不解析服务名(显示数字端口,速度更快)
  • -p:显示进程信息
  • -s:打印统计摘要

3.3 统计摘要

ss -s 输出服务端最关心的全局连接概况:

1
2
3
4
5
6
7
8
9
10
11
$ ss -s
Total: 432 (kernel 476)
TCP: 48 (established 12, closed 30, orphaned 0, synrecv 0, timewait 2, ports 24)

Transport Total IP IPv6
* 476 - -
RAW 0 0 0
UDP 10 8 2
TCP 18 14 4
INET 28 22 6
FRAG 0 0 0

通过这个输出,你可以快速判断服务器当前的连接压力——established 数量、timewait 数量等。

四、TCP 状态过滤

ss 最强大的功能之一是按 TCP 状态过滤连接。这对排查网络问题极为有用。

4.1 状态过滤语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看 ESTABLISHED 状态的连接
ss state established

# 查看 TIME-WAIT 状态的连接
ss state time-wait

# 查看 CLOSE-WAIT 状态(通常表示应用层未正确关闭连接)
ss state close-wait

# 查看 LISTEN 状态
ss state listening

# 查看 SYN-SENT 状态(出站连接失败时出现)
ss state syn-sent

4.2 排除特定状态

1
2
3
4
5
# 排除 LISTEN 和 TIME-WAIT,查看真正的活跃连接
ss -t state established

# 排除所有非 ESTABLISHED 的连接
ss -t '( dport = :80 or sport = :80 )' | grep ESTAB

4.3 全部 TCP 状态

TCP 状态名称在 ss 中使用连字符形式:

ss 状态名说明排查意义
established已建立的连接正常连接数
syn-sent正在发起连接(SYN 已发出)出站连接异常时多发
syn-recv收到 SYN 包半连接攻击时暴涨
fin-wait-1主动关闭,FIN 已发出正常情况下短暂存在
fin-wait-2主动关闭,收到 ACK积压说明对端不关闭
time-wait连接已关闭,等待 2MSL大量影响端口复用
close-wait被动关闭,等待应用 close()应用层 bug 的典型表现
last-ack等待最后的 ACK积压说明对端异常
listening监听状态服务是否正常监听
closing双方同时关闭罕见

五、端口和地址过滤

5.1 按端口号过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看本地监听 80 端口的服务
ss -tlnp sport = :80

# 查看所有连接到 443 端口的连接
ss -tanp dport = :443

# 查看涉及 3306 端口的所有连接
ss -tanp '( sport = :3306 or dport = :3306 )'

# 端口范围过滤
ss -tlnp sport >= :1024

# 排除某个端口
ss -tanp not dport = :22

5.2 按 IP 地址过滤

1
2
3
4
5
6
7
8
# 查看来自特定 IP 的连接
ss -tnp src 192.168.1.100

# 查看发往特定网段的连接
ss -tnp dst 10.0.0.0/16

# 组合过滤:来源 IP + 目标端口
ss -tnp src 10.0.0.5 and dport = :443

5.3 使用表达式语法

ss 支持逻辑运算符组合多个条件:

1
2
3
4
5
6
7
8
# 查看 80 或 443 端口的监听
ss -tlnp '( sport = :http or sport = :https )'

# 查看非本地的连接
ss -tnp not src 127.0.0.1

# 查看已建立的非 SSH 连接
ss -tnp state established and not port = :22

六、UNIX 套接字查看

1
2
3
4
5
6
7
8
9
10
11
# 查看所有 UNIX 域套接字
ss -x

# 显示 UNIX 套接字详细信息(含进程)
ss -xlp

# 查看特定路径的 UNIX 套接字
ss -x | grep /var/run/docker.sock

# 查看数据报类型的 UNIX 套接字
ss -x state datagram

UNIX 套接字对于排查本地进程间通信(IPC)问题非常有用,例如 Nginx 与 PHP-FPM 的 Unix Socket 通信问题。

七、实战场景

场景 1:排查端口被占用

1
2
3
4
5
# 检查 8080 端口是否被占用
ss -tlnp | grep :8080

# 输出示例
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=12345,fd=22))

看到 LISTEN 状态的记录说明端口已被 Java 进程(PID 12345)占用。

场景 2:排查 TIME_WAIT 积压

1
2
3
4
5
6
7
8
# 统计 TIME-WAIT 数量
ss -tan state time-wait | wc -l

# 查看 TIME-WAIT 的目标端口分布
ss -tan state time-wait | awk '{print $4}' | sort | uniq -c | sort -rn | head -10

# 查看 TIME-WAIT 的来源 IP 分布
ss -tan state time-wait | awk '{print $5}' | sort | uniq -c | sort -rn | head -10

如果 TIME-WAIT 数量超过数万,可能需要调整内核参数 net.ipv4.tcp_tw_reusenet.ipv4.tcp_fin_timeout

场景 3:查找 CLOSE_WAIT 连接

CLOSE_WAIT 过多通常表示应用层存在 Bug(未正确调用 close()):

1
2
3
4
5
6
7
8
# 统计 CLOSE-WAIT 数量
ss -tan state close-wait | wc -l

# 查看 CLOSE-WAIT 的详细信息(找目标服务)
ss -tanp state close-wait

# 按进程分组统计
ss -tanp state close-wait | grep -oP 'users:\(\(\K[^,)]+' | sort | uniq -c | sort -rn

场景 4:监控连接变化

1
2
3
4
5
6
7
8
# 持续监控新建连接(每 2 秒刷新一次)
watch 'ss -tanp | head -50'

# 持续监控特定端口的连接数变化
watch 'ss -tan state established | grep :443 | wc -l'

# 查看当前并发连接数的实时趋势
watch -n 1 'echo "ESTAB: $(ss -t state est | wc -l)"'

场景 5:检查 Nginx 工作状态

1
2
3
4
5
6
7
8
# 查看 Nginx worker 进程监听的端口
ss -tlnp | grep nginx

# 查看当前所有与 Nginx 相关的活跃连接
ss -tanp state established | grep nginx

# 查看 Nginx Unix Socket 连接状态(与 PHP-FPM)
ss -xlp | grep php

八、输出格式解读

ss 的默认输出格式为:

1
2
3
Netid  State      Recv-Q  Send-Q  Local Address:Port   Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp ESTAB 0 0 192.168.1.10:22 192.168.1.5:54321

各字段含义:

  • Netid:协议类型(tcp、udp、raw、u_str 等)
  • State:连接状态(LISTEN、ESTAB、TIME-WAIT 等)
  • Recv-Q:接收队列中等待应用程序读取的字节数
  • Send-Q:发送队列中等待发送的字节数
  • Local Address:Port:本地地址和端口
  • Peer Address:Port:对端地址和端口

提示:如果 Recv-Q 长期不为 0,说明应用层读取缓慢;Send-Q 长期不为 0 说明对端接收能力不足或网络拥塞。

九、ss 进阶技巧

9.1 显示计时器和拥塞信息

1
ss -tie

-i 选项会显示 TCP 内部信息,包括拥塞窗口(cwnd)、RTT(往返时间)、重传信息等,对网络调优非常有价值。

9.2 显示内存使用

1
ss -tlm

-m 选项显示套接字的内存使用情况,可用于排查内存泄漏。

9.3 显示所有内核 TCP 参数

1
ss -ti | head -20

9.4 使用 JSON 输出(便于脚本处理)

1
ss -tlnj

9.5 不解析主机名和服务名(加快速度)

1
ss -tan

-n 可大幅提升在大批量连接时的输出速度。

十、常见问题排查

问题排查命令可能原因
端口被占用ss -tlnp | grep :PORT其他进程正在监听该端口
连接不上服务ss -tlnp | grep :PORT服务未启动或防火墙阻止
TIME-WAIT 过多ss -tan state time-wait短连接频率过高需调优
CLOSE-WAIT 过多ss -tanp state close-wait应用层未正确关闭连接
连接数暴增ss -sCC 攻击或突发流量
Recv-Q 堆积ss -tan | grep -v 'Recv-Q 0'应用读取性能瓶颈
大量 SYN_RECVss -tan state syn-recv | wc -l可能是 SYN Flood 攻击
TCP 重传率高ss -ti | grep retrans网络丢包或带宽不足

十一、命令速查表

场景命令
所有监听端口(含进程)ss -tlnp
所有已建立 TCP 连接ss -tan state established
所有 UDP 监听ss -uln
统计摘要ss -s
查看 TIME-WAIT 连接ss -tan state time-wait
查看 CLOSE-WAIT 连接ss -tan state close-wait
查看指定端口ss -tanp sport = :80
查看来自 IP 的连接ss -tnp src 10.0.0.1
UNIX 套接字(含进程)ss -xlp
TCP 内部信息(RTT/拥塞窗口)ss -ti
持续监控连接数watch -n 1 'ss -s'
JSON 格式输出ss -tlnj

十二、安全与性能提示

  1. -p 选项需要 root 权限:普通用户运行 ss -p 可能看不到完整进程信息。
  2. 避免在高并发环境默认使用 -j:JSON 输出需要额外的处理开销,对性能有影响。
  3. 生产环境慎用 watch 高频刷新watch -n 1 每秒执行一次 ss 查询,在高并发服务器上会造成一定的 CPU 开销,建议将间隔设为 3 秒以上。
  4. 结合 iptables 日志使用:ss 无法显示被防火墙丢弃的数据包,需配合 iptables 日志或 nftables 监控。

结语

ss 命令作为 Linux 网络诊断工具箱中的核心工具,其速度优势和处理大量连接时的稳定性使其成为 netstat 的当之无愧的替代者。掌握 ss 的各类过滤语法和状态分析能力,可以大幅提升你在服务器网络问题排查中的效率——从端口冲突到连接状态异常,从性能瓶颈到安全攻击,ss 都能提供第一手的关键信息。

建议你有空时可以执行 ss -sss -tanp 快速了解服务器当前的连接状况,慢慢地这些命令会成为你下意识的动作。

本文由AI辅助生成,内容仅供参考

  • 标题: Linux ss 命令完全指南:网络套接字诊断从入门到精通
  • 作者: Someone
  • 创建于 : 2026-06-10 23:54:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-10-ss-command-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。