在了解了TCP連接配接建立于斷開的過程後,再來看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
個封包段,比正常的三次握手多一個。要注意的是在這樣的連接配接過程中,沒有将任何一端稱為客戶或伺服器,因為每一端既是客戶又是伺服器。
兩台主機同時發起主動關閉操作的握手包互動如下,當兩個主機的使用者程式同時執行關閉操作時,兩主機都向對方發送一個
FIN
包,并進入
FIN_WAIT_1
狀态等待對方的
ACK
傳回,但一段時間後,雙方各自都收到對方的
FIN
包,而不是
ACK
包,此時兩主機都判定遇到了雙方同時主動關閉的狀況,此時,兩個主機就沒有必要進入
FIN_WAIT_2
狀态等待對方的
FIN
包了,因為這個包剛剛已經收到,而是直接進入
CLOSING
狀态,并向對方發送一個
FIN
包的确認,等到雙方都收到對方的
ACK
包後,兩邊都各自進入
TIME_WAIT
狀态。
再來詳細講解下**
TIME_WAIT
狀态**,協定中是這樣描述的:當 TCP執行一個主動關閉,并發出最後一個
ACK
後,該連接配接必須在
TIME_WAIT
狀态停留的時間為
2
倍的
MSL
。這樣可讓TCP保證在最後的這個
ACK
丢失的情況下重新發送
ACK
(另一端逾時并重發最後的
FIN
)。處于
TIME_WAIT
等待狀态的TCP端口此刻還不能被其他新連接配接所使用。
雖然上面的狀态轉換圖上指出,從一個連接配接從
LISTEN
狀态轉換到
SYN_SENT
狀态是允許的,但是大多數的協定實作中均沒有實作該轉換,即執行被動打開的連接配接一般不要主動發起連接配接。
平靜時間:如果主機在TCP狀态轉換過程中突然崩潰,在TCP重新開機後的一個
MSL
内,TCP不能發送任何資料封包段,這段時間稱為平靜時間。設定平靜時間是為了防止舊連接配接的延遲的資料報分組對新連接配接造成影響。