Zenith Horizon

ss 命令详解

2026/03/26
loading

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️⃣ 常见用法示例

  1. 查看所有监听端口(最常用)

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 端口监听。

  1. 查看所有已建立的连接(含进程)

ss -tunp
# -u 包含 UDP, -p 显示进程

这对定位哪个进程在占用端口或发起的连接非常有用。

  1. 查看 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
...
  1. 查看某端口是否被监听

ss -tln | grep :80
# 或指定端口号
ss -tln sport = :80
  1. 查看特定状态(如 TIME_WAIT)的连接

ss -tan state time-wait
# 常见状态: established, listening, syn-sent, syn-recv, fin-wait-1/2, time-wait, closed, close-wait, last-ack
  1. 显示 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 查看完整文档。

Author: Max

Permalink: /archives/ss

Published: 2026-03-26 20:57:00

Updated: 2026-03-26 20:55:22

License: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG