如何查看网络连接状态和端口占用?(netstat, ss, lsof)
在 Linux 系统中,查看网络连接状态和端口占用情况是运维和开发最常用的操作之一。你提到的三个工具 ss、netstat 和 lsof 各有千秋。
以下是详细的使用指南和常用命令组合:
1. ss (Socket Statistics) —— 推荐首选
ss 是现代 Linux 系统中用来取代 netstat 的工具。它的执行速度更快(直接从内核读取信息),且能显示更多细节。
最常用命令组合
bash
sudo ss -tunlp
这个命令会列出所有正在监听的 TCP 和 UDP 端口,以及对应的进程信息。
参数详解 (Mnemonics: TUNLP)
-t: 显示 TCP 连接-u: 显示 UDP 连接-n: Numeric,不解析服务名(如显示 80 而不是 http),速度更快-l: Listening,只显示正在监听的端口(如果不加,默认显示已建立的连接)-p: Process,显示进程 ID 和程序名称(需要 sudo 权限)-a: All,显示监听和非监听(已建立)的所有套接字
常见场景
- 查看特定端口(例如 80):bash
sudo ss -tunlp | grep :80 - 查看所有已建立的 TCP 连接(排查并发量):bash
ss -tan state established
2. netstat (Network Statistics) —— 经典老牌
虽然在许多新发行版中已被标记为过时(deprecated),但它依然非常普及。如果系统中没有,通常需要安装 net-tools 包。
最常用命令组合
bash
sudo netstat -tunlp
你会发现参数和 ss 几乎一模一样,这也是为了兼容老用户的习惯。
参数详解
-t(tcp),-u(udp),-n(数字格式),-l(监听中),-p(显示进程)-a: 显示所有连接(包括监听和已连接)
常见场景
- 查看路由表:bash
netstat -rn - 统计各种连接状态的数量(譬如统计 TIME_WAIT):bash
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
3. lsof (List Open Files) —— 查端口神器
lsof 的逻辑是“一切皆文件”,网络连接也是文件。它在查找谁占用了特定端口时非常直观。
最常用命令组合
bash
sudo lsof -i -P -n
参数详解
-i: Internet,列出符合条件的网络文件-P: Port,不将端口号转换为服务名(显示 80 而非 http)-n: No Hostname,不将 IP 转换为域名(加快速度)
常见场景 (最强功能)
- 直接查找谁占用了特定端口(比如 8080):这是 lsof 最方便的地方,不需要配合 grep,直接跟冒号加端口号即可。bash
sudo lsof -i :8080 - 查找某个用户打开的网络连接:bash
lsof -i -a -u username
总结与对比
| 特性 | ss |
netstat |
lsof |
|---|---|---|---|
| 定位 | 现代、快速、功能强 | 经典、兼容性好 | 通用文件查看、查特定端口方便 |
| 速度 | 快(直接读内核) | 慢(遍历 /proc) | 中等 |
| 是否默认安装 | 是 (iproute2) | 否 (需装 net-tools) | 通常是 |
| 核心命令 | ss -tunlp |
netstat -tunlp |
lsof -i :端口 |
建议:
- 日常检查端口和进程,首选
ss -tunlp。 - 如果你只想知道“谁占用了端口 X”,用
lsof -i :X最快。 - 如果你在维护很老的系统(如 CentOS 6),只能用
netstat。
注意: 想要看到进程名称(Program name)和 PID,必须使用 sudo,否则只能看到端口被占用,但看不到是谁占用的。
右滑查看面试常问