關於tcp中time_wait狀態的4個問題

time_wait是個常問的問題。tcp網絡編程中最不easy理解的也是它的time_wait狀態,這也說明了tcp/ip四次揮手中time_wait狀態的重要性。
如下經過4個問題來描寫敘述它linux


問題

1.time_wait狀態是什麼

2.爲何會有time_wait狀態

3.哪一方會有time_wait狀態

4.怎樣避免time_wait狀態佔用資源


1.time_wait狀態是什麼

簡單來講:time_wait狀態是四次揮手中server向client發送FIN終止鏈接後進入的狀態。編程

下圖爲tcp四次揮手過程
這裏寫圖片描寫敘述
可以看到time_wait狀態存在於client收到serverFin並返回ack包時的狀態
當處於time_wait狀態時,咱們沒法建立新的鏈接,因爲port被佔用。markdown


2.爲何會有time_wait狀態

time_wait存在的緣由有兩點
1.可靠的終止TCP鏈接。
2.保證讓遲來的TCP報文段有足夠的時間被識別並丟棄。網絡

1.可靠的終止TCP鏈接,若處於time_wait的client發送給server確認報文段丟失的話,server將在此又一次發送FIN報文段,那麼client必須處於一個可接收的狀態就是time_wait而不是close狀態。
2.保證遲來的TCP報文段有足夠的時間被識別並丟棄,linux 中一個TCPport不能打開兩次或兩次以上。當client處於time_wait狀態時咱們將沒法使用此port創建新鏈接,假設不存在time_wait狀態,新鏈接可能會收到舊鏈接的數據。socket

time_wait持續的時間是2MSL,保證舊的數據可以丟棄。因爲網絡中的數據最大存在MSL(maxinum segment lifetime)tcp


3.哪一方會有time_wait狀態

time_wait狀態是通常有client的狀態。server

而且會佔用port
有時產生在server端,因爲server主動斷開鏈接或者發生異常進程


4.怎樣避免time_wait狀態佔用資源

假設是client,咱們通常不用操心,因爲client通常選用暫時port。再次建立鏈接會新分配一個port。圖片

除非指定client使用某port,只是通常不需要這麼作。ip

假設是server主動關閉鏈接後異常終止。則因爲它老是使用用一個知名serverport號,因此鏈接的time_wait狀態將致使它不能從新啓動。只是咱們可以經過socket的選項SO_REUSEADDR來強制進程立刻使用處於time_wait狀態的鏈接佔用的port。
經過socksetopt設置後,即便sock處於time_wait狀態,與之綁定的socket地址也可以立刻被重用。

此外也可以經過改動內核參數/proc/sys/net/ipv4/tcp_tw/recycle來高速回收被關閉的socket,從而是tcp鏈接根本不進入time_wait狀態,進而贊成應用程序立刻重用本地的socket地址。

相關文章
相關標籤/搜索