Linux ss 命令详解与 Netlink 原理

目录

  1. 概述
  2. [一、ss 是做什么的](#一、ss 是做什么的)
  3. 二、常用场景与命令示例
  4. [三、ss -tinp 参数拆解](#三、ss -tinp 参数拆解)
  5. [四、实现原理:Netlink 与 netstat 对比](#四、实现原理:Netlink 与 netstat 对比)
  6. 五、数据流示意
  7. [六、Netlink 工作机制(简述)](#六、Netlink 工作机制(简述))
  8. [七、ss / netstat / lsof / ip 对比](#七、ss / netstat / lsof / ip 对比)
  9. 八、选项按场景速查
  10. 九、实战组合速记
  11. 十、权限说明
  12. 十一、典型排查场景与输出行字段
  13. [十二、网络命名空间中的 ss](#十二、网络命名空间中的 ss)
  14. 附录:选项组合思维导图(ASCII)
  15. 免责声明

概述

sssocket 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 等)连接与状态
状态 LISTENESTABTIME-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 ssstate 可写 establishedtime-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                     # 监听场景更常用

4.1 netstat(传统路径)

  1. 读取 /proc/net/tcp/proc/net/udp 等文本接口
  2. 结合 /proc/<pid>/fd 等解析进程关联

特点:实现简单,连接数很大时读/解析多次可能偏慢;部分细节不如 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 子系统
                                             (连接表、监听队列、状态机等)

socket 子系统 内核 Netlink 用户态 ss socket 子系统 内核 Netlink 用户态 ss 发送诊断请求(如 INET_DIAG) 查询套接字表/统计 返回套接字条目 多条 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 用法、原理与工具选型。

相关推荐
爱吃菠萝121382 小时前
实验室服务器远程访问终极方案:SSH 反向隧道 + systemd 自动重连
运维·服务器·ssh
小杰3122 小时前
ZLMediakit源码梳理
服务器·音视频·流媒体·zlmediakit
知秋贺2 小时前
如何在ubuntu24中,使用docker 运行ros2 humble版本
运维·docker·容器
Jocelyn_书2 小时前
Jenkins使用手册
运维·jenkins
吹晚风吧2 小时前
解决vite打包,base配置前缀,nginx的dist包找不到资源
服务器·前端·nginx
pingao1413782 小时前
智慧井盖传感器震动倾斜溢水监测:传统市政设施的智慧化升级典范
运维·网络·安全
不愿透露姓名的大鹏2 小时前
Linux实操:ext4转换为xfs(含完整步骤+避坑指南)
linux·服务器
ZzzZZzzzZZZzzzz…2 小时前
MySQL备份还原方法1----xtrabackup
linux·运维·数据库·mysql·xtrabackup·物理备份
Redemption2 小时前
嵌软面试每日一阅----Linux驱动之字符设备驱动
linux·面试·职场和发展