在 Windows 上開發時,可能會遇到某些常用 port 無法使用,但是用 netstat 又查不到被什麼程式佔用:

netstat -ano | findstr :1455

從這篇文章看到應該是這個 port 被保留了,之前遇到相同問題是使用另一篇文章的方法,把自己要用的 port 從排除範圍刪掉,再重啟 WinNAT 釋放 port:

netsh interface ipv4 delete excludedportrange protocol=tcp startport=3000 numberofports=1
net stop winnat
net start winnat

查看動態 port 範圍

這次先用 netsh interface ipv4 show excludedportrange protocol=tcp 查看有哪些 port 被排除:

通訊協定 tcp 連接埠排除範圍

開始連接埠    結束連接埠
----------    ----------
      1046        1145
      1146        1245
      1246        1345
      1346        1445
      1446        1545
      1546        1645
      1647        1746
      1752        1851
      1921        2020
      2869        2869
      3000        3000     *
      4500        4500     *
      5357        5357
     50000       50059     *

* - 管理的連接埠排除。

接著用 netsh int ipv4 show dynamicport tcp 查看實際被劃定的範圍:

通訊協定 tcp 動態連接埠範圍
---------------------------------
開始連接埠        : 1024
連接埠數目        : 13977

發現這些動態 port 範圍很低,很容易讓常用的 port 被佔用。

原因

根據這篇文章所說,安裝了 Hyper-V 之後,它會為 Host Networking Service (HNS) 隨機保留一些 port 使用。

但現在的 Windows 系統預設會保留 49152 ~ 65535 這段 port,即使一部分被隨機佔用也不會有太大的影響。

然後又因為某些原因導致起始 port 被重置成 1024(是不是 Windows 更新造成的沒有找到準確來源)。

修改動態 port 範圍

要修改動態 port 的範圍,需要以系統管理員身分開啟 PowerShell 執行以下指令:

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

接著重新開機即可,也可以透過重啟 WinNAT 先暫時釋放 port:

net stop winnat
net start winnat

參考連結