Windows 端口占用问题

1,025 阅读3分钟

一.最常见的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占用。 1.jpg

2. 查询当前占用详情

使用命令netsh int ipv4 show excludedportrange protocol=tcp可查看目前所有已经被征用的端口 2.jpg

端口占用在可用范围内是随机的,每次重启电脑则会变化,这就是为什么有时候程序启动正常,有时候不正常。如果被占用端口的范围从1024开始,且刚好随机到我们常用的 13773000330680808088 等 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.重启并再次查询端口被占用情况

当前占用范围
3.jpg
当前占用详情
4.jpg

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