ss 是什么
ss 是 iproute2 套件里的套接字查看工具,直接向内核查询连接信息,速度比老工具快得多,现代发行版已用它全面替代 netstat。默认输出给出网络类型、状态、收发送队列、本地地址端口与对端地址端口这五组信息;加上进程参数还能显示归属进程。做端口与连接排查时,先读懂这几列,后面的过滤与统计才有意义。
基本信息
| 适用平台 | Linux 各主流发行版,随 iproute2 一起预装 |
|---|---|
| 核心用法 | ss -tun 看总览、ss -tuln 看监听、ss -tan 看全部连接、ss -s 看汇总 |
| 常用参数 | -t TCP、-u UDP、-a 全部状态、-l 仅监听、-n 不解析、-p 显示进程、-H 去掉表头 |
| 权限要求 | 查看连接不需特权;显示进程归属需要 root 或与进程同用户 |
| 过滤能力 | 支持按端口、地址、状态过滤,表达式建议用单引号包裹 |
典型使用场景
- 确认服务是否在监听:部署后第一件事是看端口有没有起来、监听在哪个地址
- 定位连接来源:确认某个数据库或应用端口被哪些地址连接
- 排查队列异常:看监听队列是否积压、已建立连接是否有未读数据
- 连接数统计:按状态或端口聚合,为容量与调优提供依据
- 替代老命令:老脚本里的 netstat 参数大多能在 ss 上找到对应写法
典型输出与常用写法
典型输出与常用写法
$ ss -tun
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
tcp ESTAB 0 0 10.0.0.5:22 10.0.0.9:51422
udp UNCONN 0 0 127.0.0.53:53 0.0.0.0:*
$ ss -tlnp | head # 只看 TCP 监听并显示进程
$ ss -s | head -5 # 连接数量汇总
$ ss -tanp '( dport = :443 )' # 过滤表达式要加引号输出逐列读法
| 列 | 含义 | 正常与异常 |
|---|---|---|
| Netid | 套接字类型,tcp 或 udp | 同一端口同时出现两种类型说明服务分别监听 |
| State | 连接状态,如 LISTEN、ESTAB、TIME-WAIT | 非监听状态大量堆积要按状态分类分析 |
| Recv-Q | 接收队列,已建立连接时是未读字节数;监听时是等待应用接受的新连接数 | 监听的队列值持续增长说明应用接受不及时 |
| Send-Q | 发送队列,已建立连接时是未确认字节数;监听时是等待队列上限 | 已建立连接长期非零说明对端接收慢或链路拥塞 |
| Local Address:Port | 本端地址与端口 | 监听到回环地址时外部无法访问 |
| Peer Address:Port | 对端地址与端口 | 对端端口是随机高位端口,属正常现象 |
| Process | 归属进程名与进程号,需 -p | 看不到进程多为权限不足,而非命令不可用 |
解析队列与接收队列方向相反容易混:Recv-Q 是别人发给本进程、本进程还没读走的数据;Send-Q 是本进程已发出、对端还没确认的数据。
ss -s 给出的是分协议汇总数量,适合做第一眼体检;确定异常方向后再用状态过滤精查具体连接。
常用过滤与统计
| 需求 | 写法要点 | 输出解读 |
|---|---|---|
| 只看某个服务端口 | 按目的端口过滤并加引号 | 得到的都是与该服务相关的连接 |
| 统计某端口连接总数 | 过滤后交给行数统计并去掉表头 | 数值反映当前瞬间的并发规模 |
| 按对端地址聚合 | 截取对端地址列后排序去重计数 | 快速看出连接集中在哪些来源 |
| 只看某台来源 | 按来源地址条件过滤 | 用于核对白名单与异常来源 |
| 按状态精查 | 指定状态名并用小写连字符写法 | 便于定位积压或异常回收的连接 |
过滤表达式不加引号时括号与比较符会被命令行解释器吃掉,命令直接报语法错误,现场容易误判为工具损坏。