TCP連接建立和釋放過程中狀態機的變化

TCP是面向連接的協議,TCP運輸連接的建立和釋放是每一次面向連接的通信中必不可少的過程。
運輸連接有三個階段:連接建立,數據傳送和連接釋放。
TCP連接採用的是客戶服務器方式。主動發起連接建立請求的應用進程叫客戶,而被動等待連接建立的應用進程叫服務器。

TCP的連接建立:三次握手
如下圖所示TCP連接建立的過程。假定A主機運行的是TCP客戶程序,而B主機運行的是TCP服務器程序。最初兩端都處於CLOSED(關閉)狀態。A主動打開連接,B被動打開連接。

B的TCP服務器進程先創建傳輸控制塊TCB,準備接受客戶進程的連接請求。然後服務器進程就處於LISTEN(收聽)狀態,等待客戶的連接請求。如有,則做出響應。

A的TCP客戶進程也是先創建傳輸控制塊TCB,然後向B發送連接請求報文,這是首部中的同步位SYN=1,同時選擇一個廚師序號seq = x。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但要消耗掉一個序號,這時,TCP客戶進程進入SYN_SENT(同步已發送)狀態。

B收到連接請求報文段後,如同意建立連接,則向A發送確認。在確認報文中應把SYN位和ACK位都置1,確認號是ack = x+1,同時也爲自己選擇一個廚師序號seq = y.這個報文段也不能攜帶數據,但同樣要消耗掉一個序號。這時,TCP服務器進程進入SYN_RCVD(同步收到)狀態

TCP客戶進程收到B的確認後,還要向B給出確認。確認報文段的ACK置1,確認號ack = y+1,而自己的序號seq = x+1。TCP的標準規定,ACK的報文段可以攜帶數據。但如果不攜帶數據則不消耗序號,在這種情況下,下一個數據報文段的序號仍是seq = x+1。這時TCP連接已經建立,A進入ESTABLISHED(已建立連接)狀態。

當B收到A的確認後,也進入ESTABLISHED狀態。

A發送確認主要是爲了防止已經失效的連接請求報文段突然又傳送到了B,因而產生錯誤。
這裏寫圖片描述
TCP的連接釋放:四次揮手
數據傳輸結束後,通信的雙方都可以釋放連接。現在A和B都處於ESTABLISHED狀態。

A的應用進程先向其TCP發出連接釋放報文段,並停止發送數據,主動關閉TCP連接。A吧連接釋放報文段首部的終止控制位FIN置1,其序號seq = u,它等於前面已傳送過的數據的最後一個字節的序號加1 。這時A進入FIN_WAIT_1(終止等待1)狀態,等待B的確認。TCP規定,FIN報文段即使不懈怠數據,也要消耗點一個序號。

B收到連接釋放報文後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等於B前面已經傳送過的最後一個字節的序號+1.這時,B進入CLOSE_WAIT(關閉等待)狀態。

TCP服務器進程此時應該通知高層應用進程,一二從A到B這個方向的連接已經關閉,這時的TCP進程屬於半關閉(half_close)狀態,即A已經不會像B發送數據了,但B要向A發送數據,A還得接收。

A收到來自B的確認後,就進入了FIN_WAIT_2(終止等待2),等待B發出的連接釋放報文。如果B沒有數據向A發送,其應用進程就通知TCP釋放鏈接。這時B發出的連接釋放報文段FIN=1.現假定B的序號是w(半關閉狀態B向A發送了數據)。B還必須重複上次已發送過的確認號ack=u+1。這時B就進入了LASK_ACK(最後確認)狀態,等待A的確認。

A在收到B的釋放鏈接報文段後,必須對此發出確認。在確認阿伯文段中吧ACK置1,確認號ack = w+1,而自己的序號是seq = u+1(根據TCP標準,前面發送過的FIN要消耗一個序號)。然後進入到TIME_WAIT(時間等待)狀態。但是,現在TCP連接還沒有釋放,必須經過時間等待計時器(TIME_WAIT timer)設置的時間2MSL後,A才能進入到CLOSED狀態。

這裏寫圖片描述

爲了更清晰的看出TCP連接的各種狀態之間的關係,如下圖給出了TCP的有限狀態機。

這裏寫圖片描述

發佈了79 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章