netstat -ano 在做什么
netstat -ano 是 Windows 上查端口占用与连接状态的主力命令:-a 列出全部连接与监听、-n 用数字形式显示地址和端口(不做反向解析,快且准)、-o 在行尾附加所属进程 PID。定位占用者要两步走:先按端口筛出 PID,再用 tasklist 或 Get-Process 把 PID 翻译成进程名和可执行文件路径。PowerShell 的 Get-NetTCPConnection 输出是结构化对象,可管道筛选,更适合批量排查。
基本信息
| 适用平台 | Windows(CMD 与 PowerShell 均可用) |
|---|---|
| 核心参数 | -a 全部、-n 数字形式、-o 显示 PID;-b 显示可执行文件(慢且需管理员) |
| 监听状态 | LISTENING;已建立为 ESTABLISHED;等待回收为 TIME_WAIT |
| 权限要求 | 查看连接普通用户即可;结束进程需管理员权限 |
| 现代替代 | Get-NetTCPConnection(按端口直接过滤,输出对象) |
典型使用场景
- 应用启动报端口被占用(Windows 错误码 10048),需要找出占用进程
- 安全巡检:核对监听端口的进程是否符合预期,发现意外暴露的服务
- 确认服务监听地址:只绑 127.0.0.1 时外部无法访问,属常见配置问题
- 排查连接堆积:看某个进程大量 ESTABLISHED 或 TIME_WAIT,判断是否有连接泄漏
- 远程桌面或文件共享端口异常时,确认是服务未起还是被防火墙拦截之前的状态核对
定位占用者
定位占用者
netstat -ano | Select-String ':8080' # 按端口筛出相关行与 PID
netstat -ano | findstr LISTENING | findstr ':80 ' # 只看监听且端口以 80 结尾,注意空格界定
Get-NetTCPConnection -LocalPort 8080 | Select-Object LocalAddress, State, OwningProcess
Get-Process -Id 12345 | Select-Object ProcessName, Path # PID 翻译成进程名与路径
tasklist /FI "PID eq 12345" # CMD 里的等价写法
netstat -ano | findstr 'TIME_WAIT' | Measure-Object -Line # 统计 TIME-WAIT 行数输出逐列读法
| 列 | 含义 | 判读要点 |
|---|---|---|
| Proto | 协议(TCP/UDP) | UDP 行没有状态列,只有本端地址与 PID |
| Local Address | 本端地址:端口 | 0.0.0.0:80 监听全部网卡;127.0.0.1:80 仅本机可访 |
| Foreign Address | 对端地址:端口 | 监听行显示为 *:*,有远端地址的是已建立的连接 |
| State | TCP 状态 | LISTENING 才是占用端口的监听方 |
| PID | 进程号,位于行尾 | 配合 tasklist /FI 或 Get-Process 翻译成进程 |
IPv6 会单独出现一行 [::]:80:同一服务可能同时监听 0.0.0.0 与 [::],看到两行属正常双栈监听,不是端口被两个进程占用。
处于 TIME_WAIT 的连接在 Windows 上不显示 PID:它已不归任何活跃进程所有,等待内核回收即可;只有 LISTENING 行的 PID 才值得追查。