开发中端口号乱跳

一、情况概述

使用 windows 11 开发,在偶然的情况下会出现 1888、8080、8000 端口被占用,导致项目启动到别的端口号上,甚至每次启动都不一样

当这个情况出现后,可能重启一次能解决问题,可能一直重启都无法解决问题,并且使用

netstat -ano | findstr [端口号]

也无法找到占用端口的程序,但是项目无法正确的在 1888 上启动

二、造成这种情况的原因

1、windows 里有一个功能叫 < TCP 动态端口范围 >,在这个范围里的端口会被一些服务占用

  • Windows Vista(或 Windows Server 2008)之前,动态端口范围是 1025 到 5000

  • 在 Windows Vista(或 Windows Server 2008)之后,默认起始端口为 49152,默认结束端口为 65535

2、如果安装了 Hyper-V,那么 Hyper-V 会为容器宿主网络服务(Windows Container Host Networking Service)随机保留一些端口号使用

旧的 windows 为了遵守 Internet 分配号码颁发机构 (IANA) 建议,把端口从 1025-5000 改到了 49152-65535

在一些情况下 windows 自动更新会把起始端口号设置为 1025,那么 1888、8000 等端口就不能使用了,所以会出现项目启动端口乱跳

三、解决方案

使用:

netsh int ipv4 show dynamicport tcp

可以查看当前系统中为< TCP 动态端口>分配的端口范围

使用:

netsh int ipv4 show excludedportrange protocol=tcp

可以查看被征用的端口范围,如果发现要使用的端口在这个范围内,则会出现端口号乱跑的情况

1、解决方案:排除指定的端口,让系统不占用指定的端口

netsh int ipv4 add excludedportrange  protocol=tcp startport=1888 numberofports=10

— 这里 1888 为开始的端口,10 的意思为 1888 - 1898 这 10 个端口全都要移出保留端口,如果只想 8081 不作为端口,那么 10 可以改成 1

2、修改< TCP 动态端口>的范围,把常用的端口划出去,或者划分不常用的端口留给系统使用

netsh int ipv4 set dynamic tcp start=49152 num=16384
netsh int ipv6 set dynamic tcp start=49152 num=16384

— 从 49152 开始的 16384 个端口,也就是 49152-65535,提供给<TCP 动态端口>服务

3、重启电脑,就可以正常使用端口了

四、参考

保留一系列临时端口 - Windows Server | Microsoft Learn

Windows Vista 和 Windows Server 2008 中 TCP/IP 的默认动态端口范围已更改 - Windows Server | Microsoft Learn

一文解决 windows 电脑端口被占用问题,专治疑难杂症和 port xxxx was already in use 说再见_windows 端口被占用怎么解决_T-OPEN 的博客-CSDN 博客