TIME_WAIT過多及解決


     最近用http_load做壓測,跑出來一大串“Cannot assign requested address ”的錯誤,查了一下,是TIME_WAIT過多導致的。因為短時間內有太多連接,所以占用了大量端口,同時關閉連接后又處於TIME_WAIT狀態,端口不能復用,所以慢慢的無端口可用,所以就“Cannot assign requested address”了。
     可以對內核參數進行優化:
     sysctl -w net.ipv4.tcp_timestamps=1 開啟對於TCP時間戳的支持,若該項設置為0,則下面一項設置不起作用
     sysctl -w net.ipv4.tcp_tw_recycle=1 表示開啟TCP連接中TIME-WAIT sockets的快速回收    
     echo 5000> /proc/sys/net/ipv4/tcp_max_tw_buckets
 
     問題解決了,不過還是要來探討一下,為什么會有TIME_WAIT,以及上面的修改是什么意思。
 
     TIME_WAIT是TCP關閉連接中,主動關閉的一方,在接收到對方的FIN包,並給出ACK應答后,會進入的一個狀態。下面的圖來自《UNP》

 

     為什么一定要有TIME_WAIT的狀態?能否直接進入CLOSEED?不能,TCP是建立在不可靠網絡上的可靠協議,主動方發送的ACK包可能延遲,從而觸發被動方的FIN包重傳,這一來一去,就是2MSL的時間。因此,必須要有這個狀態,以保證TCP的可靠性。否則,如果當重傳的FIN包到達后,可能導致兩個問題:
     1. 舊連接已經不在,只能返回RST包,被動關閉的一方無法關閉TCP連接
     2. 新連接已經建立,FIN包可能對新連接有干擾。
     所以,TIME_WAIT不能沒有,但不能太多,該考慮限制它的數量。
 
     tcp_tw_recycle:顧名思義就是回收TIME_WAIT連接,注意的是timestamp必須打開,網上有人說不用,其實是因為timestamp一般是默認打開的,這里有個陷阱,參考 http://www.pagefault.info/?p=416
     tcp_max_tw_buckets:很顯然,用於控制TIME_WAIT數量的。
 
     TCP/IP協議還有許多要了解的地方。
     
     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM