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 后,怎么知道是哪个程序?两种方法:
方法一:任务管理器(图形化)
- 按
Ctrl + Shift + Esc打开任务管理器。 - 切换到「详细信息」选项卡。
- 点击「PID」列排序,找到对应的 PID。
- 看「映像名称」就知道是谁了。
方法二: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 的排查逻辑串起来:
3.6 实战:一个完整的排查例子
假设你启动了一个 Web 服务,但浏览器访问不了。你会怎么做?
- 先确认服务是否在监听:
netstat -ano | findstr :8080。如果看到LISTENING,说明服务启动了。 - 如果没看到: 检查服务是否启动成功,或者端口是不是配错了。
- 如果看到了: 检查防火墙是否放行了 8080 端口。用
telnet 127.0.0.1 8080测试本地连通性。 - 如果本地能通,远程不行: 检查防火墙规则,或者服务是否绑定了
127.0.0.1而不是0.0.0.0。
避坑指南: 我曾经遇到过一个问题,
netstat -ano 显示端口在 LISTENING,但就是连不上。后来发现是服务只监听了 IPv6 地址,没监听 IPv4。加上 -p TCP 参数可以只看 TCP 协议,避免被 UDP 干扰。