ss 命令详解
ss 是 Socket Statistics 的缩写,是 Linux 中用来查看网络连接、监听端口和套接字统计信息的“瑞士军刀”。
它被设计用来取代老旧的 netstat 命令。相比之下,ss 利用了内核中的 tcp_diag 模块,获取信息的速度更快,在连接数极多(上万个)时,性能优势非常明显。
1. 常用参数含义(口诀:-tulnp)
这是最常用的组合,建议直接背下来:
-
-t(tcp): 只显示 TCP 连接。 -
-u(udp): 只显示 UDP 连接。 -
-l(listening): 只显示监听状态的端口(也就是服务器正在运行的服务)。 -
-n(numeric): 显示数字端口号,而不是服务名(例如显示22而不是ssh)。这样速度更快。 -
-p(processes): 显示进程名称和 PID(必须用root或sudo才能看到)。 -
-a(all): 显示所有端口(包括已建立连接的和正在监听的)。
2. 常见使用场景
A. 查看服务器开了哪些服务(最常用)
Bash
ss -tulnp
用途: 检查你的 Go 程序是否启动成功,或者看看有没有可疑程序在偷偷监听端口。
B. 查看所有已建立的连接
Bash
ss -tan
用途: 看看现在有多少人连着你的服务器。如果状态是 ESTAB,说明连接是活跃的。
C. 确认某个端口被谁占用了
Bash
ss -tulnp | grep :8080
用途: 当你启动 Go 程序报错 address already in use 时,用这个查出“凶手”并用 kill 杀掉它。
D. 查看网络连接统计总结
Bash
ss -s
用途: 快速看一眼服务器总共有多少个 TCP、UDP、IPv4、IPv6 连接。
3. 进阶筛选(过滤功能)
ss 支持非常强大的过滤语法,不需要每次都配合 grep。
-
只看来自某个特定 IP 的连接:
Bash
ss -at dst 123.123.123.123
* **查看状态为 `FIN-WAIT-1` 的连接(用于排查网络故障):**
```bash
ss -t state fin-wait-1
```
* **查看端口号大于 10000 的监听:**
```bash
ss -tuln sport \> :10000
```
---
### 4. 字段解读速查表
当你运行 `ss` 时,表头含义如下:
| 字段 | 含义 |
| :--- | :--- |
| **Netid** | 协议(tcp, udp, u_str 等) |
| **State** | 状态(LISTEN 监听中, ESTAB 已连接, TIME-WAIT 等待关闭) |
| **Recv-Q** | 接收队列。对于监听端口,这是已完成三次握手但还没被程序 `accept` 的连接数 |
| **Send-Q** | 发送队列。对于监听端口,这是全连接队列的最大长度 |
| **Local Address** | 你的服务器 IP 和端口 |
| **Peer Address** | 远程客户端的 IP 和端口 |
---
### 5. 给你的 Go 部署建议
1. **启动后必查**:每次你运行 Go 程序后,第一时间执行 `ss -tulnp`。
* 如果看到 `127.0.0.1:端口`,说明外网进不来。
* 如果看到 `0.0.0.0:端口` 或 `*:端口`,说明外网可以访问。
2. **排查性能瓶颈**:如果你的 `Recv-Q` 数字一直很大,说明你的 Go 程序处理请求太慢了,或者数据库(SQLite)发生了死锁。
你现在尝试运行一下 `ss -tulnp`(带上 `-p`),看看那个 **58147** 端口到底是哪个进程在用?我怀疑它就是你的 **sshd** 进程。