1. 程式人生 > >TCP狀態轉換圖的理解

TCP狀態轉換圖的理解

fin 2msl 建立 情況 方便 bsp 斷開連接 主動斷開 一次

怎樣去讀懂TCP的狀態轉換圖?

技術分享

 技術分享

1.概述

我第一次看這個轉換圖的時候,看的有點蒙,雖然知道表示的是TCP連接的狀態轉換圖,但是不知道怎麽去看這個圖,怎麽去理出個頭緒,可能比較笨吧。

閱讀這個圖,首先從整體上需要知道,這個圖表示的是TCP從建立到斷開過程中,客戶端和服務器各自的狀態變遷,頭腦裏先有這個概念,然後為了表述方便,在途中的某些狀態點標註了字符。

2.三次握手建立連接

由起始點A開始TCP建立連接的三次握手。

A->B->D->E 表示的是服務器在TCP連接建立過程中的狀態變遷

A->C->E 表示的是客戶端在TCP連接建立過程中的狀態變遷

正常連接建立的整體流程:

A->B,服務端的應用進程建立套接字,監聽客戶端的連接,此時服務器端由CLOSED轉換為LISTEN狀態,等待客戶端連接

A->C,客戶端的應用進程主動連接服務器,發送第一個SYN握手,此時客戶端狀態變遷為SYN_SENT

B->D,服務器接收到客戶端發送的SYN,然後回復客戶端SYN,ACK應答,此時服務端的狀態變遷為SYN_RCVD

C->E,客戶端接收到服務端的SYN,ACK,客戶端狀態變遷為ESTABLISHED,並發送ACK給服務器

D->E,服務端接收到客戶端的ACK應答,服務端狀態變遷為ESTABLISHED,至此TCP連接的三次握手過程完成,服務器和客戶端建立了連接,客戶端主動連接,服務端被動連接

連接建立過程中的異常情況:

D->B,服務器在接受到客戶端的第一個SYN後,狀態變遷為SYN_RCVD,並給客戶端發送了SYN,ACK應答,正常情況來說,客戶端會接收到服務端的應答,並回復一個ACK應答給服務端,但是如果出現異常情況,比如客戶端的應用進程主動關閉或者客戶端接收服務器的SYN,ACK回包超時,客戶端會給服務端回一個RST,此時客戶端的狀態會從SYN_SENT變遷為CLOSED,服務端在接收到RST後,會從SYN_RCVD變遷為LISTEN

3.四次握手斷開連接

TCP連接斷開需要經歷四次握手,假設客戶端主動斷開連接。

E->F->G, 表示服務端在TCP連接斷開過程中的狀態變遷

E->J->L->H, 表示客戶端在TCP連接斷開過程中的狀態變遷

正常連接斷開:

E->J,客戶端應用進程主動關閉,發送FIN,客戶端狀態變遷為FIN_WAIT_1

E->F->G,服務端收到FIN,狀態變遷為CLOSED_WAIT,並給客戶端發送一個ACK,且服務端的應用進程會接受這個FIN作為一個文件結束符,一段時間後,接受到這個文件結束符的應用進程將調用close關閉套接字,這將導致TCP會給客戶端發送一個FIN,此時服務器狀態變遷為LAST_ACK

J->L->H,客戶端收到ACK之後,狀態變遷為FIN_WAIT_2,在這之後,收到服務端close發送的FIN,狀態變遷為TIME_WAIT,並應答一個ACK給服務端

服務端在收到這個ACK後,服務端就完全關閉,狀態變遷為CLOSED,而客戶端在2MSL超時後,也會完全關閉,狀態變遷為CLOSED

這個TIME_WAIT設計的還是十分巧妙的,後續可以再補充TIME_WAIT和一些異常情況的說明

TCP狀態轉換圖的理解