一.最常见的Windows端口占用
使用netstat -ano 可以查询端口使用情况。
使用netstat -ano | findstr "1337" 可以查询具体的端口是否被占用。
如发现端口被占用,记住查询结果末尾的PID,然后在进程管理内将该PID所属进程关闭即可。
如使用netstat未发现端口被占用,则有可能是下边的情况。
二.Windows虚拟化产品Hyper-V保留端口
netstat查询端口未被占用,但是程序有时候启动成功,有时候启动失败,那么此时极有可能是你的电脑安装了Windows的虚拟化产品Hyper-V。Hyper-V 会为容器宿主网络服务(Windows Container Host Networking Service) **随机** 保留一些端口号使用,被保留的端口通过netstat查询不到被占用。
正常情况下,Hyper-V 虽然会在「TCP 动态端口范围」中随机挑一些端口号保留(占用),不过保留的端口号普遍比较大,就算保留几百、几千个也影响不大。但Windows 自动更新有时会出错,导致这个范围的起始端口被重置为 1024,一些常用端口可能会被保留而无法使用了。
1. 查询当前占用范围
使用命令netsh int ipv4 show dynamicport tcp可查看目前「TCP 动态端口」的占用范围,这只是一个「待选择」范围,并不代表其中的所有端口都会被保留,只是有一部分会被Hyper-V占用。
2. 查询当前占用详情
使用命令netsh int ipv4 show excludedportrange protocol=tcp可查看目前所有已经被征用的端口
端口占用在可用范围内是随机的,每次重启电脑则会变化,这就是为什么有时候程序启动正常,有时候不正常。如果被占用端口的范围从1024开始,且刚好随机到我们常用的 1377、3000、3306、8080、8088 等 Web 开发常用端口,那么就会导致相应程序无法启动。
以下是重启电脑前后端口被占用情况,对比可知被占用端口是动态变化的
Start Port End Port
---------- --------
1031 1130
1131 1230
1231 1330
1331 1430
1431 1530
1653 1752
1753 1852
1939 2038
5357 5357
50000 50059 *
Start Port End Port
---------- --------
1070 1169
1170 1269
1270 1369
1370 1469
1470 1569
1570 1669
1670 1769
5357 5357
50000 50059 *
3.解决办法
以管理员身份运行cmd执行以下代码,改变被占用端口的起始位置和数量
netsh int ipv4 set dynamicport tcp start=49152 num=16384
也可以不改变被占用端口的起始位置而是设置指定端口不被占用
netsh int ipv4 add excludedportrange protocol=tcp startport=1099 numberofports=1
4.重启并再次查询端口被占用情况
当前占用范围
当前占用详情
5.常用命令
# 禁用Hyper-V
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
# 启动Hyper-V
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
# 显示动态端口范围
netsh int ipv4 show dynamicport tcp
# 显示例外端口范围
netsh interface ipv4 show excludedportrange protocol=tcp
# 设置动态端口TCP范围
netsh int ipv4 set dynamicport tcp start=1024 num=13977
# 设置动态端口UDP范围
netsh int ipv4 set dynamicport udp start=1024 num=13977
# 添加例外端口
netsh int ipv4 add excludedportrange protocol=tcp startport=1099 numberofports=1