本文主要介紹Windows實例無法訪問內網或外網服務器的端口,查看系統日志提示“TCP/IP無法建立傳出連接”錯誤信息的解決方案。
問題描述
Windows實例多次出現無法訪問到任何內網或外網服務器端口的問題,期間可以正常執行ping。經過一段時間后,可以正常訪問目標端口。通過查看系統日志提示如下錯誤信息:
TCP/IP無法建立傳出連接,因為選定的本地終結點最近用于連接到相同的遠程終結點。當以高速率打開和關閉傳出連接時,會導致所有可用的本地端口被使用,并迫使TCP/IP重新使用本地端口進行傳出連接,此時通常會產生這種錯誤。為了最大限度地降低數據受到損壞的風險,在給定的本地終結點和給定的遠程終結點之間的連續連接中,TCP/IP標準需要等待一段最短的時間段。
關于如何查看系統日志的具體操作,請參見查看實例的系統日志和屏幕截圖。
問題原因
該問題通常是由于Windows實例的TCP連接數已達到上限,無法建立新的TCP連接導致。
解決方案
通過調整注冊表項,例如將MaxUserPort
限制提高到65534,以及將TcpTimeWaitDelay
設置減少到30秒等修改操作,將有助于增加可用的TCP端口數量,從而在接近端口極限時,提高新建TCP連接的成功率。
請根據您的具體使用情況調整這些數值以達到最佳效果。
遠程連接Windows實例。
具體操作,請參見通過密碼或密鑰認證登錄Windows實例。
打開運行對話框,輸入
regedit
命令,然后單擊確定。在彈出的注冊表編輯器窗口中,進入
計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
目錄下。創建并修改MaxUserPort值。
右鍵單擊
Parameters
目錄,選擇 ,并命名新值為MaxUserPort
。雙擊
MaxUserPort
文件,基數區域選擇十進制,數據數值設為65534
。重啟Windows實例使配置生效。具體操作,請參見重啟實例。
說明為了使注冊表的更改生效,需要重啟服務器。如果您暫時不能重啟服務器,您可以打開命令提示符(cmd)嘗試通過執行
netsh int ipv4 set dyn tcp [$Start_Num] [$Num_Range]
命令來臨時增加可用端口的數量。其中[$Num_Range]
為端口數,[$Start_Num]
為啟動端口,請替換為實際所需數值。
(可選)創建并修改其他相關TCP參數,然后重啟Windows實例。
方法
配置項名稱
設定值(示例)
說明
調整
TcpTimedWaitDelay
以縮短關閉端口后的等待時間。TcpTimedWaitDelay
30
默認情況下,一個端口關閉后需要等待120秒才能再次使用。通過修改
TcpTimedWaitDelay
的值,您可以減少這個時間。例如,將其設置為30秒可以使端口更快地重新可用。減少TCP的
KeepAlive
時間以自動清理CLOSE_WAIT
的連接KeepAliveTime
300000毫秒(5分鐘)
控制TCP保持連接存活的時間,減小該值可以使操作系統更快地關閉無效或半開放的連接。
KeepAliveInterval
1000
控制KeepAlive探測包之間的間隔時間。
TcpMaxDataRetransmissions
5
定義了最大數據重傳次數,減小其值有助于在網絡不穩定時更快地識別斷線。