Windows 系统排查:netstat 命令详解

好,咱们正式开始动手排查端口占用。Windows 系统下,最核心的工具就是 netstat。说实话,我见过不少新手一上来就装各种第三方工具,其实大可不必。系统自带的这个命令,用好了,80% 的问题都能当场解决。

我个人习惯,排查端口问题从来不开图形界面。一个 cmd 窗口,几行命令,效率最高。你想想看,服务器上哪有那么多图形界面给你用?

netstat 命令基础

netstat 的全称是 Network Statistics,用来显示网络连接、路由表、接口统计等信息。咱们排查端口占用,主要用它的连接查看功能。

先看一个最基础的用法:

C:\Users\admin> netstat

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    192.168.1.100:49678    stackoverflow:https    ESTABLISHED
  TCP    192.168.1.100:49679    dns.google:https       ESTABLISHED
  TCP    0.0.0.0:135            DESKTOP:0              LISTENING
  TCP    0.0.0.0:445            DESKTOP:0              LISTENING

这个输出能看到什么?协议类型、本地地址和端口、远程地址和端口、连接状态。但有个问题——你看不到进程 ID。光知道 135 端口在监听,你根本不知道是哪个程序干的。

嗯,这里要注意,不加参数时 netstat 只显示当前用户的连接。想看到所有进程的信息,必须加参数。

netstat -ano:黄金组合

我排查端口问题时,90% 的情况只用这一组参数:-ano。这三个字母各有用处:

参数 作用 为什么重要
-a 显示所有连接和监听端口 不写这个,你只能看到已建立的连接,看不到正在监听的端口
-n 以数字形式显示地址和端口 跳过 DNS 解析,速度飞快,输出也干净
-o 显示关联的进程 PID 这是定位进程的关键,没有它你只能瞎猜

组合起来就是:

C:\Users\admin> netstat -ano

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1232
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       6780
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       876
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       4521
  TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING       876

看到最后一列 PID 了吗?这就是进程的身份证号。有了它,你就能顺藤摸瓜找到罪魁祸首。

我的小技巧: 如果输出太长,可以用 netstat -ano | findstr :8080 直接过滤。比如你发现 8080 端口被占,就搜这个端口号,一秒定位。

通过 PID 定位进程

拿到 PID 之后,怎么知道是哪个程序?两种方法:任务管理器或者 tasklist 命令。

先说任务管理器。打开任务管理器,切换到「详细信息」选项卡,找到 PID 列。但说实话,我很少用这个方式。为什么?因为服务器上你未必有图形界面,而且任务管理器有时候会卡。

我更推荐用命令行:

C:\Users\admin> tasklist | findstr 4521
java.exe                     4521 Console                    1    256,784 K

看到了吧?PID 4521 对应的是 java.exe。一个 Java 进程占用了 8080 端口。这时候你就知道该去检查哪个应用了。

如果想看更详细的信息,可以加 /FI 参数按 PID 过滤:

C:\Users\admin> tasklist /FI "PID eq 4521"

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
java.exe                     4521 Console                    1    256,784 K
注意: 有些系统进程(PID 4 通常是 System 进程)占用的端口,你没法直接结束。比如 80 端口被 PID 4 占用,那很可能是 HTTP.sys 内核驱动在监听。我曾经遇到过 IIS 和 Apache 抢 80 端口的情况,折腾了半天才发现是内核级监听。

tasklist 命令的更多用法

tasklist 不只是查 PID 这么简单。它还能帮你做这些事情:

  • 查看所有进程: 直接输入 tasklist,列出所有运行中的进程
  • 按映像名称过滤: tasklist /FI "IMAGENAME eq nginx.exe"
  • 查看进程的详细信息: tasklist /V 显示进程名、PID、会话名、内存使用、CPU 时间等
  • 查看 DLL 信息: tasklist /M 显示每个进程加载的 DLL

举个例子,你想看看系统里跑了几个 nginx:

C:\Users\admin> tasklist /FI "IMAGENAME eq nginx.exe"

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
nginx.exe                    12340 Console                    1     8,456 K
nginx.exe                    12341 Console                    1     8,460 K

两个 nginx 进程,一个 master 一个 worker,很典型的架构。

完整排查流程

我把整个流程串起来,画了一张图,你看完就清楚了:

Windows 端口占用排查流程 步骤 1:发现端口被占用 步骤 2:netstat -ano | findstr :端口号 步骤 3:记录占用端口的 PID 步骤 4:tasklist /FI "PID eq 你的PID" 步骤 5:根据进程名决定处理方式 提示:如果是已知服务(nginx、java、python),检查配置;如果是未知进程,先确认再结束

这个流程我用了好多年,从来没出过问题。你按照这个顺序走一遍,99% 的端口占用问题都能定位到具体进程。

实战案例:我遇到的一个坑

讲个真实案例。有一次线上环境,Tomcat 突然起不来了,报 8080 端口被占用。我远程上去一看:

C:\> netstat -ano | findstr :8080
TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       4

PID 是 4?System 进程?我当时就懵了。System 进程怎么可能占 8080?

后来查了半天才发现,原来是之前有人在这台机器上启用了 Windows 的 URL 保留功能,把 8080 端口注册给了 HTTP.sys。用 netsh http show urlacl 一看,果然有个保留项。

解决办法也很简单:

C:\> netsh http delete urlacl url=http://+:8080/

删掉保留项,Tomcat 就能正常启动了。这个坑我印象特别深,所以后来每次排查端口占用,我都会多看一眼 PID 是不是 4。

核心要点:
  • netstat -ano 是排查端口占用的黄金命令,记住这三个参数
  • PID 是连接进程的桥梁,拿到 PID 后用 tasklist 查进程名
  • PID 为 4 的进程是 System,可能是内核级监听,需要用 netsh 处理
  • 用 findstr 过滤输出,避免在大量连接中大海捞针

好了,Windows 下的排查方法就这些。工具不复杂,关键是思路要清晰。你只要记住 netstat -ano 加 tasklist 这个组合拳,大部分端口问题都能搞定。