ss是比netstat更快更高效的socket统计工具,直接从内核tcp_diag模块获取信息,支持tcp/udp/unix域套接字等,常用选项包括-t(tcp)、-u(udp)、-l(监听)、-n(数字格式)、-p(进程信息)、-a(全部状态),推荐用sudo ss -tunlp替代netstat -tunlp。

netstat -anp 能看到完整连接详情,但得加权限
普通用户执行 netstat -anp 时,PID/Program name 列通常显示为 -,因为进程归属信息需要读取 /proc 下的文件,而这些目录默认只对 root 或同组用户可读。不加权限就看不到谁在用哪个端口。
- 必须用
sudo netstat -anp才能显示真实进程名和 PID -
-n避免 DNS 反向解析拖慢输出,也防止因 hosts 或 DNS 异常导致字段错位 -
-a包含监听中(LISTEN)和已建立(ESTABLISHED)等所有状态,漏掉-a就看不到服务端口 - 输出字段中
Local Address和Foreign Address的冒号后是端口号,IPv6 地址带方括号,注意区分
ss -tunlp 是更轻更快的替代方案
netstat 已被很多新系统标记为“deprecated”,底层依赖过时的 procfs 接口;ss 直接从内核 socket API 获取数据,响应快、开销低,尤其在连接数多时优势明显。
-
ss -tunlp等价于netstat -tunlp:-tTCP、-uUDP、-n数字地址、-l监听、-p进程信息 - 不需要额外安装 ——
iproute2包默认自带ss,CentOS 8+/Ubuntu 18.04+ 均预装 - 字段更紧凑:
State放在最前,Recv-Q/Send-Q后直接跟地址对,没有冗余空行 - 若提示
Permission denied,同样要加sudo,否则-p无效
查特定连接时别只靠 grep 端口数字
用 grep :8080 看 8080 端口容易误匹配 —— 比如 192.168.1.100:80801 也会被拉进来。更稳妥的方式是锚定字段边界或用正则。
- 查本地监听 8080:
sudo ss -tunlp | grep ':8080\b'(\b表示单词边界) - 查连到远端 443 端口的所有连接:
sudo ss -tunp | awk '$5 ~ /:443$/ {print}'($5是 Foreign Address 字段) - 查某个 PID 的全部连接:
sudo ss -tunp | grep '12345,'(PID 后跟逗号,避免匹配到其他数字) - 注意
ss输出中进程信息在最后一列,格式为users:(("nginx",pid=1234,fd=6)),不是简单空格分隔
连接状态字段含义直接影响排查方向
看到 TIME_WAIT 或 CLOSE_WAIT不代表异常,但数量级突增就值得深挖;SYN_RECV 太多可能是 SYN Flood,FIN_WAIT2 堆积说明对方没发 FIN。
-
ESTABLISHED:双向通信正常,最常见健康态 -
LISTEN:服务端等待接入,对应-l参数筛选结果 -
TIME_WAIT:主动关闭方等待 2MSL,短时间大量出现属正常;持续数万需检查应用是否频繁短连接 -
CLOSE_WAIT:对端已关闭,本端还没调close(),通常是程序未正确处理 EOF,泄漏 socket -
SYN_SENT:本端发了 SYN 等 ACK,若长期卡住,说明网络不通或目标没回包
netstat -anp 全量输出 —— 先想清楚你要什么:是找谁占了 3306?还是看 MySQL 连了多少客户端?目标明确再组合参数,不然满屏滚动反而耽误事。











