网络问题的排查顺序基本固定:先看本机配了什么地址,再看能不能通到目标,通不到就看断在第几跳,能通但服务用不了就看端口和 DNS。这一篇按这个顺序把对应的命令列成表。
语法和参数名照旧全部取自微软官方 Windows Commands 参考,出处列在文末。文里的示例地址统一用文档保留段和私有地址段(192.0.2.x 是 RFC 5737 里的文档示例段,192.168.1.x 是私有段),你换成自己的实际地址即可。
一、能不能通到目标
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
ping |
用 ICMP 回显请求/应答验证到另一台 TCP/IP 计算机的 IP 级连通性 | ping [/t] [/a] [/n <count>] [/l <size>] [/w <timeout>] [/4] [/6] <targetname> |
ping /n 10 /l 1000 192.0.2.10 |
tracert |
用逐步增加 TTL 的 ICMP 消息确定到目标经过的路径 | tracert [/d] [/h <maximumhops>] [/w <timeout>] [/4] [/6] <targetname> |
tracert /d 192.0.2.10 |
pathping |
统计到目标之间每一跳的延迟与丢包 | pathping [/n] [/h <maximumhops>] [/p <Period>] [/q <numqueries>] [/w <timeout>] <targetname> |
pathping /n 192.0.2.10 |
ping 的常用开关:
| 开关 | 作用 |
|---|---|
/t |
一直发回显请求,直到手动中断(Ctrl+C) |
/a |
对目标地址做反向名称解析 |
/n <count> |
指定发送的回显请求个数 |
/l <size> |
指定发送缓冲区(Data 字段)的长度,单位字节 |
/f |
发送时设置「不分片」标志 |
/i <TTL> |
指定存活时间 |
/v <TOS> |
指定服务类型 |
/r <count> |
记录路由(IPv4) |
/s <count> |
记录每跳的时间戳 |
/j <hostlist> / /k <hostlist> |
松散源路由 / 严格源路由(仅 IPv4) |
/w <timeout> |
等待每次应答的超时时间(毫秒) |
/R |
用 IPv6 的路由头跟踪往返路径 |
/S <Srcaddr> |
指定源地址 |
/4 / /6 |
强制用 IPv4 / IPv6 |
tracert 与 pathping 的关键区别:tracert 每个 TTL 只发少量探测包,快但不准;pathping 会对沿途每一台路由器发多个回显请求,跑得慢但能给出每一跳的丢包率。官方示例里就带着 computing statistics for 125 seconds... 这一行——这就是它在等统计采样,默认参数下等一两分钟是正常的,别以为卡死了。
两个判断上的坑:ping 通不代表端口通,ICMP 与 TCP/UDP 是各自独立的;反过来 ping 不通也不一定说明对方关机,可能是对方或中间设备禁了 ICMP,这种时候直接 tracert 看断在哪一跳,或者换端口检测手段验证。
二、本机到底配了什么
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
ipconfig |
显示当前 TCP/IP 配置,并刷新 DHCP 与 DNS 设置 | ipconfig [/all] [/renew [<adapter>]] [/release [<adapter>]] [/flushdns] [/displaydns] [/registerdns] |
ipconfig /all |
getmac |
返回所有网卡的 MAC 地址及其关联的协议列表 | getmac [/s <computer>] [/fo {table | list | csv}] [/nh] [/v] |
getmac /fo table /nh /v |
netsh interface |
配置和管理网络接口 | netsh interface <子上下文> |
netsh interface show interface |
ipconfig 的参数表(官方收录的全部):
| 参数 | 作用 |
|---|---|
| (不带参数) | 只显示每个适配器的 IP 地址、子网掩码和默认网关 |
/all |
显示所有适配器的完整 TCP/IP 配置 |
/allcompartments |
显示所有隔离舱(compartment)的信息 |
/release [<adapter>] |
向 DHCP 服务器发送 DHCPRELEASE,释放当前配置 |
/renew [<adapter>] |
续订 DHCP 配置 |
/renew6 / /release6 |
对 IPv6 做续订 / 释放 |
/flushdns |
清空并重置 DNS 客户端解析缓存 |
/displaydns |
显示 DNS 客户端解析缓存的内容 |
/registerdns |
手动发起 DNS 名称的动态注册 |
/showclassid <adapter> |
显示指定适配器的 DHCP 类 ID |
/setclassid <adapter> [<classID>] |
设置适配器的 DHCP 类 ID |
ipconfig /all 是最值钱的一条:它一次给出网卡描述、物理地址(MAC)、DHCP 是否启用、租约获取与过期时间、DNS 服务器、默认网关。看「是不是 DHCP 没拿到地址」(出现 169.254 开头就是自动专用地址,说明没联系上 DHCP)、「DNS 填的是谁」都靠它。
netsh interface 常用的三条:
| 写法 | 作用 |
|---|---|
netsh interface show interface |
列出所有接口及其状态 |
netsh interface ipv4 show config name="以太网" |
看指定接口的 IPv4 配置 |
netsh interface ipv4 set address name="以太网" source=dhcp |
把该接口改回自动获取 |
netsh interface ipv4 set address name="以太网" source=static address=192.0.2.10 mask=255.255.255.0 gateway=192.0.2.1 store=persistent |
设静态地址 |
netsh interface ipv4 set dnsservers name="以太网" source=static address=192.0.2.53 |
指定 DNS 服务器(source=dhcp 则改回自动获取) |
netsh interface ipv4 reset |
移除所有用户手工配置的 IPv4 设置(要重启电脑默认设置才生效) |
name= 后面必须写和「网络连接」里一模一样的接口名(中文系统常见的是「以太网」「WLAN」,英文系统是 Ethernet、Wi-Fi),写错会直接报接口找不到。接口名拿不准就先跑 netsh interface show interface 看第一列。
三、路由表与邻居缓存
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
route print |
显示完整路由表 | route print [<destination>] |
route print 192.0.2.* |
route add |
添加路由 | route add <destination> mask <netmask> <gateway> [metric <metric>] [if <interface>] |
route add 192.0.2.0 mask 255.255.255.0 192.168.1.1 |
route delete |
删除路由 | route delete <destination> |
route delete 192.0.2.0 |
route change |
修改已有路由 | route change <destination> ... |
route change 192.0.2.0 mask 255.255.255.0 metric 2 |
arp -a |
显示 ARP 缓存里的当前条目 | arp -a [inet_addr] [-N if_addr] [-v] |
arp -a |
arp -d |
删除指定 IP 的 ARP 条目 | arp -d [inet_addr] [if_addr] |
arp -d 192.0.2.10 |
arp -s |
添加静态 ARP 条目 | arp -s [inet_addr] [eth_addr] [if_addr] |
arp -s 192.0.2.10 00-AA-00-4F-2A-9C |
nbtstat |
显示 NetBIOS over TCP/IP 统计、名称表与名称缓存 | nbtstat [/a <remotename>] [/A <IPaddress>] [/c] [/n] [/r] [/RR] |
nbtstat -A 192.0.2.10 |
nbtstat -R |
清除并重新加载名称缓存 | nbtstat -R |
nbtstat -R |
route 的两个开关要记:/f 会清掉路由表里所有非主机路由、非环回、非多播的条目(远程操作时很危险),/p 是与 add 一起用时把这条路由写成持久路由(重启后还在)。
route print 192.0.2.* 这种带通配的过滤写法在路由表很长时很好用。arp -a -N 192.0.2.99 可以只看指定网卡上的 ARP 表(-N 后面跟的是接口地址)。
arp -s 做静态绑定后,那条记录不会再被 ARP 应答刷新,排查「局域网里有两台设备用同一个 IP」这类冲突时常用;排查完记得 arp -d 删掉。
四、端口和连接
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
netstat |
显示活动的 TCP 连接、监听端口、以太网统计、路由表、IPv4/IPv6 统计 | netstat [-a] [-b] [-e] [-n] [-o] [-p <Protocol>] [-r] [-s] [<interval>] |
netstat -ano |
| 参数 | 作用 |
|---|---|
-a |
显示所有活动的 TCP 连接,以及 TCP/UDP 上正在监听的端口 |
-b |
显示创建每个连接或监听端口所涉及的可执行程序(需要相应权限,且比较慢) |
-e |
显示以太网统计,如发送和接收的字节数、错误数 |
-n |
以数字形式显示地址和端口号,不做名称解析 |
-o |
显示活动连接时附带对应的进程 ID(PID) |
-p <Protocol> |
只显示指定协议的连接 |
-q |
显示所有连接、监听端口和绑定的非监听 TCP 端口 |
-r |
显示 IP 路由表(等同 route print) |
-s |
按协议显示统计信息 |
<interval> |
每隔指定秒数重新显示一次 |
真正排「端口被谁占了」的流程是这两个命令配合:先 netstat -ano 拿到占用本地端口的连接的 PID(-o 那一列),再用 tasklist /fi "PID eq <那个PID>" 查出是哪个程序(tasklist 的过滤字段表在第二篇里)。官方示例里 netstat -o 5 表示每 5 秒刷新一次,做「连接数一直涨」这类观察时用它。
netstat -b 会直接给出程序名,比 -o 少走一步,但它要读每个连接对应的模块信息,速度慢且通常需要管理员权限,连接特别多时很拖。
五、域名解析
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
nslookup |
诊断 DNS 基础设施、查询域名解析结果 | nslookup [exit | help | ls | server | set] [options] |
nslookup example.com 192.0.2.53 |
ipconfig /displaydns |
显示本机 DNS 解析缓存内容 | ipconfig /displaydns |
ipconfig /displaydns |
ipconfig /flushdns |
清空 DNS 解析缓存 | ipconfig /flushdns |
ipconfig /flushdns |
netsh dnsclient |
配置与查看 DNS 客户端设置 | netsh dnsclient <子上下文> |
netsh dnsclient show global |
nslookup example.com 192.0.2.53 里的第二个参数是指定用哪台 DNS 服务器查询,这是它最有用的地方:换一台 DNS 分别查同一个域名,就能判断「是我这边 DNS 服务器的问题还是域名本身配错了」。
直接 nslookup <域名> 不带服务器参数时,它用的是系统配置的 DNS。不带任何参数运行会进入交互模式,官方列出的子命令有 exit、finger、help、ls、lserver、root、server、set、view。交互模式里最常用的是 set type=,用来换查询的记录类型:
set type= 取值 |
查询内容 |
|---|---|
A |
计算机的 IP 地址(默认) |
ANY |
该名称的全部可用记录 |
CNAME |
别名的规范名称 |
MX |
邮件交换器 |
NS |
命名区域的 DNS 名称服务器 |
PTR |
由 IP 反查计算机名 |
SOA |
区域的授权开始记录 |
TXT |
文本信息 |
HINFO |
计算机的 CPU 与操作系统类型 |
查邮件记录就是 set type=MX 之后再敲域名;查反解就是 set type=PTR 后敲 IP。nslookup -debug example.com 会把查询与应答报文一并打出来,看 DNS 到底回了什么。
ipconfig /flushdns 是「域名解析改了但本机还是旧地址」的标准处置,改完 hosts 文件、切换 DNS 之后都值得跑一下。ipconfig /displaydns 出的内容很多,一般配合重定向存成文件再搜。
六、防火墙与无线(netsh 两条主线)
防火墙:netsh advfirewall
| 写法 | 作用 |
|---|---|
netsh advfirewall firewall add rule name="Allow8080" protocol=TCP dir=in localport=8080 action=allow |
放行入站 TCP 8080 |
netsh advfirewall firewall add rule name="BlockOutIP" protocol=TCP dir=out remoteip=192.0.2.10 action=block |
阻止出站到指定地址 |
netsh advfirewall firewall show rule name=all |
列出所有规则 |
netsh advfirewall firewall show rule name="MyRuleName" verbose |
详细查看某条规则 |
netsh advfirewall firewall delete rule name="MyRule" |
删除规则 |
netsh advfirewall set allprofiles state on |
打开所有配置文件的防火墙 |
netsh advfirewall export <路径文件名> |
导出当前防火墙策略 |
netsh advfirewall import <路径文件名> |
导入防火墙策略 |
netsh advfirewall reset [export <路径文件名>] |
把防火墙策略恢复为默认 |
netsh advfirewall show allprofiles |
查看各配置文件的防火墙状态 |
上面几条 add rule 的写法直接来自官方示例。dir=in/dir=out 是入站/出站,action=allow/action=block 是放行/阻止,protocol=、localport=、remoteip= 是匹配条件。改之前先 export 一份,reset 这种操作才敢敲。
无线:netsh wlan
| 写法 | 作用 |
|---|---|
netsh wlan show interfaces |
查看无线网卡与当前连接状态 |
netsh wlan show profiles |
列出本机保存过的 Wi-Fi 配置 |
netsh wlan export profile name="WiFiName" folder=D:\wlan key=clear |
把某个配置(含明文密钥)导出成 XML |
netsh wlan connect name="WiFiName" |
连接指定配置 |
netsh wlan disconnect |
断开当前无线连接 |
netsh wlan delete profile name="WiFiName" |
删除保存的无线配置 |
export profile ... key=clear 会把无线密码以明文写在 XML 里,这个文件别随手丢在共享目录;它同时也是「换机后快速恢复无线配置」或用组策略批量下发配置的正常做法。
网络组件复位:netsh winsock / netsh interface
| 写法 | 作用 |
|---|---|
netsh winsock show catalog |
显示 Winsock 目录里注册的 LSP 与命名空间提供程序 |
netsh winsock reset |
把 Winsock 目录重置为干净状态,移除自定义 LSP |
netsh winsock set autotuning on |
打开 Winsock 发送自动调优 |
netsh interface ipv4 show interfaces |
列出 IPv4 接口与索引 |
netsh interface ipv4 reset |
移除全部用户配置的 IPv4 设置,重启后回到默认状态 |
netsh winsock reset 的官方说明是:把 Winsock 目录复位成干净状态、移除自定义 LSP,用来处理 Winsock 设置损坏导致的网络异常,它不影响 Winsock 命名空间提供程序条目。这类复位属于「其他手段都试过之后才动」的一招,做完一般要重启系统,而一些依赖 LSP 的软件(老式杀软的流量监控、部分国产安全软件)需要重装才能重新接管网络栈——所以它是排障手段,不是日常保养。
七、抓数据、传文件、连端口
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
ftp |
与 FTP 服务器之间传文件,可交互也可批处理 | ftp [-v] [-d] [-i] [-n] [-g] [-s:<filename>] [<host>] |
ftp -s:D:\script.txt 192.0.2.20 |
tftp |
与 TFTP 服务之间传文件 | tftp [-i] [<host>] [{get | put}] <source> [<destination>] |
tftp -i 192.0.2.20 get image.bin |
telnet |
与 telnet 服务器通信;不带参数就进入 telnet 上下文 | telnet [/a] [/e <escapechar>] [/f <filename>] [/l <username>] [/t {vt100 | vt52 | ansi | vtnt}] [<host> [<port>]] |
telnet 192.0.2.30 25 |
telnet <主机> <端口> 是最省事的手工端口探测手段:能连上就说明那个端口开着(虽然连上后看到的服务标识不一定乐意被你看到)。注意官方页面上写着必须先安装 telnet 客户端软件才能运行这个命令——较新的 Windows 默认不带这个客户端,要在「可选功能」里单独装上;不想装的话,用 PowerShell 的 Test-NetConnection -Port 同样能验端口(第五篇里讲)。
ftp 的 -s:<文件名> 是用脚本文件跑批量的写法,-i 关掉多文件传输时的逐个确认,-n 表示不使用自动登录(配合脚本里的 user 命令指定账户)。tftp -i 是二进制模式,传固件、镜像这类文件必须加,不加就可能被当文本处理弄坏文件。
八、一条命令抓一份网络现场
下面两个脚本都是只读的:跑一遍 ping、路由表、ARP 表、端口列表、DNS 配置,结果写到桌面上的 txt。脚本里那两处示例地址换成你自己要测的目标再去跑。
PowerShell 版(存成 win-cmd-check-3.ps1):
# Windows 命令详解(三)自检脚本:只读采集网络现场
$target = '192.0.2.10' # ← 换成你要测试的目标地址
$dns = '192.0.2.53' # ← 换成你要对比的 DNS 服务器
$log = Join-Path ([Environment]::GetFolderPath('Desktop')) 'win-cmd-check-3.txt'
Set-Content -Path $log -Value 'Windows 网络现场快照(三)'
Add-Content -Path $log -Value ('生成时间:' + (Get-Date).ToString('yyyy-MM-dd HH:mm:ss'))
function Run([string]$title, [string]$cmd) {
Add-Content -Path $log -Value ''
Add-Content -Path $log -Value ('===== ' + $title + ' =====')
cmd /c $cmd 2>&1 | Add-Content -Path $log
}
Run '完整 IP 配置' 'ipconfig /all'
Run '网卡 MAC 地址' 'getmac /fo list /v'
Run '接口列表' 'netsh interface show interface'
Run '连通性(4 个包)' ('ping /n 4 ' + $target)
Run '路径跟踪' ('tracert /d /h 15 ' + $target)
Run '路由表' 'route print'
Run 'ARP 表' 'arp -a'
Run '监听端口与连接' 'netstat -ano'
Run 'DNS 解析对比(本机 DNS)' ('nslookup ' + $target)
Run 'DNS 解析对比(指定服务器)' ('nslookup example.com ' + $dns)
Run 'DNS 缓存条目数' 'ipconfig /displaydns'
Write-Host ('报告已写入:' + $log)批处理版(存成 win-cmd-check-3.bat):
@echo off
chcp 65001 >nul
setlocal
set "TARGET=192.0.2.10"
set "LOG=%USERPROFILE%\Desktop\win-cmd-check-3.txt"
(
echo Windows 网络现场快照(三)
echo 生成时间:%DATE% %TIME%
echo.
echo ===== 完整 IP 配置 =====
ipconfig /all
echo.
echo ===== 网卡 MAC 地址 =====
getmac /fo list /v
echo.
echo ===== 接口列表 =====
netsh interface show interface
echo.
echo ===== 连通性 =====
ping /n 4 %TARGET%
echo.
echo ===== 路径跟踪 =====
tracert /d /h 15 %TARGET%
echo.
echo ===== 路由表 =====
route print
echo.
echo ===== ARP 表 =====
arp -a
echo.
echo ===== 端口与连接 =====
netstat -ano
) > "%LOG%" 2>&1
echo 报告已写入:%LOG%
pausenetstat -ano 在连接很多的机器上输出会很长(几千行不奇怪),批处理版里没做截断,跑完打开 txt 用编辑器搜关键词比翻页快。
九、这个系列的其它几篇
- Windows 命令详解(一):文件与目录操作常用命令速查表
- Windows 命令详解(二):系统信息、进程与服务管理命令速查表
- Windows 命令详解(四):磁盘与系统维护命令速查表
- Windows 命令详解(五):批处理与 PowerShell 常用写法速查表
十、出处
下列页面均属于微软官方 Windows Commands 参考(https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/):
ping、tracert、pathping、ipconfig、getmac、netsh、netsh-interface、netsh-advfirewall、netsh-wlan、netsh-dnsclient、netsh-winsock、netstat、nslookup、nslookup-set-type、arp、route、nbtstat、ftp、tftp、telnet。
几条重点页面的完整地址:
ipconfig:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/ipconfignetstat:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/netstatnetsh advfirewall(含 add rule 示例):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/netsh-advfirewallnetsh interface(含 set address 示例):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/netsh-interfacenetsh winsock(含 reset 说明):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/netsh-winsocknslookup set type(含记录类型表):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/nslookup-set-type