Linux/Windows 网络诊断实战:netstat 与 ss 命令完全指南

在运维和开发工作中,排查端口占用、检查服务状态、分析网络连接异常是日常高频任务。netstat(以及其升级版 ss)是跨平台(Linux、macOS、Windows)最核心的网络诊断命令。本文将从参数解析、高频组合、实战筛选到新旧命令对比,帮你一次彻底掌握。

一、netstat 核心作用与适用场景

netstat 即 network statistics(网络统计),其核心功能是:

查询操作系统中所有的网络连接、监听的端口、路由表、网络接口状态、套接字信息,能清晰看到「本机和哪些IP建立了连接、哪个进程占用了哪个端口、哪些端口正在对外提供服务」。

  • 适用系统:Linux、macOS、Windows 全兼容,核心参数高度一致。
  • 核心定位:排查端口占用、网络连接异常、服务是否启动、是否有异常外联的首选命令。

二、语法格式与参数分类

netstat [选项参数]

参数可单字母使用(如 -t),也可组合使用(如 -tulnp,最常用组合)。

第一类:按协议类型筛选

  • -t:仅显示 TCP 协议连接(HTTP/HTTPS/SSH/MySQL 等)
  • -u:仅显示 UDP 协议连接(DNS/广播/视频流等)
  • -w:显示 RAW 原始套接字(极少用)

第二类:按连接状态筛选(重中之重)

-l(全称 listening):只显示正在监听的端口/套接字。

核心意义:一台服务器的「服务端口」(如nginx的80、ssh的22、mysql的3306)启动后,都会处于LISTEN监听状态,等待客户端连接。执行就能看到本机所有对外提供服务的端口,排查「服务是否启动成功」首选

第三类:实用补充参数(必加)

  • -n(全称 numeric):以数字形式显示所有信息,不做域名/主机名解析。✅ 生产环境铁律:不加 -n 时 netstat 会尝试解析 IP→域名、端口→服务名,耗时且易出错。加 -n 后速度极快、结果准确、格式统一。
  • -p(全称 program):显示每个连接对应的进程 PID 和名称。这是排查“哪个进程占用了端口”的核心参数。⚠️ Linux 下普通用户可能看不到完整进程信息,需加 sudo(如 sudo netstat -tulnp)。
  • -a(全称 all):显示所有连接状态(LISTEN / ESTABLISHED / TIME_WAIT 等),不加时默认只显示已建立的连接。

三、4 个高频组合命令(建议背下)

组合1:netstat -tulnp 【封神级,最常用】

含义拆解:-t(TCP) + -u(UDP) + -l(监听) + -n(数字) + -p(进程信息)。

核心作用:

查询本机上「所有正在监听的TCP/UDP端口」+「对应的进程信息」

适用场景:检查 Nginx 的 80 端口、MySQL 的 3306 端口、Redis 的 6379 端口是否 LISTEN;快速定位端口被哪个进程占用。典型输出:

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1234/sshd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5678/nginx
tcp6       0      0 :::3306                 :::*                    LISTEN      9102/mysqld
udp        0      0 0.0.0.0:53              0.0.0.0:*                           7890/named

组合2:netstat -anpt 【高频,查 TCP 所有连接】

含义:-a(所有) + -n(数字) + -p(进程) + -t(TCP)。核心作用:

查询本机「所有TCP协议的网络连接」,包含:监听状态(LISTEN)、已建立连接(ESTABLISHED)、TIME_WAIT/CLOSE_WAIT等所有状态,同时显示每个连接对应的进程PID/名称。

适用场景:排查大量 TIME_WAIT 堆积、查看 Java 进程是否连接了指定的 MySQL 服务器。

组合3:netstat -anpu 【高频,查 UDP 所有连接】

含义:-a(所有) + -n(数字) + -p(进程) + -u(UDP)。核心作用:

查询本机「所有UDP协议的连接/监听端口」及对应进程

适用场景:查看 DNS 的 53 端口、DHCP 的 67/68 端口是否正常监听。

组合4:netstat -ant 【快速查询,无进程信息】

含义:-a(所有) + -n(数字) + -t(TCP)。核心作用:

快速查询本机所有TCP连接状态,不显示进程信息

适用场景:服务器负载高时快速了解 TCP 连接概况,执行速度最快。

四、netstat + grep 组合筛选(生产环境必杀技)

ps -ef | grep xxx 逻辑一致,netstat 的输出可通过管道符 | + grep 精准筛选。

场景1:查询指定端口是否被占用

例如查 8080 或 3306:

# 查8080端口的所有相关连接/监听状态 + 进程信息
netstat -tulnp | grep 8080
# 查3306端口(mysql)是否在监听
netstat -tulnp | grep 3306

场景2:查询指定进程占用的所有端口

例如查 nginx、java、mysql:

netstat -tulnp | grep nginx
netstat -tulnp | grep java
netstat -tulnp | grep mysql

场景3:查询指定连接状态

排查大量 TIME_WAIT 或 CLOSE_WAIT:

# 查看所有已建立的TCP连接
netstat -ant | grep ESTABLISHED
# 查看所有TIME_WAIT状态的TCP连接(这类连接过多会占用端口资源)
netstat -ant | grep TIME_WAIT

五、常见连接状态解释(运维必懂)

执行 netstat -anpt 会看到 STATE 列,以下是高频状态:

  • LISTEN:监听状态,服务已启动,正常等待客户端连接。
  • ESTABLISHED:已建立连接,正在传输数据。
  • TIME_WAIT:连接已断开,系统保留一段时间(默认 60 秒),少量正常,大量则占用端口资源。
  • CLOSE_WAIT:对方已断开,但本机程序未主动关闭,大量出现表示程序有 bug(未释放连接)。
  • SYN_RECV:正在三次握手中间状态,大量出现可能是 SYN 洪水攻击。

六、netstat vs ss 命令(必知)

为什么说 netstat 过时了?

netstat 是传统命令,Linux 内核 2.6.25 后推出了性能更强的 ss(socket statistics)。二者的关系是:

是 的「升级版+替代版」,功能完全覆盖netstat,且执行速度更快、占用资源更少、支持的参数更多

核心区别

  • 性能差异:当服务器有数万连接时,netstat 从 /proc 读取数据会很慢;ss 直接读取内核的 tcp_hashinfo,速度快百倍以上。
  • 功能差异:ss 支持更多高级筛选(如按连接数、端口范围),能显示更多内核级信息。
  • 兼容性:netstat 在部分精简系统(如 Alpine)中默认未安装,而 ss 自带。

无缝替换写法

ss 参数与 netstat 高度相似,推荐生产环境优先用 ss:

# netstat -tulnp 等价替换(推荐,速度超快)
ss -tulnp
# netstat -anpt 等价替换
ss -anpt
# 筛选指定端口
ss -tulnp | grep 8080

总结:该用哪个?

  • ✅ 日常学习 / Windows 系统:放心用 netstat,兼容性无敌。
  • ✅ Linux 生产环境 / 高并发服务器:优先用 ss,性能碾压。
  • ✅ 面试必答:ss 是 netstat 的替代命令,性能更好。

七、Windows 系统中的 netstat 用法

netstat 在 Windows 中完全通用,仅两点差异:

  • Windows 没有 -p 参数,改用 -o 参数显示进程 PID。
  • 查看进程名称需结合任务管理器(详细信息→PID 列)。

Windows 高频写法:

# 查看所有监听的TCP/UDP端口 + PID
netstat -tulno
# 查指定端口(如8080)
netstat -tulno | findstr 8080

八、全文核心知识点总结

netstat 是网络状态查询命令,查端口、连接、进程占用,Linux/Windows 通用。核心参数:-t(TCP)、-u(UDP)、-l(监听)、-n(数字显示,必加)、-p(进程PID)、-a(所有连接);封神组合:netstat -tulnp → 查所有监听端口+进程,必背;精准筛选:netstat -tulnp | grep 端口/进程名 → 生产环境必杀技;替代命令:ss 是 netstat 的升级版,参数几乎一致,ss -tulnp 无缝替换;核心状态:LISTEN(监听)、ESTABLISHED(已连接)、TIME_WAIT(等待关闭)。

掌握 netstat 和 ss,配合 ps、grep 等命令,能解决绝大多数进程与网络排查问题。无论是排查 Python 写的 Web 服务端口、调试 C++ 开发的网络组件、还是监控 Go 或 TypeScript 微服务的连接状态,这套技能都是必备的。希望本文能帮你彻底掌握 netstat 命令。

[AFFILIATE_SLOT_1] [AFFILIATE_SLOT_2] netstat -lssnetstat ---

延伸阅读

学习不止于此,推荐继续深入:


开发资源

posted @ 2026-04-28 18:20  ycfenxi  阅读(181)  评论(0)    收藏  举报