Linux ss 命令详解与 Netlink 原理
目录
- 概述
- [一、
ss是做什么的](#一、ss 是做什么的) - 二、常用场景与命令示例
- [三、
ss -tinp参数拆解](#三、ss -tinp 参数拆解) - [四、实现原理:Netlink 与
netstat对比](#四、实现原理:Netlink 与 netstat 对比) - 五、数据流示意
- [六、Netlink 工作机制(简述)](#六、Netlink 工作机制(简述))
- [七、
ss/netstat/lsof/ip对比](#七、ss / netstat / lsof / ip 对比) - 八、选项按场景速查
- 九、实战组合速记
- 十、权限说明
- 十一、典型排查场景与输出行字段
- [十二、网络命名空间中的
ss](#十二、网络命名空间中的 ss) - 附录:选项组合思维导图(ASCII)
- 免责声明
概述
ss(socket statistics )属于 iproute2 套件,用于查看 Linux 上 TCP/UDP/UNIX 等套接字的连接、监听与内核侧状态。相比传统 netstat ,它通常更快 、在部分场景下信息更细 (如 TCP 内部统计需配合 -i),是现代发行版中排查网络与端口的首选工具之一。
iproute2 工具族关系(示意)
┌─────────────────────────────┐
│ iproute2 套件 │
└─────────────────────────────┘
┌────────────┬────────────┬────────────┬────────────┐
▼ ▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ ip │ │ ss │ │ tc │ │bridge│ │ ... │
│地址/路由│ │套接字 │ │流量控制│ │桥 │ │ │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘
本文聚焦 ss ;查接口/路由请配合 ip addr / ip route。
一、ss 是做什么的
| 能力 | 说明 |
|---|---|
| 查看连接 | 当前 TCP/UDP(及 RAW、UNIX 等)连接与状态 |
| 状态 | LISTEN 、ESTAB 、TIME-WAIT 等 |
| 端口与进程 | 谁监听/占用某端口(-p,常需 root) |
| 内核细节 | RTT、重传、拥塞窗口等(-i,依内核与版本而异) |
1.1 在诊断链路中的位置(示意)
应用连不上 / 端口冲突 / 连接过多
│
├─► ss -lntp / ss -tnp ← 套接字与进程(本文)
├─► ip addr / ip route ← 地址与路由
├─► ping / mtr / tcpdump ← 连通与抓包
└─► iptables/nft / conntrack ← 防火墙与跟踪表
二、常用场景与命令示例
2.1 查看监听端口(最常用)
bash
ss -l # 所有监听套接字
ss -ltnp # TCP + 数字端口 + 进程(排查端口占用)
| 参数 | 含义 |
|---|---|
-l |
listening(仅监听) |
-t |
TCP |
-n |
数字形式显示端口/IP,不解析服务名/主机名 |
-p |
显示进程(PID/名称) |
2.2 查看已建立 TCP 连接
bash
ss -tn
ss -tnp # 带进程
2.3 按端口过滤
bash
ss -lntp sport = :80
# 或
ss -lntp | grep ':80'
2.4 UDP
bash
ss -un
ss -unlp # UDP 监听 + 进程
2.5 按 TCP 状态过滤
bash
ss -tan state established
ss -tan state time-wait
(状态名以本机 ss 为准;man ss 中 state 可写 established 、time-wait 等关键字。)
2.6 整体统计
bash
ss -s # 各协议套接字数量摘要
2.7 TCP 状态与排查关联(速查表)
state 过滤关键字(示例) |
常见含义 | 排查时可能关注点 |
|---|---|---|
listen |
监听 | 服务是否起来、绑定地址是否为 0.0.0.0 / :: |
established |
已建立 | 活跃连接数、是否异常暴增 |
syn-recv |
半连接队列 | SYN 洪水、积压 |
time-wait |
主动关闭后等待 | 数量过多与端口耗尽、短连接服务 |
close-wait |
对端已关、本端未关 | 应用未 close、句柄泄漏 |
fin-wait-1/2 |
断开过程中 | 长时间停留可能需结合抓包 |
完整状态机以 TCP 协议与内核实现为准;上表便于和 ss state ... 对照使用。
三、ss -tinp 参数拆解
等价于 ss -t -i -n -p:
| 选项 | 作用 |
|---|---|
-t |
仅 TCP |
-i |
显示 TCP 内部信息 (如 RTT、重传、cwnd 等,具体字段因内核而异) |
-n |
不解析服务名与主机名,便于脚本与快速输出 |
-p |
显示 进程 (PID、命令名、fd);查看他人进程通常需 root |
典型用途:性能与连通性排查(慢连接、重传、队列),并结合进程定位归属。
输出示意(结构说明,非真实完整行):
text
ESTAB 0 0 192.168.1.10:22 192.168.1.5:54321
... 内核 TCP 信息行(rtt / retrans 等,视 -i 与版本而定) ...
users:(("sshd",pid=1022,fd=3))
常用变体:
bash
ss -tinp state established
ss -lntp # 监听场景更常用
四、实现原理:Netlink 与 netstat 对比
4.1 netstat(传统路径)
- 读取
/proc/net/tcp、/proc/net/udp等文本接口 - 结合
/proc/<pid>/fd等解析进程关联
特点:实现简单,连接数很大时读/解析多次可能偏慢;部分细节不如 Netlink 路径统一。
4.2 ss(Netlink 路径)
通过 Netlink (如 NETLINK_INET_DIAG 等)向内核查询套接字表 ,以结构化消息批量返回,减少反复扫 /proc 文本的开销。
| 对比项 | netstat |
ss |
|---|---|---|
| 主要数据来源 | /proc/net/* 等 |
内核 Netlink |
| 典型性能 | 连接多时偏慢 | 通常更快 |
| TCP 扩展信息 | 有限 | -i 可暴露更多内核侧指标(视版本) |
| 维护趋势 | 多系统标为 legacy | 推荐 |
4.3 两条路径对照(ASCII)
netstat 路径 ss 路径
┌──────────────┐ ┌──────────────┐
│ 读 /proc/net │ │ Netlink 套接字 │
│ 文本解析 │ │ 结构化请求/应答 │
└──────┬───────┘ └──────┬───────┘
│ │
└──────────► 内核 socket 表 ◄──┘
五、数据流示意
┌─────────────┐ Netlink 消息 ┌─────────────┐
│ 用户态 ss │ ◄────────────────────────► │ Linux 内核 │
└─────────────┘ 请求 / 应答(二进制) └──────┬──────┘
│ │
│ 格式化输出 │ 维护
▼ ▼
终端表格/文本 TCP/UDP/socket 子系统
(连接表、监听队列、状态机等)
5.1 Netlink 交互时序(Mermaid)
socket 子系统 内核 Netlink 用户态 ss socket 子系统 内核 Netlink 用户态 ss 发送诊断请求(如 INET_DIAG) 查询套接字表/统计 返回套接字条目 多条 Netlink 应答消息 解析并打印表格
六、Netlink 工作机制(简述)
Netlink 是 Linux 下用户态与内核态之间的一种 基于套接字的 IPC ,常用于网络配置、路由、防火墙与 套接字诊断 等。
| 步骤 | 说明 |
|---|---|
| 1 | 用户态程序创建 Netlink socket |
| 2 | 构造请求消息发往内核对应子系统 |
| 3 | 内核处理后将结果以 多条 Netlink 消息 返回 |
| 4 | ss 解析消息并打印为人类可读表格 |
与「逐文件读 /proc」相比,通常 系统调用次数更少、数据更结构化。
七、ss / netstat / lsof / ip 对比
| 工具 | 主要定位 | 典型强项 | 与 ss 关系 |
|---|---|---|---|
| ss | 套接字统计、连接状态 | 快、状态过滤、-i TCP 细节 |
本文主角 |
| netstat | 传统网络状态查看 | 习惯兼容、老文档多 | 功能重叠,优先 ss |
| lsof | 列举打开的文件与 fd | 任意类型文件描述符、进程视角 | 可查网络连接,但不如 ss 专精套接字表 |
| ip(iproute2) | 接口、地址、路由、邻居等 | 二层/三层配置与诊断 | 与 ss 同属 iproute2,互补而非替代 |
选型提示 :查「谁在监听/谁连了谁」→ ss ;查路由/策略路由 → ip route ;查某进程打开了哪些文件 → lsof。
7.1 多维度对照(定性:高 / 中 / 低)
| 维度 | ss | netstat | lsof | ip |
|---|---|---|---|---|
| 套接字列表速度与规模化 | 高 | 中 | 中 | --- |
TCP 内核扩展信息(-i) |
高 | 低 | --- | --- |
| 按进程反查 fd / 文件 | 中(-p) |
中 | 高 | --- |
| 路由/接口/邻居 | --- | --- | --- | 高 |
| 老文档与脚本兼容 | 中 | 高 | 高 | 中 |
「---」表示非该工具主战场。
八、选项按场景速查
8.1 协议
| 选项 | 含义 |
|---|---|
-t |
TCP |
-u |
UDP |
-w |
RAW |
-x |
UNIX 域套接字 |
-4 / -6 |
仅 IPv4 / IPv6 |
bash
ss -tu # TCP + UDP
8.2 输出控制
| 选项 | 含义 |
|---|---|
-n |
数字地址与端口 |
-p |
进程信息 |
-i |
TCP 内部信息 |
-m |
内存/缓冲相关信息 |
-o |
计时器等信息(如 keepalive,视连接而定) |
-e |
扩展信息(如 uid、inode 等,依版本) |
8.3 过滤:状态 / 地址 / 端口
bash
ss -tan state established
ss -tan state time-wait
ss -tan sport = :80
ss -tan dport = :443
ss dst 192.168.1.100
8.4 其它
| 选项 | 含义 |
|---|---|
-l |
仅监听 |
-a |
所有(监听 + 非监听,依默认行为与组合) |
-s |
统计摘要 |
-H |
不打印表头(适合脚本) |
完整选项以 man ss 与当前 iproute2 版本为准。
九、实战组合速记
| 需求 | 命令 |
|---|---|
| 监听 + 进程 | ss -lntp |
| 已建立 + TCP 细节 + 进程 | ss -tinp state established |
| 某端口谁监听 | ss -lntp sport = :3306 |
| TIME-WAIT 数量(粗略) | `ss -tan state time-wait |
| 全局摘要 | ss -s |
| 脚本去表头 | ss -H -tan state established |
助记 :l 监听、t/u 协议、n 数字、p 进程、i 内核 TCP 信息、s 统计、H 无表头。
十、权限说明
| 身份 | 一般可见范围 |
|---|---|
| 普通用户 | 套接字列表通常可见;他人进程 的 -p 信息常受限 |
| root | 可看到更完整的进程与套接字关联 |
十一、典型排查场景与输出行字段
11.1 场景 → 命令(表)
| 场景 | 建议命令 |
|---|---|
| 端口被占用 | ss -lntp sport = :<port> |
| 本机连了哪些外部地址 | ss -tnp state established |
| 半连接是否堆积 | ss -tan state syn-recv |
| TIME-WAIT 是否过多 | `ss -tan state time-wait |
| 怀疑应用未关连接 | ss -tan state close-wait |
| 结合 TCP 重传/RTT | ss -tinp state established |
11.2 默认表头中 Recv-Q / Send-Q(常见解释)
TCP 典型表头:State Recv-Q Send-Q Local Address:Port Peer Address:Port
| 列 | 常见含义(简述) |
|---|---|
| Recv-Q | 接收队列中未取走 的字节数(已入内核、应用尚未 read) |
| Send-Q | 发送队列中已提交尚未确认发出/确认的数据量(与内核缓冲、对端窗口有关) |
LISTEN 时:Recv-Q 常与已完成三次握手、等待 accept 的连接数 相关;Send-Q 常为监听套接字 backlog 上限相关(具体以内核与文档为准)。
出现 Recv-Q 很大 而应用慢:可能应用读慢或阻塞;Send-Q 堆积 :可能对端慢、窗口小、网络差,需结合 -i、抓包分析。
十二、网络命名空间中的 ss
容器、ip netns 等场景下,套接字表是按命名空间隔离的。
bash
# 在指定 netns 中执行 ss(示例)
sudo ip netns exec <ns_name> ss -lntp
宿主机上执行的 ss 默认只看到默认命名空间 ;排查 Docker/K8s 内监听端口时,需进入相应 netns 或在容器内执行 ss。
附录:选项组合思维导图(ASCII)
ss
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
协议 -t/u/w/x 范围 -l / -a 输出 -n -p -i -m -o
│ │ │
└────────┬──────────┴────────┬────────┘
▼ ▼
state / sport / dport / src / dst
│
▼
终端输出 或 管道 wc/grep
免责声明
本文根据公开技术资料整理,用于学习与排障;ss 输出字段、Netlink 族与内核版本相关行为以 man ss、iproute2 文档及本机实测为准。
主题:Linux 网络诊断 --- ss 用法、原理与工具选型。