time_wait是個常問的問題。tcp網絡編程中最不easy理解的也是它的time_wait狀態,這也說明了tcp/ip四次揮手中time_wait狀態的重要性。
如下經過4個問題來描寫敘述它linux
簡單來講:time_wait狀態是四次揮手中server向client發送FIN終止鏈接後進入的狀態。編程
下圖爲tcp四次揮手過程
![]()
可以看到time_wait狀態存在於client收到serverFin並返回ack包時的狀態
當處於time_wait狀態時,咱們沒法建立新的鏈接,因爲port被佔用。markdown
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狀態,新鏈接可能會收到舊鏈接的數據。sockettime_wait持續的時間是2MSL,保證舊的數據可以丟棄。因爲網絡中的數據最大存在MSL(maxinum segment lifetime)tcp
time_wait狀態是通常有client的狀態。server
而且會佔用port
有時產生在server端,因爲server主動斷開鏈接或者發生異常進程
假設是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地址。