TCP連線過程及報文解析

2022-09-17 02:06:11 字數 4185 閱讀 9546

可能大家都聽過tcp建立連線時需要經歷三次握手和四次揮手的。

那麼具體的握手揮手的過程是怎麼樣的呢?

這篇文章就通過wireshark抓包來了解tcp連線建立和斷開的過程。

實驗方法:

寫一段簡單的** **客戶端和服務端,分別部署,讓客戶端主動像伺服器發起連線,隨後斷開。讓wireshark抓股這個過程中產生了哪些包,並對其分析。

(注:wireshark預設不支援loopback,需要將客戶端和服務端分開部署,或是配置wireshark)。

首先,我們先來看一下連線建立和斷開的過程中,產生了哪幾個包。

從上圖我們可以看到,正好是七個包,符合我們三次握手四次揮手的過程。

分析其過程,wireshark已經為我們解析了每個tcp包的標誌位(之後會詳細解釋,主要用來區分每個包的用途)。

tcp建立連線:

1).客戶端向伺服器發起建立連線請求(syn)

2).服務端收到後,像客戶端回覆乙個建立連線請求的響應(syn,ack)

3).客戶端收到後,繼續向服務端傳送乙個響應(ack)

三次握手完成,正式建立連線。

tcp斷開連線

1).斷開發起方向另一方傳送斷開連線請求(fin,ack)

2).另一方收到後,回覆乙個響應(ack)

3).再由另一方主動傳送乙個斷開連線請求(fin,ack)

4).斷開發起方收到後,回覆乙個響應(ack)

四次揮手完成,斷開socket連線。

了解完過程,再讓我們通過分析第乙個包的內容,初步了解下tcp報文結構:

我們可以看到整個訊息幀是66個位元組:

1).該幀是乙個以太***幀:分為首部和資料兩個部分。

首部前六個位元組(30 9c 23 bc 9d 80)表示目的地mac位址

後六個位元組(30 9c 23 1c 0f 74)表示源mac位址

我們可以看到當資料在鏈路層中傳輸的時候,是由mac位址標識定位的。

之後兩個位元組(08 00)表示上層協議型別(這裡的0x 08 00表示的就是ip協議)

剩餘的52(66 - 6 - 6 - 2)個位元組為資料部分,來承載上層協議(本例中為ip協議)的訊息。

2).從第十三個位元組開始為ip協議的包,

ip協議同樣分為首部和資料兩部分內容。

首部由20位元組固定長度+選項兩部分構成。

先看來固定長度的內容

第乙個位元組拆成兩部分解析,前四位表示版本號,後四位表示首部的長度:0x45,4 表示版本4,也就是我們常說的ipv4,5表示5個單位(最小單位為4位元組),因此是5 * 4 = 20個位元組(正好為固定長的,因此這個包中沒有選項)。

第二個位元組表示服務型別:00

接下來的兩個位元組表示訊息總位元組數:0x 00 34 = 52(位元組) 

接下來的兩個位元組(0x 4e da)表示識別符號(identification),表示唯一的乙個ip訊息包,同一包的ip分片訊息此id相同,用來對ip訊息重組

接下來的兩個位元組(0x 40 00)表示標誌位(flags),前四位中的第一位為預留,後三位為標識位,又來表示是否有分片,是否是最後一片,後13位為片偏移,具體可以了解ip分片

接下來的乙個位元組是ttl(time to live):表示最大生存時間,通常用來表示最大穿越路由層數,沒穿過乙個路由,ttl變回-1,到0時這個ip包就會被丟棄,此處是0x80 = 128

接下來的乙個位元組表示上層協議,此處是0x06,表示上層是tcp協議

接下來的兩個位元組是校驗和(0x00 00)

接下來的四個位元組(0x c0 a8 01 9c)是源ip位址,嘗試解析一下 c0 = 12 * 16 + 0 =192 , 依次解析得到(192.168.1.156)

接下來的四個位元組(0x c0 a8 01 66)是目的ip位址 

到此一共1 +1 + 2 + 2 + 2  + 1 + 1 + 2 + 4 + 4 = 20個位元組。此例中沒有選項,因此剩下的32個位元組的資料,用來表示上層協議(tcp)

3).從f8開始就是我們的tcp協議。

tcp協議也由首部和資料兩部分組成,首部和ip協議類似,由20位元組固定長度和可選部分組成,資料部分主要是包含了上層協議的內容(如http協議等)。

tcp協議的頭兩個位元組(0x f8 eb)表示源埠

後兩個位元組(0x 1a 0a)表示目的埠

接下來的四個位元組表示序列號seq(0x 43 03 7a c8)

接下來的四個位元組表示應答號ack(0x 00 00 00 00)

接下來的兩個位元組(0x 8002)表示首部長度及標誌位:首先, 前四位表示首部長度(8,單位同樣是4位元組,因此表示首部為32位元組);後12位中的前三位為預留,後九位為標誌位。

了解一下後12位,其中reserved表示三位。

reserved

nscwr

eceurg

ackpsh

rstsyn

finns(nonce):有了解的朋友可以補充一下

cwr(congestion window reduce):擁塞視窗減少標誌被傳送主機設定,用來表明它接收到了設定ece標誌的tcp包,傳送端通過降低傳送視窗的大小來降低傳送速率

ece(ecn echo):ecn響應標誌被用來在tcp3次握手時表明乙個tcp端是具備ecn功能的,並且表明接收到的tcp包的ip頭部的ecn被設定為11。更多資訊請參考rfc793。

urg(urgent):該標誌位置位表示緊急(the urgent pointer) 標誌有效。該標誌位目前已經很少使用參考後面流量控制和視窗管理部分的介紹。

ack(acknowledgment):取值1代表acknowledgment number欄位有效,這是乙個確認的tcp包,取值0則不是確認包。

psh(push):該標誌置位時,一般是表示傳送端快取中已經沒有待傳送的資料,接收端不將該資料進行佇列處理,而是盡可能快將資料轉由應用處理。在處理 telnet 或 rlogin 等互動模式的連線時,該標誌總是置位的。

rst(reset):用於復位相應的tcp連線。通常在發生異常或者錯誤的時候會觸發復位tcp連線。

syn(synchronize):同步序列編號(synchronize sequence numbers)有效。該標誌僅在三次握手建立tcp連線時有效。它提示tcp連線的服務端檢查序列編號,該序列編號為tcp連線初始端(一般是客戶端)的初始序列編號。在這裡,可以把tcp序列編號看作是乙個範圍從0到4,294,967,295的32位計數器。通過tcp連線交換的資料中每乙個位元組都經過序列編號。在tcp報頭中的序列編號欄包括了tcp分段中第乙個位元組的序列編號。類似的後續文章介紹中當這個syn標誌位有效的時候我們稱呼這個包為syn包。

fin(finish):帶有該標誌置位的資料報用來結束乙個tcp會話,但對應埠仍處於開放狀態,準備接收後續資料。當fin標誌有效的時候我們稱呼這個包為fin包。

回到tcp報文中來:

接下來的兩個位元組(0x 20 00)表示視窗大小(window size),表示tcp還可以接受的空間大小。

接下來的兩個位元組(0x 84 79)表示校驗和(checksum),用來校驗資料

接下來的兩個位元組(0x 00 00)表示優先順序指標(urgent pointer),只有當標誌位中的urg設為1時才有效,

到此,tcp首部的固定長的20個位元組已經解析完畢。

我們看到首部還剩餘12個位元組,這個tcp首部中的選項,選項是可選的,以四位元組為單位擴充套件,用來記錄時間戳等內容。

本包抓取的是tcp第一次握手的內容,因此tcp報文中沒有資料。

另外,上述解析的過程可以在wireshark中很清楚的看到,建議大家自己也抓取乙個包,加深理解。

TCP連線過程

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1.2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP連線解釋及連線過程描述

1.tcp連線的建立 設主機b執行乙個伺服器程序,它先發出乙個被動開啟命令,告訴它的tcp要準備接收客戶程序的連續請求,然後服務程序就處於聽的狀態。不斷檢測是否有客戶程序發起連續請求,如有,作出響應。設客戶程序執行在主機a中,他先向自己的tcp發出主動開啟的命令,表明要向某個ip位址的某個埠建立運輸...

TCP連線過程及狀態變化

狀態狀態描述 closed 表示初始狀態。對服務端和客戶端雙方都一樣。listen 表示監聽狀態。服務端呼叫了listen函式,可以開始accept連線了。syn sent 表示客戶端已經傳送了syn報文。當客戶端呼叫connect函式發起連線時,首先發syn給服務端,然後自己進入syn sent狀...