一、问题描述

经常在电脑重启之后打开容器 / 启动IDEA / 运行 Spring Boot 应用时,会报某个端口已经被占用,但是在使用netstat -aon | findstr "3306"时却找不到占用端口的程序,往往在电脑重启之后会解决这个这个问题。

二、原因

本机启用了 Hyper-V 功能,这个功能与 Docker 或者 虚拟机 有关,使用 WSL2也需要开启这个功能。Widows 默认把某些端口范围分给了 Hyper-V ,成为了保留端口,所以我们无法使用这个端口。并且由于这个端口分配在电脑重启的时会重新随机分配,所以出现了前面 重启几次电脑的解决办法。

1. 查看 Windows 默认的 tcp 动态端口范围

使用命令netsh int ipv4 show dynamicport tcp就可以查看。这里先借用别人的结果,因为我这边机器已经重新设置了。

> netsh int ipv4 show dynamicport tcp
  • 设置之前的结果

20210302094829.png

这里可以看到默认的 tcp 动态范围为 1024-13977,并且当我们开启 Hyper-V 之后,系统会默认分配一些端口给 Hyper-V 使用。

2. 查看保留端口范围

使用命令 netsh interface ipv4 show excludedportrange protocol=tcp 就可查看保留端口的范围了。

> netsh interface ipv4 show excludedportrange protocol=tcp
  • 设置之前的结果

20210302095346.png

可以看到 IDEA 运行所需的端口在这个范围内,有时候 3306这样的端口也会在这个范围中包括,从而不能运行 MySQL。

三、解决问题

使用管理的身份运行 CMD ,设置动态端口的范围,使得这个保留端口的范围避开我们需要的端口范围。

> netsh int ipv4 set dynamicport tcp start=49152 num=16383
> netsh int ipv4 set dynamicport udp start=49152 num=16383

然后重新启动电脑,使用上面的命令检查端口占用:

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐