ss 命令详解

ssSocket Statistics 的缩写,是 Linux 中用来查看网络连接、监听端口和套接字统计信息的“瑞士军刀”。

它被设计用来取代老旧的 netstat 命令。相比之下,ss 利用了内核中的 tcp_diag 模块,获取信息的速度更快,在连接数极多(上万个)时,性能优势非常明显。


1. 常用参数含义(口诀:-tulnp

这是最常用的组合,建议直接背下来:

  • -t (tcp): 只显示 TCP 连接。

  • -u (udp): 只显示 UDP 连接。

  • -l (listening): 只显示监听状态的端口(也就是服务器正在运行的服务)。

  • -n (numeric): 显示数字端口号,而不是服务名(例如显示 22 而不是 ssh)。这样速度更快。

  • -p (processes): 显示进程名称和 PID(必须用 rootsudo 才能看到)。

  • -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** 进程。