TCP狀態轉換圖的理解
怎樣去讀懂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狀態轉換圖的理解