Win10 各種端口占用問題的解決辦法


在啟用 Hyper-V 后,總是會產生各種端口被占用的問題

我遇到過的問題就有:

  1. 啟動 IDEA 時,報錯:

    java.net.BindException: Address already in use: bind

  2. 使用 Clash for Windows 時,Could not connect to Clash Core,日志:

    time="2020-07-28T07:08:37+08:00" level=error msg="External controller error: listen tcp 127.0.0.1:9090: bind: An attempt was made to access a socket in a way forbidden by its access permissions."

顯然,這兩個錯誤都是端口被占用造成的。

根據IDEA Start Failed: Address already in use - Serge Baranov 的回答,IDEA 會在 6942~6991 中尋找一個端口並 bind。由此可見,錯誤原因是這 50 個端口都已經被占用。

根據日志內容,第二個問題是 9090 端口被占用造成的

對於一般的端口占用問題,比如我的 27891 被占用,可以先查找出正在使用此端口的進程,再強行終止這個進程(如果失敗可以試試以管理員身份):

PS C:\Users\hyuuko> netstat -ano | findstr 27891
  TCP    127.0.0.1:8780         127.0.0.1:27891        SYN_SENT        6276
  TCP    127.0.0.1:8802         127.0.0.1:27891        SYN_SENT        6276
PS C:\Users\hyuuko> taskkill /pid 6276 /F
成功: 已終止 PID 為 6276 的進程。
PS C:\Users\hyuuko>

然而,我使用netstat -ano | findstr 端口號命令時,發現 6942~6991 和 9090 並未被某個進程使用。這說明這些端口可能是被系統保留了,比如 Hyper-V。

根據List of TCP and UDP port numbers - Wikipedia所言,tcp/udp 端口號被分為 3 段:

端口類型 范圍 用途
周知端口 0 - 1023 提供廣泛使用的網絡服務類型的系統進程使用
注冊端口 1024 - 49151 給用戶進程或應用程序使用,比如 IDEA
動態端口 49152-65535 用於私有或定制服務、臨時目的以及臨時端口的自動分配

Hyper-V 會將動態端口中的幾段范圍的端口保留給自己使用,用戶的應用程序無法使用這些端口。從 Windows Vista 和 Windows Server 2008 起,Windows 將 49152-65535 划分為 動態端口,見Service overview and network port requirements for Windows。然而在某次更新后,Windows 的動態端口范圍變成了 1024~15000,我們可以查看動態端口范圍和被保留的端口范圍:

# 查看tcp ipv4動態端口范圍
PS C:\Users\hyuuko> netsh int ipv4 show dynamicport tcp

協議 tcp 動態端口范圍
---------------------------------
啟動端口        : 1024
端口數          : 13977

# 查看tcp ipv4端口排除范圍(被系統或者我們自己保留的端口)
PS C:\Users\hyuuko> netsh int ipv4 show excludedport tcp

協議 tcp 端口排除范圍

開始端口    結束端口
----------    --------
      1578        1677
      1678        1777
太多了這里省略...
      8974        9073
      9074        9173
      9174        9273
太多了這里省略...
     11301       11400
     11401       11500
     50000       50059     *

* - 管理的端口排除。

PS C:\Users\hyuuko>

可以看到,9074~9173 等等范圍內的端口被系統保留了(絕對是 Hyper-V 干的!),導致 clash 不能使用 9090 端口。現在知道原因了,有三種解決辦法(我用的第二種)

第一種解決辦法(不推薦)

更改 clash 使用的端口,將 9090 改成較高的 29091,可是治標不治本,因為 Hyper-V 下次可能就會將 29091 保留給自己用。再者而這還不能解決 IDEA 的問題,你不能改變 IDEA 想要使用的端口。

第二種解決辦法

先以管理員身份打開 powershell,然后設置 tcp ipv4 的動態端口范圍為 49152 開始的 16384 個端口,也就是 49152~65535

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

然后重啟電腦。Hyper-V 就會從 49152~65535 范圍內保留一部分端口,6942~6991 和 9090 不受影響。

查看一下此時的動態端口范圍:

PS C:\Users\hyuuko> netsh int ipv4 show dynamicport tcp

協議 tcp 動態端口范圍
---------------------------------
啟動端口        : 49152
端口數          : 16384

第三種解決辦法

先以管理員身份打開 powershell,然后將 9090 等端口設置為排除端口給應用程序使用。

# 保留 6942~6951 這10個端口給應用程序使用
netsh int ipv4 add excludedportrange protocol=tcp startport=6942 numberofports=10
# 保留 9090 端口給應用程序使用
netsh int ipv4 add excludedportrange protocol=tcp startport=9090 numberofports=1

然后重啟電腦。因為 9090 等端口被保留給應用程序使用了,Hyper-V 就無法將 9090 保留給自己使用了。

查看一下此時被保留的端口:

PS C:\Users\hyuuko> netsh int ipv4 show excludedport tcp

協議 tcp 端口排除范圍

開始端口    結束端口
----------    --------
      1578        1677
      1678        1777
太多了這里省略...
      9090        9090     *
太多了這里省略...
     11301       11400
     11401       11500
太多了這里省略...

* - 管理的端口排除。

帶星號的就是被管理員保留的端口,可以被應用程序使用

如果要取消保留端口,可以:

netsh int ipv4 delete excludedportrange protocol=tcp startport=9090 numberofports=1

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM