天天看點

lwip ---(十四)TCP狀态轉換

  在了解了TCP連接配接建立于斷開的過程後,再來看TCP的狀态轉換圖就相對容易了。

    

lwip ---(十四)TCP狀态轉換

  圖中有兩個典型的狀态轉換路徑,第一個是用戶端申請建立連接配接與斷開連接配接的過程,如圖中黑色粗線所示:與前面描述的一緻,在用戶端通過發送一個

SYN

包,主動向伺服器申請一個連接配接,資料包發出後用戶端進入

SYN_SENT

狀态等待伺服器的

ACK

SYN

包傳回,當收到這個傳回包後,用戶端對伺服器的

SYN

進行确認,然後自身進入

ESTABLISHED

狀态,與前面描述的三次握手過程完全一緻。

  當用戶端申請斷開連接配接時,它要發送

FIN

包給伺服器申請斷開連接配接,當

FIN

包發送後,用戶端進入

FIN_WAIT_1

狀态等待伺服器傳回确認包,當收到這個确認包後,表明用戶端到伺服器方向的連接配接斷開成功,此時用戶端進入

FIN_WAIT_2

狀态等待伺服器到用戶端方向的連接配接斷開,此時當用戶端收到伺服器的

FIN

包時,即向伺服器傳回一個

ACK

包,表明伺服器到用戶端方向的連接配接斷開成功,此後用戶端進入

TIME_WAIT

狀态,在該狀态下等待

2 MSL

後,用戶端進入初始的

CLOSED

狀态。在連接配接處于

2 MSL

等待時,任何遲到的資料封包段将被丢棄。此過程與斷開連接配接的四次握手過程完全相符。

  另一個典型的狀态轉換路徑是描述伺服器的,如圖中虛線所示。伺服器建立連接配接一般屬于被動過程,它首先打開某個端口,進入

LISTEN

狀态以偵聽用戶端的連接配接請求。當伺服器收到用戶端的

SYN

連接配接請求,則進入

SYN_REV

狀态,并向用戶端傳回一個

ACK

及自身的

SYN

包,此後,伺服器等待用戶端傳回一個确認包,收到該

ACK

包後,伺服器進入

ESTABLISHED

狀态,并可以和伺服器進行穩定的資料交換過程。可見,連接配接建立的過程和前面描述的三次握手過程完全一緻。

  當伺服器收到用戶端發送的一個斷開資料包

FIN

時,則進入

CLOSE_WAIT

狀态,并向上層應用程式通告這個消息,同時向用戶端傳回一個

ACK

包,此時用戶端到伺服器方向的連接配接斷開成功;此後,當伺服器上層應用處理完畢相關資訊後會向用戶端發送一個

FIN

包,并進入

LASK_ACK

狀态,等待用戶端傳回一個

ACK

包,當收到傳回的

ACK

包後,此時伺服器到用戶端方向的連接配接斷開成功,伺服器端至此進入初始的

CLOSED

狀态。此過程與斷開連接配接的四次握手過程完全相符。

  上面這個轉換圖中還有兩處較特殊的轉換路線,它們分别用于處理TCP兩端同時發起或斷開連接配接的情況。

  兩台主機同時執行打開操作的握手包互動如下圖所示,兩台主機在同時發送自身的

SYN

請求包後各自進入

SYN_SENT

狀态,等待對方的

ACK

包傳回,但一定時間後,每個主機都收到對方的

SYN

包而不是

ACK

包,此時兩端都判定已經遇到了同時打開的狀況發生,兩端都進入

SYN_RCVD

狀态,并對對方的

SYN

進行确認并再次發送自己的

SYN

包,當接收到對方的

ACK+SYN

後,兩邊都進入

ESTABLISHED

狀态。從這一點看,狀态轉換圖中的從

SYN_RCVD

ESTABLISHED

轉換的條件應該有兩個,而圖中隻标出了一個。一個同時打開的連接配接需要交換

4

個封包段,比正常的三次握手多一個。要注意的是在這樣的連接配接過程中,沒有将任何一端稱為客戶或伺服器,因為每一端既是客戶又是伺服器。

lwip ---(十四)TCP狀态轉換

  兩台主機同時發起主動關閉操作的握手包互動如下,當兩個主機的使用者程式同時執行關閉操作時,兩主機都向對方發送一個

FIN

包,并進入

FIN_WAIT_1

狀态等待對方的

ACK

傳回,但一段時間後,雙方各自都收到對方的

FIN

包,而不是

ACK

包,此時兩主機都判定遇到了雙方同時主動關閉的狀況,此時,兩個主機就沒有必要進入

FIN_WAIT_2

狀态等待對方的

FIN

包了,因為這個包剛剛已經收到,而是直接進入

CLOSING

狀态,并向對方發送一個

FIN

包的确認,等到雙方都收到對方的

ACK

包後,兩邊都各自進入

TIME_WAIT

狀态。

lwip ---(十四)TCP狀态轉換

  再來詳細講解下**

TIME_WAIT

狀态**,協定中是這樣描述的:當 TCP執行一個主動關閉,并發出最後一個

ACK

後,該連接配接必須在

TIME_WAIT

狀态停留的時間為

2

倍的

MSL

。這樣可讓TCP保證在最後的這個

ACK

丢失的情況下重新發送

ACK

(另一端逾時并重發最後的

FIN

)。處于

TIME_WAIT

等待狀态的TCP端口此刻還不能被其他新連接配接所使用。

  雖然上面的狀态轉換圖上指出,從一個連接配接從

LISTEN

狀态轉換到

SYN_SENT

狀态是允許的,但是大多數的協定實作中均沒有實作該轉換,即執行被動打開的連接配接一般不要主動發起連接配接。

  平靜時間:如果主機在TCP狀态轉換過程中突然崩潰,在TCP重新開機後的一個

MSL

内,TCP不能發送任何資料封包段,這段時間稱為平靜時間。設定平靜時間是為了防止舊連接配接的延遲的資料報分組對新連接配接造成影響。

繼續閱讀