TCP/IP狀態變遷

 看過《TCP/IP詳解:卷1》的同學都會對下圖印象深刻:
 
 
圖1 TCP狀態變遷圖
        咋一看這圖,讓人頭大。下面會詳細分析圖中的所有狀態,這些狀態跟TCP三次握手與四次揮手有着非常密切的聯繫,關於這個可以參看前面拙文。
        CLOSED:表示初始狀態。對服務端和C客戶端雙方都一樣。
        LISTEN:表示監聽狀態。服務端調用了listen函數,可以開始accept連接了。
        SYN_SENT:表示客戶端已經發送了SYN報文。當客戶端調用connect函數發起連接時,首先發SYN給服務端,然後自己進入SYN_SENT狀態,並等待服務端發送ACK+SYN。
        SYN_RCVD:表示服務端收到客戶端發送SYN報文。服務端收到這個報文後,進入SYN_RCVD狀態,然後發送ACK+SYN給客戶端。
        ESTABLISHED:表示連接已經建立成功了。服務端發送完ACK+SYN後進入該狀態,客戶端收到ACK後也進入該狀態。
        FIN_WAIT_1:表示主動關閉連接。無論哪方調用close函數發送FIN報文都會進入這個這個狀態。
        FIN_WAIT_2:表示被動關閉方同意關閉連接。主動關閉連接方收到被動關閉方返回的ACK後,會進入該狀態。
        TIME_WAIT:表示收到對方的FIN報文併發送了ACK報文,就等2MSL後即可回到CLOSED狀態了。如果FIN_WAIT_1狀態下,收到對方同時帶FIN標誌和ACK標誌的報文時,可以直接進入TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。
        CLOSING:表示雙方同時關閉連接。如果雙方几乎同時調用close函數,那麼會出現雙方同時發送FIN報文的情況,此時就會出現CLOSING狀態,表示雙方都在關閉連接。
        CLOSE_WAIT:表示被動關閉方等待關閉。當收到對方調用close函數發送的FIN報文時,迴應對方ACK報文,此時進入CLOSE_WAIT狀態。
        LAST_ACK:表示被動關閉方發送FIN報文後,等待對方的ACK報文狀態,當收到ACK後進入CLOSED狀態。
 
        特別提示的是:爲什麼TIME_WAIT狀態還需要等待2MSL才能回到CLOSED狀態?或者爲什麼TCP要引入TIME_WAIT狀態?
        《TCP/IP詳解》中如此解釋:當TCP執行一個主動關閉,併發回最後一個ACK後,該連接必須在TIME_WAIT狀態停留的時間爲2倍的MSL,這樣可以讓TCP再次發送最後的ACK以防止這個ACK丟失(另一端超時重發最後的FIN)。
 
        附註:MSL(Maximum Segment Lifetime)即最大生存時間,RFC 793中指出MSL爲2分鐘,但是實現中的常用值爲30秒、1分鐘或者2分鐘。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章