TCP/IP 與 UDP 報文協議抓包淺析


2020-04-15

關鍵字:以太網協議、網絡抓包分析


 

這篇文章結合實際網絡通信過程來簡單了解一下 以太網協議、TCP報文格式、IP報文格式與UDP報文格式。

 

在這之前,我們必須要知道:所有的數據,不管什么網絡數據、網絡包、視頻、音頻、圖片等等,在網線中都是一組“有序的串行數據”。這一長串數據中就包含了各種協議與各種數據。

 

1、TCP/IP報文格式

 

我們首先來看一下在實際通信應用中的 TCP/IP 報文格式。

 

這里筆者通過 tcpdump 工具來抓取,並通過 wireshark 來分析兩個設備通過 Socket 發送 "Hello world" 文本的交互過程來分析。

 

1.1、分析環境

這里先貼上筆者的這個原始網絡包,有興趣的可以下載查看:

鏈接:https://pan.baidu.com/s/1QHXq88yiqTWISRMd-8-Q2g
提取碼:nd5u

在 wireshark 中按IP過濾即可: ip.addr == 192.168.77.104 

 

先介紹一下兩個設備的基本信息:

服務端設備:

IP:  192.168.77.104

MAC: A8:BD:3A:37:54:AB

客戶端設備:

IP: 192.168.77.103

MAC: A8:BD:3A:37:54:FF

 

TCP在通信前是要先經“三次握手”建立連接的,如下圖所示:

 

同時,一方在接收到另一方的消息以后,也要作出“回復”以告知發送方“我已接收到”。

 

如此一來,我們通過Socket進行的"Hello world"文本通信過程,就至少需要 5 個通信過程,即 5 個網絡包。當然,如果要算上斷開連接時的“四次揮手”的話,又還得再加多 4 個網絡包,總計達到 9 個網絡包。但在這里,我們不考慮斷開連接的情況,因此只有 5 個網絡包需要我們考慮。

 

在 wireshark 中可以過濾出這一過程的 5 個網絡包,如下圖所示:

 

1.2、以太網頭

第 1 個網絡包的內容如下:

這里我們只看中間的“串行數據”部分。兩側的內容是 wireshark 自己添加用以輔助觀看使用的。

 

首先,前 14 個字節是屬於以太網頭。它的組成結構如下:

目的端MAC地址(6個字節) + 源端MAC地址(6個字節) + IP協議版本號(2個字節)

 

我們可以很輕松地發現,前6個字節確實是服務端設備的MAC地址 A8:BD:3A:37:54:AB,中間6個字節是客戶端的MAC地址 A8:BD:3A:37:54:FF。而最后兩個字節 0x0800 就表示該網絡包使用的是 IPV4 通信協議。

 

以太網頭的結構就是這么簡單。

 

1.3、IP報文格式

接下來就是 IP 協議了。

 

在看IP報文格式之前,有必要參照着標准的格式組成結構圖來看,如下圖所示:

IP報文格式

默認情況下,IP報文的長度就是 20 個字節,如上圖所示。就拿我們上面抓到的網絡包來看,它的 IP 報文部分如下圖所示:

 

 

將實際通信網絡包結合着上面的IP報文格式組成圖示來看,IP報文第 1 個字節里就包含了兩部分的內容:協議版本 與 IP報文長度,這兩部分各占 4 位。

 

版本+首部長度:

在我們這個網絡包中第1個字節是 0x45。高 4 位的值是十進制下的數字 4 ,表示當前 IP 協議的版本號是 4,就是 IPV4。如果是 IPV6 高4位的值就是數字6。

低 4 位的值是十進制的數字 5。這個值稍微特殊一點,它並不是說這個 IP 報文只有 5 個字節長度,而是要將這個值乘以 4bytes,即 5 * 4bytes = 20bytes。 這個網絡包中IP報文數據占20個字節長度。不包含可選字段與填充字段。

 

區分服務:

在我們這個網絡包中,它的值是 0x00。一般不用理會這個值。

 

總長度:

占 2 個字節,值為 0x003c,即十進制的 60。表示這整個網絡包中 IP報文+數據報文 的總長度,即這個網絡包中除去前面 14 個字節以太網頭后的總長度。可以認為這個值就是描述整個網絡包的總長度的了。

 

標識:

占兩個字節。0x500a。可以認為是這個網絡包的身份證號。這個數通常是順序遞增的,每發送一個網絡包值就加1。但當同一個網絡包的數據過長(超過 MTU 大小)時,這個網絡包會被“拆分”成短包逐個發送(即分片)。每一個分片中的標識都是相同的,這樣才可保證接收端可以將零散的網絡包重組為一個完整的網絡包。

 

標志+片偏移:

共占 2 個字節,標志占高3位,片偏移占低13位。

標志:

3位從高到低依次為:

1、保留位

2、禁止分片位

為0表示該網絡包有分片。為1表示不分片。(取決於該網絡包的數據大小是否超過 MTU)

3、更多分片位

為0表示該分片是最后一片。為1表示這個網絡包只是其中一片,后面還有更多的分片。

在本篇文章示例的網絡包中,標志段的值為 0x4 --> 010。 表示這個網絡包不分片。

片偏移:

13位的值,值范圍為 0 ~ 8191。表示這個分片在原數據報文中相對於首位的偏移位數。這個值要再乘以8才是真正的偏移位置。說白了就是在網絡包數據太長要拆分發送時用於給接收端散包重組用的參考系。

 

生存時間:

即 TTL,占 1 個字節。在本例中值為 0x40,即十進制的60。它表示這個IP報文所允許通過的最大路由跳數。IP報文每經過一個路由器,這個值就減1,當值減到0時仍未到達目的端,就丟棄這個網絡包。其實這個 TTL 還真的蠻重要的。如果沒有它,我們的互聯網可能就完全被垃圾信息堵死了。

 

協議:

占 1 個字節。表示該IP報文攜帶的數據所使用的協議類型。常見的可選值有如下幾種:

1、0x06 -- TCP

2、0x11 -- UDP

3、0x01 -- ICMP

4、0x02 -- IGMP

 

首部檢驗和:

 2個字節的IP報文校驗碼。

 

源地址+目標地址:

各占 4 個字節。c0a84d67  --> 192.168.77.103;  c0a84d68  -->  192.168.77.104

 

到這里已經分析了有 20 個字節了,由於我們這個 IP報文 沒有可選字段與填充字段,因此整個IP報文協議到這也就結束了。再接下來的就是數據字段部分了。

 

1.4、TCP報文格式

這里我們的數據部分使用的是 TCP 協議通信的。因此接下來分析的就是 TCP報文格式。

 

TCP報文協議的標准格式如下圖所示:

 

在本例分析所使用到的網絡包中,TCP部分的內容如下圖所示:

 

源端口+目的端口:

首當其沖的四個字節就是IP地址的源端口和目的端口。0xe785 是客戶端設備的IP通信端口。0x4315是服務端設備的IP通信端口。

 

序列號+確認號:

各占 4 個字節。序列號在本例中為 0xaca2b4fd。序列號與確認號可謂是TCP會話中的時間流。一般情況下這兩個號都是順序遞增的。序列號是表示自己這個網絡包所對應的序號,簡單理解成我是在某一個時刻說出的這句話。而確認號則表示我我期望接收端在回復我這個網絡包時所使用的序列號。即,接收方在回復我們的這個網絡包時所使用的序列號號應該要是我們這個網絡包的確認號。

一般而言,確認號是依據上一個來自接收方的序列號遞增的一個數值。在本例中確認號是0,這是因為這個網絡包是發起TCP會話時的第一個包,沒有前一個包的序列號可參考,因此就只能填上0。

這里貼上本例中5個網絡包所使用到的序列號與確認號示意圖以便加深理解,同學們仔細體會幾個連續的網絡包中這兩個號的差別:

 

頭部長度:

又稱為“數據偏移”。占4位。它表示TCP報文頭部數據所占的字節長度。這個值在本例中是 0xa --> 即十進制的10。 它要在這個數的基礎上再乘以4bytes,所以TCP頭部長度為10 * 4bytes=40bytes。說白了就是TCP報文除數據以外的長度。

 

12位標志位:

緊跟着上一段“頭部長度”后面的12位是一系列的標志位。其中,高6位是保留位,低6位用於設置一些東西。這些位設置的含義筆者不想細糾,直接貼上 wireshark 的輔助與某網友文章中的解釋供大家參考。

 

 

 

窗口大小:

占2個字節。與TCP的流量控制有關。可用於指示接收緩沖區的創建大小。

 

TCP校驗和:

占2個字節。

 

緊急指針:

占2個字節。用於指示在本報文中緊急數據的字節長度。緊急數據會在數據段的首部。

 

額外選項:

略。

 

TCP報文除額外選項外的數據固定有 20 個字節,與IP報文頭部的長度一致。

 

以下是一個攜帶了數據的完整TCP/IP網絡包拆解與注釋:

    000c296b8577000c296b8577 【雙方MAC地址】
    0800 【IPV4標志】
    45 【版本和IP報文的首部長度,這里是5*4=20個字節】
    00 【區分服務】
    003a 【總長度】
    fe10 【標識】
    4000 【標志與片偏移】
    40 【TTL】
    06 【協議,06表示TCP】
    dd58 【校驗碼】
    c0a86f01c0a86f02 【雙方IP地址】
    【從這里開始就是TCP的報文協議格式了】
    aa384316 【源端口和目標端口】
    56f4b30f 【序列號】
    e4c60050 【確認號】
    8018 【頭部長度與標志位】
    00e5 【窗口】
    0807 【校驗和】
    0000 【緊急指針】
    0101080a00145223ffff9bf1 【Options,12個字節。】
    68656c6c6f0a 【數據】

 

 

2、UDP報文格式

 

通過前面 TCP/IP 的網絡包分析,我們已經知道整個網絡包的構成按順序排列無非就三個部分:

1、以太網信息

2、IP報文信息

3、TCP或UDP或ICMP或IGMP報文信息

 

UDP報文格式相較於TCP而言就簡單的多了。

 

UDP報文協議標准格式如下圖所示:

源端口+目的端口:

略。

 

長度:

占2個字節。UDP報文頭部+數據的總長度。

 

校驗值:

略。

 

數據:

略。

 

由於UDP通信不像TCP要握手連接揮手告別,它直接簡單粗暴地將數據往網絡中廣播就行了,因此,分析它的格式也不必像前面分析TCP那樣繁瑣。而且UDP通信網絡包前面的以太網信息和IP報文信息都已經在前面介紹過了。因此就直接在以下貼出一個完整的UDP發送數據的網絡包並給出相應注釋供大家參考學習就是了:

完整的UDP通信網絡包:
000c296b8577000c296b8577080045000022cf40400040110c36c0a86f01c0a86f028ebf4316000e8acb68656c6c6f0a

釋義:
000c296b8577000c296b8577 【雙方的MAC地址】
0800 【IP版本號,此處是IPV4】 【以下開始是IP報文】 45 【版本號+首部長度。IPV4 + 20bytes】 00 【區分服務】 0022 【除14字節以太網頭以外的總長度,34個字節】 cf40 【標識,即會話序號】 4000 【標志+片偏移。不分片。】 40 【TTL】 11 【IP報文攜帶數據的協議,此處是UDP】 0c36 【IP報文頭部校驗和】 c0a86f01c0a86f02 【雙方IP地址】 【以下開始是UDP報文】 8ebf4316 【雙方的端口號。源端口+目的端口】 000e 【長度,UDP報文的總長度,UDP頭+數據共14個字節】 8acb 【校驗碼】 68656c6c6f0a 【數據】

 


參考資料:

https://blog.csdn.net/bobozai86/article/details/87518617

https://blog.csdn.net/a7980718/article/details/82316880

https://blog.csdn.net/a4230787/article/details/80301048


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM