Http的三次握手與四次揮手的流程:SYN包--同步包 ACK包--應答包 FIN包--終止包

第一次握手(SYN=1, seq=x):

客戶端發送一個 TCP 的 SYN 標誌位置1的包,指明客戶端打算連接的服務器的端口,以及初始序號 X,保存在包頭的序列號(Sequence Number)字段裏。

發送完畢後,客戶端進入 SYN_SEND(同步包發送) 狀態。

 

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

服務器發回確認包(ACK)應答+SYN同步包。即 SYN 標誌位和 ACK 標誌位均爲1。服務器端選擇自己 ISN 序列號,放到 Seq 域裏,同時將確認序號(Acknowledgement Number)設置爲客戶的 ISN 加1,即X+1。
發送完畢後,服務器端進入 SYN_RCVD (同步包收到)狀態。

 

第三次握手(ACK=1,ACKnum=y+1)

客戶端再次發送確認包(ACK),SYN 標誌位爲0,ACK 標誌位爲1,並且把服務器發來 ACK 的序號字段+1,放在確定字段中發送給對方,並且在數據段放寫ISN的+1

發送完畢後,客戶端進入 ESTABLISHED (確定的)狀態,當服務器端接收到這個包時,也進入 ESTABLISHED (確定的)狀態,TCP 握手結束。

 

第一次揮手(FIN=1,seq=x)

假設客戶端想要關閉連接,客戶端發送一個 FIN 標誌位置爲1的包(終止包),表示自己已經沒有數據可以發送了,但是仍然可以接受數據。

發送完畢後,客戶端進入 FIN_WAIT_1 狀態。

 

第二次揮手(ACK=1,ACKnum=x+1)

服務器端確認客戶端的 FIN(終止) 包,發送一個確認包,表明自己接受到了客戶端關閉連接的請求,但還沒有準備好關閉連接。

發送完畢後,服務器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態,等待服務器端關閉連接。

 

第三次揮手(FIN=1,seq=y)

服務器端準備好關閉連接時,向客戶端發送結束連接請求,發送一個FIN終止包,FIN 置爲1。

發送完畢後,服務器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。

 

第四次揮手(ACK=1,ACKnum=y+1)

客戶端接收到來自服務器端的關閉請求,發送一個確認包,並進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK 包。

服務器端接收到這個確認包之後,關閉連接,進入 CLOSED 狀態。

客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime)之後,沒有收到服務器端的 ACK ,認爲服務器端已經正常關閉連接,於是自己也關閉連接,進入 CLOSED 狀態。
兩次後會重傳直到超時。如果多了會有大量半鏈接阻塞隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章