基于本文回答
0
评论

如何查看网络连接状态和端口占用?(netstat, ss, lsof)

知识点图片

在 Linux 系统中,查看网络连接状态和端口占用情况是运维和开发最常用的操作之一。你提到的三个工具 ssnetstatlsof 各有千秋。

以下是详细的使用指南和常用命令组合:


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):
    bash
    sudo lsof -i :8080
    这是 lsof 最方便的地方,不需要配合 grep,直接跟冒号加端口号即可。
  • 查找某个用户打开的网络连接:
    bash
    lsof -i -a -u username

总结与对比

特性 ss netstat lsof
定位 现代、快速、功能强 经典、兼容性好 通用文件查看、查特定端口方便
速度 快(直接读内核) 慢(遍历 /proc) 中等
是否默认安装 是 (iproute2) 否 (需装 net-tools) 通常是
核心命令 ss -tunlp netstat -tunlp lsof -i :端口

建议:

  1. 日常检查端口和进程,首选 ss -tunlp
  2. 如果你只想知道“谁占用了端口 X”,用 lsof -i :X 最快。
  3. 如果你在维护很老的系统(如 CentOS 6),只能用 netstat

注意: 想要看到进程名称(Program name)和 PID,必须使用 sudo,否则只能看到端口被占用,但看不到是谁占用的。

右滑查看面试常问