问题描述

开发或者启动服务时,经常遇到端口被无端占用情况,时好时坏,查询占用进程无果。 通过网络搜索找到解决 Windows 10 端口被 Hyper-V 随机保留(占用)的问题

原因1:Windos TCP 动态端口范围

处在这个范围内的端口,有时候会被一些服务占用。在 Windows Vista(或 Windows Server 2008)之前,动态端口范围是 1025 到 5000;在 Windows Vista(或 Windows Server 2008)之后,新的默认起始端口为 49152,新的默认结束端口为 65535。

  • 查看动态端口
netsh int ipv4 show dynamicport tcp
  • 输出
C:\Users\GoblinCwl>netsh int ipv4 show dynamicport tcp
协议 tcp 动态端口范围
---------------------------------
启动端口        : 1024
端口数          : 13977
 

原因2:Hyper-V 随机保留端口

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

  • 查看占用端口:
netsh int ipv4 show excludedportrange protocol=tcp
  • 输出
C:\Users\GoblinCwl>netsh int ipv4 show excludedportrange protocol=tcp
 
协议 tcp 端口排除范围
 
开始端口    结束端口
----------    --------
     27339       27339
     50000       50059     *
     51097       51196
     54408       54507
     54986       55085
     55086       55185
     55186       55285
     55286       55385
     55386       55485
     55486       55585
     55586       55685
     55686       55785

当时没复制,这是我解决后的输出了,仅供参考

正常情况下,Hyper-V 虽然会在「TCP 动态端口范围」中随机挑一些端口号保留(占用),不过保留的端口号普遍比较大,就算保留几百、几千个也影响不大。但是,Windows 自动更新有时会出错,导致这个范围的起始端口被重置为 1024……这可就麻烦了,一些常用端口动不动就因为被保留而无法使用了。

解决方案

重新设置「TCP 动态端口范围」

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

设置后重启计算机

  • 重新查看输出
C:\Users\GoblinCwl>netsh int ipv4 show dynamicport tcp
协议 tcp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384
 

补充

可以设置排除特定的端口

netsh int ipv4 add excludedportrange protocol=tcp startport=要排除的端口 numberofports=范围