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報文要麼完全響應完畢,要麼被
丟棄。建立第二個連接的時候,不會混淆。
態?
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報文要麼完全響應完畢,要麼被
丟棄。建立第二個連接的時候,不會混淆。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.