怎樣去讀懂TCP的狀態轉換圖?服務器
1.概述併發
我第一次看這個轉換圖的時候,看的有點蒙,雖然知道表示的是TCP鏈接的狀態轉換圖,可是不知道怎麼去看這個圖,怎麼去理出個頭緒,可能比較笨吧。spa
閱讀這個圖,首先從總體上須要知道,這個圖表示的是TCP從創建到斷開過程當中,客戶端和服務器各自的狀態變遷,頭腦裏先有這個概念,而後爲了表述方便,在途中的某些狀態點標註了字符。設計
2.三次握手創建鏈接blog
由起始點A開始TCP創建鏈接的三次握手。進程
A->B->D->E 表示的是服務器在TCP鏈接創建過程當中的狀態變遷it
A->C->E 表示的是客戶端在TCP鏈接創建過程當中的狀態變遷io
正常鏈接創建的總體流程:服務器端
A->B,服務端的應用進程創建套接字,監聽客戶端的鏈接,此時服務器端由CLOSED轉換爲LISTEN狀態,等待客戶端鏈接im
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和一些異常狀況的說明