TIME_WAIT狀態之所以存在,是為了保證網絡的可靠性
有以下原因:
1.為實現TCP全雙工連接的可靠釋放
當服務器先關閉連接,如果不在一定時間內維護一個這樣的TIME_WAIT狀態,那么當被動關閉的一方的FIN到達時,服務器的TCP傳輸層會用RST包響應對方,這樣被對方認為是有錯誤發生,事實上這只是正常的關閉連接工程,並沒有異常
2.為使過期的數據包在網絡因過期而消失
在這條連接上,客戶端發送了數據給服務器,但是在服務器沒有收到數據的時候服務器就斷開了連接
現在數據到了,服務器無法識別這是新連接還是上一條連接要傳輸的數據,一個處理不當就會導致詭異的情況發生
下面講講大量的TIME_WAIT產生需要的條件:
1.高並發
2.服務器主動關閉連接
如果服務器不主動關閉連接,那么TIME_WAIT就是客戶端的事情了
問題2: 首先先明確TIME_WAIT狀態占用的到底是什么?
被占用的是一個五元組(協議,本地IP,本地端口,遠程IP,遠程端口)
對於Web服務器,協議是TCP,本地ip也只有一個,端口一般是80或者433或8080(固定的),只剩下遠程IP和遠程端口可用了,如果遠程IP相同的話,就只有遠程端口可用了,遠程端口只有幾萬個,所以當同一客戶端向服務器建立了大量連接的話,可用的五元組會耗盡導致問題
現在我們知道了大量的TIME_WAIT會占用大量的五元組
那么五元組什么時候會耗盡呢?
當客戶端通過應用層的負載均衡代理到服務器導致進入服務器的ip地址只有幾個的話,可能會導致五元組耗盡!
產生大量TIME_WAIT狀態的解決辦法:
解決方法1:服務器不主動關閉連接,那么這個問題就是客戶端應該解決的了~(TIME_WAIT將不會產生)解決方法2:增加客戶端IP(一般客戶端IP少都是通過應用層的負載均衡到達服務器的)(五元組將不會耗盡)
解決方法3:設置允許地址重用,這樣每次bind的時候,如果五元組正在使用,bind就會把五元組搶過來(不安全