ss 命令(Socket Statistics 的缩写)用于查看套接字(socket)统计信息,是 netstat 的现代替代品。它能够显示 TCP、UDP、UNIX 套接字等信息,且执行速度更快、输出信息更详细。
ss 的核心优势是比 netstat 快得多,尤其适合服务器高并发场景。netstat 在高并发下极慢(测试中解析 3 万个连接需 15.6 秒),而 ss 通过内核模块 tcp_diag 直接读取内核信息,仅需 0.47 秒。自 2001 年起netstat已停止维护,不再适配新的网络技术。
以下是结合具体场景的常用用法:
1. 基础查看与别名(最常用)
直接输入 ss 会列出所有已建立的连接,但输出量很大。通常会用别名简化:
· ss -t:只看 TCP 连接
· ss -u:只看 UDP 连接
· ss -l:只看监听状态的端口(即服务端)
· ss -a:查看所有(包含监听和未连接的)
· ss -n:不解析服务名(显示 :80 而不是 :http,速度更快)
· ss -p:显示使用该套接字的进程 PID 和名称(需 root 权限)
2. 场景一:排查服务是否启动(查看监听端口)
想确认 Nginx 是否已成功启动并监听 80 端口:
```bash
ss -lntp | grep :80
# -l 监听 -n 不解析 -t TCP -p 显示进程
```
输出 LISTEN 0 511 *:80 *:* users:(("nginx",pid=1234)) 即表示正常。
3. 场景二:查看与特定 IP 的连接
服务器遭攻击或想查某个客户端连接:
```bash
ss -nt dst 192.168.1.100
# 查看本机到 192.168.1.100 的所有连接
```
4. 场景三:统计连接状态数量(监控常用)
分析 TCP 连接状态分布(如谁在大量半连接):
```bash
ss -tna | awk 'NR>1 {print $1}' | sort | uniq -c
```
输出类似:120 ESTAB, 5 SYN-RECV, 3 TIME-WAIT
5. 场景四:过滤端口范围
想看 1000-2000 端口范围:
```bash
ss -tln sport = :1000-2000 # 源端口
ss -tln dport = :443 # 目标端口是 443
```
6. 场景五:替代 netstat -i(网卡统计)
```bash
ss -i
```
可显示 TCP 内部的拥塞窗口(cwnd)、RTT 延迟、重传次数等调试信息。
常用记忆组合:
· 看服务开了没:ss -lntp
· 看现有连接:ss -tnp
· 看总数概览:ss -s(显示 TCP 各状态统计摘要)