原文:https://blog.csdn.net/xia744510124/article/details/52263514
客戶端
SYN_SENT->ESTABLISHED
服務端
LISTEN->SYN_RCVD->ESTABLISHED
上面是三次握手的狀態遷移:
第一握手:客戶端發給服務端SYN=1,seqNo=x(代表發送起始字節編號)
第二次握手:服務端接受到SYN=1,seqNo=x知道客戶端發起了連接請求;因此回送ACK=1(告訴客戶端連接請求接收到),ackNo=x+1(希望接收下一個字節的編號),seqNo=y(發送給客戶端起始字節編號)
第三次握手:客戶端接回應,又回送一個ACK=1,ackNo=y+1服務端表示收到它的確認請求
三次握手後客戶端與服務端就可以進行數據傳輸了!
有始必有終,始於三次握手,終於四次揮手,爲什麼是四次揮手呢?因爲TCP/IP是全雙工連接,雙方都能接收數據,也能發送數據,下面看看四次揮手的狀態遷移:
主動關閉方(客戶端或者服務端)
FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT
被動關閉方
CLOSE_WAIT->LAST_ACK->CLOSE
當主動關閉方發送完FIN(停止發送數據,但是還可以接收數據)後便進入FIN_WAIT_1狀態,被動關閉方接收到FIN,回送一個ACK,之後便進入到CLOSE_WAIT;主動關閉方接收到ACK便進入到FIN_WAIT_2(也稱半關閉狀態),之後當被動關閉端發送FIN給主動關閉端便進入LAST_ACK狀態,主動關閉端接收到FIN之後,發送一個ACK便進入到TIME_WAIT狀態(它持續的時間爲2MSL,報文傳輸的最大時長爲1MSL,爲的是當ACK發送出去被動關閉端沒有接收到,能夠再次發送)
附一張轉換圖: