縮短Windows的TCP斷線前TIME_WAIT等候
前陣子發現在實作System.Net.HttpWebResponse
取回資訊的時候,明明有使用using
或Close()
進行正確的關閉動作,但是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
,但這部分微軟的文件說得很隱諱(特別是不同作業系統版本的預設值),所以我對其態度是暫不處理,等到日後真的有遇到再說。