TIME_WAIT 2MSL保持的必要性

Q: 在客戶機/服務器編程中(TCP/SOCK_STREAM),如何理解TCP自動機 TIME_WAIT 狀
    態?
  
A: W. Richard Stevens <1999年逝世,享年49歲>
  
下面我來解釋一下 TIME_WAIT 狀態,這些在<<Unix Network Programming Vol I>>
中2.6節解釋很清楚了。
  
MSL(最大分段生存期)指明TCP報文在Internet上最長生存時間,每個具體的TCP實現
都必須選擇一個確定的MSL值。RFC 1122建議是2分鐘,但BSD傳統實現採用了30秒。
  
TIME_WAIT 狀態最大保持時間是2 * MSL,也就是1-4分鐘。
  
IP頭部有一個TTL,最大值255。儘管TTL的單位不是秒(根本和時間無關),我們仍需
假設,TTL爲255的TCP報文在Internet上生存時間不能超過MSL。
  
TCP報文在傳送過程中可能因爲路由故障被迫緩衝延遲、選擇非最優路徑等等,結果
發送方TCP機制開始超時重傳。前一個TCP報文可以稱爲"漫遊TCP重複報文",後一個
TCP報文可以稱爲"超時重傳TCP重複報文",作爲面向連接的可靠協議,TCP實現必須
正確處理這種重複報文,因爲二者可能最終都到達。
  
一個通常的TCP連接終止可以用圖描述如下:
  
client                     server
            FIN M
close  ----------------->  (被動關閉)
            ACK M+1
        <-----------------
            FIN N
        <-----------------  close
            ACK N+1
        ----------------->
  
爲什麼需要 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報文要麼完全響應完畢,要麼被
丟棄。建立第二個連接的時候,不會混淆。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章