你知道吗?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 ':8080b'(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_WAITSYN_RECV 太多可能是 SYN Flood,FIN_WAIT2 堆积说明对方没发 FIN。
ESTABLISHED:双向通信正常,最常见健康态LISTEN:服务端等待接入,对应-l参数筛选结果TIME_WAIT:主动关闭方等待 2MSL,短时间大量出现属正常;持续数万需检查应用是否频繁短连接CLOSE_WAIT:对端已关闭,本端还没调close(),通常是程序未正确处理 EOF,泄漏 socketSYN_SENT:本端发了 SYN 等 ACK,若长期卡住,说明网络不通或目标没回包
netstat -anp 全量输出 —— 先想清楚你要什么:是找谁占了 3306?还是看 MySQL 连了多少客户端?目标明确再组合参数,不然满屏滚动反而耽误事。