縮短Windows的TCP斷線前TIME_WAIT等候

前陣子發現在實作System.Net.HttpWebResponse取回資訊的時候,明明有使用usingClose()進行正確的關閉動作,但是TCP PORT還是保持在TIME_WAIT時期一段很長的時間,經查依照TCP規範預設TIME_WAIT的逾時時間為兩倍MSL(Maximum Segment Lifetime),這個等待期也太長了。

下列是一個透過netstat指令觀察TIME_WAIT的連線狀態:

C:\>netstat -an | findstr "TIME_WAIT"
TCP    XX.XX.XX.XX:7485    20.209.68.33:443    TIME_WAIT

改善網路效能

依據微軟的官方文件,指出Windows預設的TIME_WAIT是120秒,但其實依據我實際的觀察會更久才關閉(大約3-4分鐘),因此我們將其縮短成微軟建議的30秒,可將預設TCP的等候關閉時間大幅縮短。

將下列的REG登入程式碼,存成TimeWait.reg,其中的16進制數值1e就是10進制的30

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e

存檔後點擊兩下,就可以註冊到Windows註冊檔了,重新開機就可以套用新的設定。

心得

TIME_WAIT狀態還有解決辦法,如果是卡在ESTABLISHED狀態的話就需要更久的時間,這部分可能就只能依據TCP的規範慢慢等了。另外有一個可以增加動態分配PORT範圍的MaxUserPort,但這部分微軟的文件說得很隱諱(特別是不同作業系統版本的預設值),所以我對其態度是暫不處理,等到日後真的有遇到再說。

.NET .NetFramework ImproveNetworkPerformance WindowsServer TCP Connection Close Disconnection