【zz】關於TIME_WAIT

來源:互聯網
上載者:User
用戶端與伺服器端建立的TCP/IP串連資料傳送完畢後,關閉SOCKET之後,伺服器端串連的連接埠
狀態為TIME_WAIT。

         是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
       有沒有什麼情況使主動關閉的socket直接進入CLOSED狀態呢?
         主動關閉的一方在發送最後一個 ack 後,就會進入 TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間
這個是TCP/IP必不可少的,也就是“解決”不了的。

       也就是TCP/IP設計者本來是這麼設計的
       主要有兩個原因
1。防止上一次串連中的包,迷路後重新出現(重新發送的包),影響新串連
  (經過2MSL,上一次串連中所有的重複包都會消失)
2。可靠的關閉TCP串連
  主動關閉方發送的最後一個 ack(fin) ,有可能丟失,這時被動方會重新發
  fin, 如果這時主動方處於 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以
  主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。

        TIME_WAIT 並不會佔用很大資源的,除非受到攻擊。

        還有,如果一方 send 或 recv 逾時,就會直接進入 CLOSED 狀態 。

       MSL(最大分段生存期)指明TCP報文在Internet上最長存留時間,每個具體的TCP實現
都必須選擇一個確定的MSL值。RFC 1122建議是2分鐘,但BSD傳統實現採用了30秒。

       TIME_WAIT 狀態最大保持時間是2 * MSL,也就是1-4分鐘。

為什麼需要 TIME_WAIT 狀態?

假設最終的ACK丟失,server將重發FIN,client必須維護TCP狀態資訊以便可以重發
最終的ACK,否則會發送RST,結果server認為發生錯誤。TCP實現必須可靠地終止連
接的兩個方向(全雙工系統關閉),client必須進入 TIME_WAIT 狀態,因為client可能面
臨重發最終ACK的情形。

{
scz 2001-08-31 13:28

先調用close()的一方會進入TIME_WAIT狀態
}

此外,考慮一種情況,TCP實現可能面臨先後兩個同樣的相關五元組。如果前一個連
接處在 TIME_WAIT 狀態,而允許另一個擁有相同相關五元組的串連出現,可能處理
TCP報文時,兩個串連互相干擾。使用 SO_REUSEADDR 選項就需要考慮這種情況。

為什麼 TIME_WAIT 狀態需要保持 2MSL 這麼長的時間?

如果 TIME_WAIT 狀態保持時間不足夠長(比如小於2MSL),第一個串連就正常終止了。
第二個擁有相同相關五元組的串連出現,而第一個串連的重複報文到達,幹擾了第二
個串連。TCP實現必須防止某個串連的重複報文在串連終止後出現,所以讓TIME_WAIT
狀態保持時間足夠長(2MSL),串連相應方向上的TCP報文要麼完全響應完畢,要麼被
丟棄。建立第二個串連的時候,不會混淆。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.