常用指令
清屏:
cls
查找 “占用指定端口的进程”:
netstat -ano | findstr ":8080" # Windows用findstr筛选;Linux/macOS用grep ":8080"
查看系统网络连接状态
netstat 的本质是“读取系统内核的TCP/IP协议栈数据”,将抽象的网络状态以人类可读的格式输出,主要解决以下场景需求:
- 查看当前系统的所有网络连接(包括 TCP/UDP 连接,区分 “本地端” 和 “远程端”);
- 识别正在监听的端口(即程序等待外部连接的端口,如 Web 服务的 80/443 端口);
- 查看路由表信息(确认数据包的转发路径是否正确);
- 统计网络接口流量(如网卡的发送 / 接收字节数、错误包数量);
- 关联网络连接与进程(找到占用某个端口的具体进程,排查 “端口被占用” 问题)。
常用参数详解
netstat 的功能通过 “参数组合” 实现,不同平台(Windows/Linux)部分参数存在差异,以下按 “功能分类” 整理最常用的参数:
| 参数 | 支持平台 | 核心功能描述 |
|---|---|---|
| -a | 全平台 | 显示所有网络连接和监听端口(包括处于 LISTENING 状态的监听端口,默认不显示) |
| -n | 全平台 | 以 “数字格式” 显示地址和端口(不解析主机名、域名、服务名,速度更快) |
| -o | 全平台 | 显示每个连接对应的进程 ID(PID)(关键参数,用于定位占用端口的进程) |
| -p 协议 | 全平台 | 指定协议类型,如 -p tcp 只显示 TCP 连接,-p udp 只显示 UDP 连接;Windows 下支持 -p tcpv6 等 |
| -r | 全平台 | 显示路由表(包括默认网关、目标网络、子网掩码、接口等) |
| -e | 全平台 | 显示网络接口统计信息(如每个网卡的发送 / 接收字节数、丢弃包、错误包数量) |
| -s | 全平台 | 显示协议统计信息(按 TCP、UDP、ICMP 等协议分类,统计连接建立 / 关闭次数、错误数等) |
| -b | 仅 Windows | 显示每个连接对应的进程名及可执行文件路径(需管理员权限,定位进程更直观) |
| -t | 仅 Linux/macOS | 仅显示 TCP 连接(等同于 Windows 的 -p tcp) |
| -u | 仅 Linux/macOS | 仅显示 UDP 连接(等同于 Windows 的 -p udp) |
| -l | 仅 Linux/macOS | 仅显示处于监听状态(LISTENING) 的端口(等同于 Windows -a 筛选 LISTENING) |
##
查看保留端口范围
netsh interface ipv4 show excludedportrange protocol=tcp
解决方案:
#1 方法一
net stop winnat
# 此时启动您的程序(可绑定8964)
net start winnat # 恢复网络服务
#2 方法二 添加排除
netsh int ipv4 add excludedportrange protocol=tcp startport=8964 numberofports=1
#3 方法三 修改排除范围
# 步骤1:停止网络服务
net stop winnat
# 步骤2:删除8900-8999的排除范围
netsh int ipv4 delete excludedportrange protocol=tcp startport=8900 numberofports=100
# 步骤3:添加两个排除范围,分别排除8900-8963和8965-8999
netsh int ipv4 add excludedportrange protocol=tcp startport=8900 numberofports=64
netsh int ipv4 add excludedportrange protocol=tcp startport=8965 numberofports=35
# 步骤4:重新启动网络服务
net start winnat
# 查看修改后的排除范围
netsh int ipv4 show excludedportrange protocol=tcp | sls -Context 2 "8900|8964"
介绍
Windows 的端口排除机制是系统为避免端口冲突、保障网络服务稳定运行而设计的 “端口预留 / 隔离” 规则,核心逻辑分为以下几部分:
一、机制的核心目的
系统会自动 “锁定” 一部分端口(或端口范围),阻止应用程序直接绑定,以此避免以下问题:
- 动态端口耗尽:Windows 有默认的动态端口范围(如 49152–65535),用于临时出站连接。若应用占用动态端口范围内的端口,可能导致系统出站连接失败(“端口耗尽”)。
- 服务冲突:Hyper-V、WSL、Docker 等虚拟化 / 网络服务会预留端口范围,防止与其他程序抢端口。
- 权限限制:部分端口(如 80、443 等知名端口)需要管理员权限才能绑定,系统会自动拦截普通程序的绑定请求。
二、“手动排除” 的管理方法
若需让某端口 “绕过系统锁定”,可通过以下步骤干预:
- 查看当前排除的端口范围
以管理员身份运行命令提示符,执行:
netsh interface ipv4 show excludedportrange protocol=tcp
输出中会列出所有被系统 “锁定” 的 TCP 端口范围(如 12284–12383)。
- 停止 winnat 服务(临时释放端口)
部分排除规则由 winnat 服务维护,停止它可临时释放端口:
net stop winnat
- 手动 “预留” 端口(强制排除系统占用)
若需让某端口(如 12334)不被系统动态分配,可强制将其加入排除列表:
netsh int ipv4 add excludedportrange protocol=tcp startport=12334 numberofports=1
这条命令会让 12334 端口被系统 “预留”,不再自动分配给其他服务。
一条用于手动配置 Windows 端口排除规则的命令,作用是强制让系统 “预留” 指定的 TCP 端口,避免被系统服务或动态分配占用。
- 重启 winnat 服务(使设置生效)
操作完成后,需重启服务以恢复网络 NAT 功能:
net start winnat
###
手动排除与系统排除的差异:
举个实际场景:帮你理解差异
假设你需要用 12334 端口运行一个本地服务器,遇到两种情况:
- 情况 1:12334 被系统锁定(带
\*)- 原因:可能是 Winnat 服务启动时,自动将 12334 纳入了它的排除范围(比如为了热点转发)。
- 问题:你直接启动服务器会提示 “端口被占用”,且用
delete命令删不掉(提示 “找不到元素”)。 - 解决:必须先停 Winnat(
net stop winnat),但停了之后电脑热点会用不了;且重启 Winnat 后,系统可能又锁定其他端口(甚至重新锁定 12334)。
- 情况 2:你手动添加 12334 为排除端口(无
\*)- 操作:执行
netsh int ipv4 add excludedportrange protocol=tcp startport=12334 numberofports=1。 - 效果:即使 Winnat、Hyper-V 等服务重启,系统也会避开 12334 端口;你启动服务器时能直接绑定成功,且后续想释放端口时,用
delete命令就能轻松删除,不影响系统服务。
- 操作:执行
三、核心总结
| 一句话区分 | 系统锁定端口:“系统要用来干活,不让你碰,你也难改”; |
|---|---|
| 手动排除端口:“你要用来干活,告诉系统别碰,你想改就改”。 |