协议簇:IPv4 解析
簡介
IP 是一種無連接的協議. 操作在使用分組交換的鏈路層(如以太網)上。此協議會盡最大努力交付數據包。
盡最大努力意味著:
IP 協議不保證數據的可靠傳輸, 沒有流量控制機制, 不保證傳輸序列(意味著 IP 數據包會在傳輸過程中亂序), 沒有接受確認 (ACK) 機制, 也沒有重傳機制.
主要功能
IP 協議提供了兩個基本的功能 尋址(Address) 和 分片(Fragmentation).
這里我們先簡單看一下概念,后面會詳細分析具體是如何實現的.
尋址(Address)
IP 協議定義了 32 bit 的 IP 地址. IP 協議的實現模塊會根據 IP 數據包頭部中的目的地址發送/轉發數據包到目的地址.
IP 協議還提供了以下機制來配置 IP 協議提供的服務:
分片(Fragmentation)
由于不同的物理鏈路對于數據的最大長度有著不同的限制,因此 IP 數據在傳輸過程中可能會被拆分為多個較小的數據包進行傳輸.
發送方可以將數據包設置為 ”don‘t fragment", 這種數據包會被丟棄當數據包的大小大于當前物理鏈路的最大數據包限制.
IPv4 Header 格式
接下來,我們逐一介紹一下每個字段的含義:
- bits 0-2: 表明數據包的優先級
- bit 3: 0 代表 Normal-Delay, 1 代表 Low-Delay
- bit 4: 0 代表 Normal-Throughput,1 代表 High-Throughput
- bit 5: 0 代表 Normal-Reliable, 1 代表 High-Reliable
- bits 6-7: 保留
這個字段很少使用,這里僅供參考.
- bit 0: 保留
- bit 1: (DF) 0 代表 May Fragment, 1 代表 Don’t Fragment
- bit 2: (MF) 0 代表 Last Fragment, 1 代表 More Fragments
Options
該字段在 IP 頭部屬于可選字段,可以出現也可以不出現.
Optinos 字段中可以包含 0 到多個 Option,對于每個 Option 它的合法格式有以下兩種:
一個字節的 Option-Length 表明 后續 Option-Data 的長度. 單位也為字節.
Option-Type:
該類型長度為 8 bit. 每個 bit 的含義如下:
- bit 0: copied field,
- bit 1-2: option class
- bit 3-7: option number
Copied field:
表明當需要對原始數據包進行分片時,該 Option 是否需要拷貝到每個分片中去.
- 0 代表 not copied
- 1 代表 copied
Option class:
- 0: 代表 Control
- 1: 保留
- 2: 代表 Debugging and measurement
- 3: 保留
當前可用的 Option
| 0 | 0 | - | End of Option list. 占用一個字節.沒有長度 |
| 0 | 1 | - | No operation. 占用一個字節.沒有長度 |
| 0 | 2 | 11 | Security. |
| 0 | 3 | var. | Loose Source Routing. 使用源發送者所提供的信息路由當前數據包 |
| 0 | 9 | var. | Strict Source Routing. 使用源發送者所提供的信息路由當前數據包 |
| 0 | 7 | var. | Record Route. 用于跟蹤當當前數據包的路由 |
| 0 | 8 | 4 | Stream ID. 用于包含 Stream ID |
| 2 | 4 | var. | Internet Timestamp |
抓包分析
未分片IP包
經過上面的學習,我們來嘗試著分析一個 Wireshark 抓到的 IP 數據包.
原始二進制數據為:
45 00 00 28 fa f1 40 00 32 06 ec 59 a1 75 ff 00
c0 a8 00 66
分片 IP包
接下來我們來看看分片的 IP 數據包是怎么樣的.
這里我們將會看到一個分成三個分片的數據包. 這里我們只關注分片相關的幾個字段,其他字段參照上面分析.
第一個分片
這里我們需要關注的字段有: Identification, Flags, 和 Fragment Offset 三個字段.
且看上圖,這是一個IP包被分為三片中的第一片.
- 第二個 bit 為 0, 代表 May Fragment,說明該數據包可以被分片
- 第三個 bit 為 1, 代表 More Fragment, 說明該數據包不是原始數據包分片中的最后一個.
接下來且看第二個分片
4. 注意到當前分片的 Identification 值與第一個分片的值相同.
5. Flags 的值為 001(二進制), 根據 Flags 的定義我們知道:
- 第二個 bit 為 0, 代表 May Fragment,說明該數據包可以被分片
- 第三個 bit 為 1, 代表 More Fragment, 說明該數據包不是原始數據包分片中的最后一個.
6. Fragment Offset 為 1480. 這里需要注意 wireshark 顯示的是計算過之后的值,如果你看它的原始數據的畫你會發現該位的實際值為 .00010111001(二進制), 由于該字段的單位為 8 byte,因此等同于 00010111001 * 8 也就是 wireshark 中顯示的那個值了. 由第一張圖可以看到,第一個分片中的數據長度為 1480,因此第二個分片中的 Fragment offset 便對應于原始數據包中從 1480 位置除開始的數據. 數據長度依然為 1480.
接下來且看最后一個分片
7. 注意到當前分片的 Identification 值與前兩個分片的值相同.
8. Flags 的值為 000(二進制), 根據 Flags 的定義我們知道:
- 第二個 bit 為 0, 代表 May Fragment,說明該數據包可以被分片
- 第三個 bit 為 0, 代表 Last Fragment, 說明該數據包是最后一個分片.
9. Fragment Offset 為 2960. 由于前兩個分片的數據長度均為 1480,這個分片中的數據自然要從 2960 處開始了.
總結一下 IP 分片:
10. 如果將一個數據包的 Flags 中的 Don’t Flag 標志設置為 1, 那么該 IP 數據包不能被分片
11. 對于需要進行分片的數據包而言,分片規則如下:
- 對于第一個分片, Framgent Offset 設置為 0, 需要設置 More Fragment
- 對于中間分片, 需要設置 More Fragment, 且 Frament Offset 為之前所有分片中數據長度之和除以 8.
- 對于最后一個分片, 需要設置 Last Fragment, 且 Fragment Offset 為之前所有分片數據長度之和除以 8
- 同一個 IP 數據包分片之后的 IP 數據包需要設置相同的 Identification.
END!
總結
以上是生活随笔為你收集整理的协议簇:IPv4 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Atom快速打造好用的Markdow
- 下一篇: 矩阵 II : 线性组的线性相关性