使用idea啟動項目的時候一直顯示1099端口被占用,但是在cmd中使用命令查看端口卻沒有綁定服務(wù),百度后才知道是Hyper-v的原因。
一.這個問題的背景分為兩部分:
-
Windows
中有一個「TCP 動態(tài)端口范圍」,處在這個范圍內(nèi)的端口,有時候會被一些服務(wù)占用。在Windows Vista
(或Windows Server 2008
)之前,動態(tài)端口范圍是1025
到5000
;在Windows Vista
(或Windows Server 2008
)之后,新的默認起始端口為49152
,新的默認結(jié)束端口為65535
。 - 如果安裝了
Hyper-V
,那么Hyper-V
會為容器宿主網(wǎng)絡(luò)服務(wù)(Windows Container Host Networking Service)隨機保留一些端口號使用。
正常情況下,Hyper-V
雖然會在「TCP 動態(tài)端口范圍」中隨機挑一些端口號保留(占用),不過保留的端口號普遍比較大,就算保留幾百、幾千個也影響不大。但是,Windows 自動更新有時會出錯,導(dǎo)致這個范圍的起始端口被重置為 1024
……這可就麻煩了,一些常用端口動不動就因為被保留而無法使用了。
使用命令 netsh int ipv4 show dynamicport tcp
可以查看目前「TCP 動態(tài)端口」的范圍,如圖所示。
這只是一個「待選擇」范圍,并不代表其中的所有端口都會被保留,只是有一部分會被
Hyper-V
征用。使用 netsh int ipv4 show excludedportrange protocol=tcp
命令可以查看當前所有已經(jīng)被征用了的端口,如圖 2 所示。如果這些被征用的端口范圍隨機挑選到
8088
、8000
、3000
等 Web 開發(fā)常用端口,那開發(fā)就會受到影響;如果挑選到其他應(yīng)用軟件要調(diào)用的端口,那這些應(yīng)用軟件就會受到影響,可以說非常坑爹了……
在說正確的解決方法前,我們先說一個在 Stack Overflow 上看到的錯誤解決方法,這個方法還在好幾個地方被提到過。
二. 錯誤的解決方法
錯誤的解決方法是,運行 net stop winnat
停止 winnat 服務(wù),然后再運行 net start winnat
啟動 winnat 服務(wù)。
這個方法本質(zhì)上就是重啟電腦的簡化版……讓 Hyper-V
再隨機初始化一些端口保留,如果正好沒隨機到要用的端口,那一次成功。如果還是隨機到了要用的端口,那就只能多來幾次。
在那個問題的回答下,我看到有一些網(wǎng)友說「對我有用」,也有一些網(wǎng)友說「對我沒用」,原因就是這個方法解決問題的概率完全是隨機的……
三. 正確的解決方法
正確的解決方法很簡單,就是重新設(shè)置一下「TCP 動態(tài)端口范圍」,讓 Hyper-V
只在我們設(shè)定的范圍內(nèi)保留端口即可。可以以管理員權(quán)限運行下面的命令,將「TCP 動態(tài)端口范圍」重新設(shè)定為 49152-65535
。如果你覺得這個范圍太大,還可以改小一點。
1 | netsh int ipv4 set dynamic tcp start=49152 num=16384 |
---|---|
2 | netsh int ipv6 set dynamic tcp start=49152 num=16384 |
然后重啟電腦即可。
重啟電腦后,再運行命令 netsh int ipv4 show dynamicport tcp
查看動態(tài)端口范圍,發(fā)現(xiàn)確實已經(jīng)修改為了 49152-65535
。現(xiàn)在只有這個范圍內(nèi)的端口可能會被保留了,基本不會影響日常使用(圖 3)。