解决 Windows 端口被随机占用
1. 问题
有时开发的时候,会提示某些端口不能用。问题出现的非常随机,只能用重启解决。或者有时在WSL中监听的端口没法在主机上访问。如果使用netstat -ano
查看也发现没有被占用。
2. 排查问题
Windows
中有一个TCP 动态端口范围
。处在这个范围内的端口,有时候会被一些服务占用。在 Windows Vista
之前,动态端口范围是 1025
到 5000
。在 Windows Vista
之后,新的默认起始端口为 49152
,新的默认结束端口为 65535
。如果安装了 Hyper-V
,那么 Hyper-V
会为容器宿主网络服务随机保留一些端口号使用。
使用命令
Tera Term Macro
netsh int ipv4 show dynamicport tcp
可以查看目前「TCP 动态端口」的范围。
使用
Tera Term Macro
netsh int ipv4 show excludedportrange protocol=tcp
命令可以查看当前所有已经被Hyper-V
占用了的端口。
3. 解决方案
只要重新设置一下TCP 动态端口范围
,让 Hyper-V
只在设定的范围内保留端口即可。
使用管理员权限运行下面的命令,重设动态端口范围重新设定为 49152-65535
。
netsh int ipv4 set dynamic tcp start=49152 num=16384
netsh int ipv6 set dynamic tcp start=49152 num=16384
这个解决方法同样适用于某些软件无法监听1080
端口的问题。
4. 其他命令
Tera Term Macro
# 禁用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 int ipv4 show dynamicport udp
# 显示例外端口范围
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv4 show excludedportrange protocol=udp
# 设置动态端口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=1024 numberofports=1