1. 程式人生 > >007_wireshark分析TCP的三次握手和四次斷開

007_wireshark分析TCP的三次握手和四次斷開

完整 成功 image 服務器和客戶端 沒有 tps 但是 get tcp連接

要想進行抓包分析,必須先了解TCP的原理。這裏介紹了TCP的建立連接的三次握手和斷開連接的四次握手。

一、前言:介紹三次握手之前,先介紹TCP層的幾個FLAGS字段,這個字段有如下的幾種標示

SYN表示建立連接,
FIN表示關閉連接,
ACK表示響應,
PSH表示有 DATA數據傳輸,
RST表示連接重置。

二、三次握手的步驟

(1)第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;

(2)第二次握手:主機B收到請求後要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包;

(3)第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連接建立成功。
 完成三次握手,主機A與主機B開始傳送數據。
從抓包分析中可以很清晰的看到TCP三次握手,下圖就是完整的三次握手,客戶端41826端口和服務器的80端口建立了連接

 技術分享圖片

三、tcp斷開連接的四次握手

(1)tcp斷開連接有兩種方式,第一種是正常的四次握手斷開的,第二種是RST異常斷開的.

技術分享圖片

假設Client端發起中斷連接請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有數據要發給你了",但是如果你還有數據沒有發送完成,則不必急著關閉Socket,可以繼續發送數據。
所以你先發送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定數據已發送完成,
則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉連接了"。Client端收到FIN報文後,"就知道可以關閉連接了,但是他還是不相信網絡,怕Server端不知道要關閉,
所以發送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK後,"就知道可以斷開連接了"。Client端等待了2MSL後依然沒有收到回復,
則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。Ok,TCP連接就這樣關閉了!

(2)用抓包來看斷開連接的四次握手

下圖中的四個箭頭就是標準的四次握手了。

1.首先服務器80端口想41826端口發出FIN的斷開連接請求
2.然後第二個箭頭41826收到請求之後想服務器80端口回復了一個ACK
3.接著第三個箭頭41826向服務器80端口發送斷開請求FIN
4.最後第四個箭頭,服務器80向客戶端發送斷開的回復ACK
這樣四次握手之後,服務器和客戶端都確認了斷開連接,可以看到斷開連接是雙向的。

技術分享圖片

(3)RST異常關閉連接

有時候也會出現異常斷開連接的情況,也就是RST,比如說下圖,服務器80向客戶端32875發送斷開請求FIN,客戶端也通過這條鏈路回復了ACK,但是此時還有數據需要發送,所以沒有急著回復FIN,
而是先將get請求發送出去,發送了get請求之後再發送的斷開請求FIN,但是此時服務器不知道什麽原因在沒有確認客戶端的確認前就斷開了,所以在接到get請求之後,返回了一個RST,異常斷開了這條鏈路。

技術分享圖片

Reference:

https://osqa-ask.wireshark.org/questions/20423/pshack-wireshark-capture

TCP三次握手wireshark抓包分析{https://blog.csdn.net/u014530704/article/details/78842000}

  

  

  

007_wireshark分析TCP的三次握手和四次斷開