用戶端與伺服器端建立的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報文要麼完全響應完畢,要麼被
丟棄。建立第二個串連的時候,不會混淆。