3. Windows 下使用 netstat:-ano 详解与实战

聊到端口排查,Windows 上最趁手的工具就是 netstat。说实话,我见过不少同事一上来就装第三方工具,其实系统自带的这个命令,用好了能解决 90% 的问题。

今天我就带你把它吃透。不只是背参数,而是真正理解它怎么帮你定位问题。

3.1 netstat -ano:到底查了什么?

先看最常用的组合:

netstat -ano

这四个字母分别代表:

参数 含义 我的理解
-a 显示所有连接和监听端口 不光看已经连上的,还要看正在“等客”的
-n 以数字形式显示地址和端口 跳过 DNS 解析,速度更快,结果更干净
-o 显示关联的进程 PID 这是定位“谁占的”的关键

我个人习惯,每次排查端口问题,第一件事就是敲这个命令。它就像一张“网络连接快照”,把当前系统里所有 TCP/UDP 的底牌都亮给你看。

3.2 查看所有端口及对应 PID

执行 netstat -ano 后,你会看到类似这样的输出:

协议  本地地址          外部地址          状态        PID
TCP    0.0.0.0:135       0.0.0.0:0        LISTENING   1056
TCP    0.0.0.0:445       0.0.0.0:0        LISTENING   4
TCP    192.168.1.10:5432 192.168.1.20:52341 ESTABLISHED 7892
TCP    192.168.1.10:8080 0.0.0.0:0        LISTENING   12340
UDP    0.0.0.0:123       *:*                           1236

每一列都很关键:

  • 协议:TCP 还是 UDP。TCP 有状态,UDP 没有。
  • 本地地址:0.0.0.0:135 表示本机所有 IP 都监听 135 端口。192.168.1.10:5432 表示只监听这个具体 IP。
  • 外部地址:对方是谁。0.0.0.0:0 表示还没连上。
  • 状态:TCP 连接的当前阶段。
  • PID:进程标识符。这是我们的“破案线索”。
我的小技巧: 如果输出太长,可以用 netstat -ano | findstr :8080 直接过滤特定端口。Windows 的 findstr 相当于 Linux 的 grep,很好用。

3.3 根据 PID 定位进程

拿到 PID 后,怎么知道是哪个程序?两种方法:

方法一:任务管理器(图形化)

  1. 按 Ctrl + Shift + Esc 打开任务管理器。
  2. 切换到「详细信息」选项卡。
  3. 点击「PID」列排序,找到对应的 PID。
  4. 看「映像名称」就知道是谁了。

方法二:tasklist 命令(命令行)

tasklist | findstr 12340

直接返回进程名,适合远程或纯命令行的场景。

注意: 有时候 PID 是 4 或 System,那是系统进程。我曾经遇到过新手想“干掉” PID 4 的进程,结果系统蓝屏了。系统进程不要乱动。

3.4 常见状态解读

TCP 连接的状态,是排查问题的核心。我挑三个最常见的说:

状态 含义 我遇到过的场景
LISTENING 端口正在监听,等待连接 服务启动正常,端口已打开。比如 Tomcat 启动后,8080 端口就是 LISTENING
ESTABLISHED 连接已建立,正在通信 客户端连上了服务端,数据正在传输。比如你在访问网页时,浏览器和服务器之间就是 ESTABLISHED
TIME_WAIT 连接已关闭,但端口还在等待 高并发场景下特别多。我优化过一个接口,就是因为 TIME_WAIT 太多导致端口耗尽

关于 TIME_WAIT 多说两句

为什么会这样?TCP 协议为了保证最后一个 ACK 能到达对方,会等 2MSL(约 2-4 分钟)。说白了,这是一种“保险机制”。

但如果你的服务器上 TIME_WAIT 成千上万,那就要注意了。我曾经接手过一个项目,压测时端口全被 TIME_WAIT 占满,新连接连不上。后来通过调整注册表 TcpTimedWaitDelay 才解决。

核心思路: LISTENING 看服务是否启动,ESTABLISHED 看连接是否正常,TIME_WAIT 看系统是否健康。这三个状态,基本能覆盖 80% 的端口排查场景。

3.5 本章知识体系

下面这张图,帮你把 netstat -ano 的排查逻辑串起来:

netstat -ano 排查逻辑 netstat -ano 查看端口与 PID 根据 PID 定位进程 分析 TCP 状态 本地地址 外部地址 任务管理器 tasklist 命令 LISTENING ESTABLISHED 排查口诀 LISTENING 看服务,ESTABLISHED 看通信,TIME_WAIT 看健康 PID 是线索,tasklist 是工具,组合使用效率翻倍

3.6 实战:一个完整的排查例子

假设你启动了一个 Web 服务,但浏览器访问不了。你会怎么做?

  1. 先确认服务是否在监听: netstat -ano | findstr :8080。如果看到 LISTENING,说明服务启动了。
  2. 如果没看到: 检查服务是否启动成功,或者端口是不是配错了。
  3. 如果看到了: 检查防火墙是否放行了 8080 端口。用 telnet 127.0.0.1 8080 测试本地连通性。
  4. 如果本地能通,远程不行: 检查防火墙规则,或者服务是否绑定了 127.0.0.1 而不是 0.0.0.0。
避坑指南: 我曾经遇到过一个问题,netstat -ano 显示端口在 LISTENING,但就是连不上。后来发现是服务只监听了 IPv6 地址,没监听 IPv4。加上 -p TCP 参数可以只看 TCP 协议,避免被 UDP 干扰。