ss 是 Linux 系统中用于查看套接字(socket)统计信息的命令,全称 Socket Statistics。它是 netstat 的现代替代品,具有速度更快、输出信息更详细的优势,尤其适合排查网络连接和端口监听问题。
1️⃣ 基本语法
ss [选项] [过滤条件]
2️⃣ 常用选项分类
显示套接字类型
-t 仅显示 TCP 套接字
-u 仅显示 UDP 套接字
-x 仅显示 Unix 域套接字
-w 仅显示 Raw 套接字
-l 仅显示正在监听的套接字(Listening)
-a 显示所有套接字(监听 + 已建立连接)
输出格式与状态
-n 不解析服务名称(如 22 不显示为 ssh),显示纯数字端口和 IP
-p 显示使用该套接字的进程名和 PID(需 root 权限才能看到所有进程)
-e 显示更详细的套接字信息(如 uid、ino 等)
-i 显示 TCP 内部信息(如拥塞算法、rtt、重传次数等)
-m 显示套接字的内存使用情况
-o 显示计时器信息(如 keepalive、重传计时器)
-s 显示统计摘要(如当前 TCP 连接数、状态分布)
其他常用
-4 仅显示 IPv4 套接字
-6 仅显示 IPv6 套接字
-0 显示 PACKET 套接字
-r 尝试解析主机名(默认行为,通常与 -n 相反)
-H 不打印表头(用于脚本解析)
-K 强制关闭套接字(需要 root 权限,内核 4.9+ 支持)
3️⃣ 常见用法示例
查看所有监听端口(最常用)
ss -tln
# -t: TCP, -l: 监听, -n: 数字端口
输出示例:
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 [::]:80 [::]:*
这表示 SSH 在 IPv4 的 22 端口监听,Nginx 在 IPv6 的 80 端口监听。
查看所有已建立的连接(含进程)
ss -tunp
# -u 包含 UDP, -p 显示进程
这对定位哪个进程在占用端口或发起的连接非常有用。
查看 TCP 连接状态统计
ss -s
输出类似:
TCP: 6 (estab 3, closed 1, orphaned 0, timewait 1)
Transport Total IP IPv6
RAW 0 0 0
UDP 5 3 2
TCP 6 4 2
...
查看某端口是否被监听
ss -tln | grep :80
# 或指定端口号
ss -tln sport = :80
查看特定状态(如 TIME_WAIT)的连接
ss -tan state time-wait
# 常见状态: established, listening, syn-sent, syn-recv, fin-wait-1/2, time-wait, closed, close-wait, last-ack
显示 TCP 内部详细信息(排查网络延迟)
ss -ti
# 配合过滤显示某端口连接
ss -ti sport = :22
输出中包含 rtt(往返时间)、cwnd(拥塞窗口)、retrans(重传次数)等。
4️⃣ 高级过滤语法
ss 支持强大的过滤表达式(与 tcpdump 类似):
按端口:
ss -tunl sport = :80 # 源端口是80的监听
ss -tan dport = :443 # 目标端口是443的连接
ss -tan '( sport = :80 or dport = :80 )' # 包含80端口的
按地址:
ss -tan src 192.168.1.1 # 源地址为 192.168.1.1
ss -tan dst 10.0.0.1:22 # 目标地址和端口
按状态(针对 TCP):
ss -tan state established
ss -tan state 'time-wait'
5️⃣ 输出字段解读
以 ss -tln 输出为例:
State:当前套接字状态(TCP 才有,UDP 显示为 UNCONN)
Recv-Q:接收队列。若该值持续不为 0,通常表示应用进程未及时读取数据。
Send-Q:发送队列。若该值持续不为 0,可能表示网络拥塞或对端接收窗口为 0。
对于 LISTEN 状态:Recv-Q 表示当前已完成的连接等待 accept 的数量;Send-Q 表示 listen backlog 的最大值。
Local Address:Port:本端地址和端口
Peer Address:Port:对端地址和端口。
6️⃣ ss 与 netstat 对比
速度
ss 极快(直接从内核 /proc/net 读取并解析)
netstat 慢(遍历 /proc 文件系统)
信息深度
ss 显示 TCP 拥塞控制、内存、计时器等信息
netstat 显示基础连接信息
依赖
ss 现代 Linux 必备(iproute2 包)
netstat 部分精简系统需额外安装 net-tools
脚本友好
ss 支持 -H 去表头,过滤语法统一
netstat输出解析较麻烦
7️⃣ 常见问题排查场景
服务无法访问:先运行 ss -tln 看服务是否在正确的 IP 和端口上 LISTEN。
连接数过多:ss -s 查看状态分布,若大量 TIME_WAIT 或 CLOSE_WAIT 需调整内核参数或排查代码。
进程占用端口:ss -tlnp | grep <端口号> 快速定位 PID。
怀疑丢包或延迟:ss -ti 观察对应连接的 rtt、retrans 数值。
总结
ss 命令功能强大且高效,建议在日常运维中完全替代 netstat。通过组合使用 -t、-l、-n、-p 等选项,可以快速定位网络连接问题。如果希望进一步掌握,可以结合 man ss 查看完整文档。