圖中「客戶」與「服務器」是相對的!誰是客戶誰又是服務器你說了算。服務器
圖中顯示了「TCP正常鏈接創建和終止」所對應的狀態,那麼TIME_WAIT的來由已經很清晰了。主動發起關閉的一方,關閉完成後會進入TIME_WAIT狀態。cookie
TIME_WAIT自身並不會對系統有大的影響,但對於服務器系統來說,固然是但願儘量提升服務器性能。因爲TIME_WAIT數量多會致使TimeWait數據表大,從而影響處理效率。建議設置以下:網絡
在文件「/etc/sysctl.conf 」中添加以下數據:socket
# ip_local_port_range爲向外鏈接的端口範圍。缺省爲:32768到61000。可根據實際應用修改
net.ipv4.ip_local_port_range = 10000 65000
# tcp_fin_timeout爲保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_fin_timeout = 30
# tcp_keepalive_time默認值是7200(2小時)。當keepalive打開的狀況下,TCP發送keepalive消息的頻率。(因爲目前網絡***等因素,形成了利用這個進行的***很頻繁,曾經也有cu的朋友提到過,說若是2邊創建了鏈接,而後不發送任何數據或者rst/fin消息,那麼持續的時間是否是就是2小時,空鏈接***?tcp_keepalive_time就是預防此情形的.我我的在作nat服務的時候的修改值爲1800秒)
net.ipv4.tcp_keepalive_time = 1200
# tcp_max_syn_backlog爲SYN隊列的長度,以容納更多等待鏈接的網絡鏈接數。
net.ipv4.tcp_max_syn_backlog = 8192
# tcp_max_tw_buckets爲系統同時保持TIME_WAIT套接字的最大數量。當超過這個數字時,TIME_WAIT套接字將在系統日誌報出警告。默認爲180000
net.ipv4.tcp_max_tw_buckets = 5000
# tcp_syn_retries默認值是5。對於一個新建鏈接,內核要發送多少個SYN鏈接請求才決定放棄。不該該大於255,默認值是5,對應於180 秒左右時間。(對於大負載而物理通訊良好的網絡而言,這個值偏高,可修改成2.這個值僅僅是針對對外的鏈接,對進來的鏈接,是由tcp_retries1 決定的)
net.ipv4.tcp_syn_retries = 2
# tcp_syncookies開啓SYN Cookies。當SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN***,默認爲0(關閉)。
net.ipv4.tcp_syncookies = 1
# tcp_synack_retries默認值是5。對於遠端的鏈接請求SYN,內核會發送SYN+ACK數據報,以確認收到上一個SYN鏈接請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這裏決定內核在放棄鏈接以前所送出的SYN+ACK數目。不該該大於255,默認值是5,對應於180秒左右時間。(能夠根據上面的tcp_syn_retries來決定這個值)
net.ipv4.tcp_synack_retries = 2
# tcp_tw_recycle開啓TCP鏈接中TIME-WAIT sockets的快速回收,默認爲0(關閉)。
net.ipv4.tcp_tw_recycle = 1
# tcp_tw_reuse將TIME-WAIT sockets從新用於新的TCP鏈接,默認爲0(關閉)。
net.ipv4.tcp_tw_reuse = 1tcp
添加完成以後執行以下指令使配置生效ide
`sysctl -p`性能
OK,這時再監控一下服務器的TimeWait數量吧:優化
watch -d -n 3 "netstat -n|awk "\''/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}'\';spa
此時的TimeWait已徹底在你的控制之中了 日誌
另外,Windows下TIME_WAIT狀態將持續2個MSL(Max Segment Lifetime),在Windows下默認爲4分鐘(即240秒),TIME_WAIT狀態下的socket不能被回收使用。
修改方法:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters添加名爲TcpTimedWaitDelay的DWORD鍵(譬如設置爲60),以縮短TIME_WAIT的等待時間。注意重啓系統!
更多網絡參數設置參考:Linux網絡參數優化。