1. 程式人生 > >TCP四次揮手中的TIME_WAIT狀態存在的理由

TCP四次揮手中的TIME_WAIT狀態存在的理由

(1)第一次揮手:Client傳送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀態。

(2)第二次揮手:Server收到FIN後,傳送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。

(3)第三次揮手:Server傳送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀態。

(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著傳送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

注意到,第四次握手時,Client接收到Fin後,並沒有立即進入CLOSED狀態,而是進入TIME_WAIT狀態,這是為什麼呢?

(1)Client不能保證最後的ACK能到達Server,所以還應該觀望一段時間,護送一段時間。如果最後的ACK丟失,那麼Server顯然收不到,於是Server發起了重傳FIN的操作,此時如果Client處於CLOSED狀態,就無法重發ACK了。所以Client要等待一個2MSL的時間,這段時間就是TIME_WAIT。
因而,要實現TCP全雙工連線的正常終止,必須處理終止過程中四個分節任何一個分節的丟失情況,主動關閉連線的Server端必須維持TIME_WAIT狀態 。

2)允許老的重複分節在網路中消逝
TCP分節可能由於路由器異常而“迷途”,在迷途期間,TCP傳送端可能因確認超時而重發這個分節,迷途的分節在路由器修復後也會被送到最終目的地,這個遲到的迷途分節到達時可能會引起問題。在關閉“前一個連線”之後,馬上又重新建立起一個相同的IP和埠之間的“新連線”,“前一個連線”的迷途重複分組在“前一個連線”終止後到達,而被“新連線”收到了。為了避免這個情況,TCP協議不允許處於TIME_WAIT狀態的連線啟動一個新的可用連線,因為TIME_WAIT狀態持續2MSL,就可以保證當成功建立一個新TCP連線的時候,來自舊連線重複分組已經在網路中消逝。