Author: Xu FC
References:
https://tools.ietf.org/html/rfc791
https://tools.ietf.org/html/rfc1393
http://www.iana.org/assignments/ip-parameters/ip-parameters.xhtml
http://www.bogpeople.com/networking/dscp.shtml
https://blog.csdn.net/u011784495/article/details/71636993
http://www.rhyshaden.com/ipdgram.htm
http://www.tcpipguide.com/free/t_IPDatagramOptionsandOptionFormat-2.htm
IPv4 報文頭格式

| 字段 | 長度 (bits) | 含義 |
|---|---|---|
| Version | 4 | IP 協(xié)議版本號 |
| Header Length | 4 | IPv4 首部長度 |
| Type of Service | 8 | 區(qū)分服務(wù), 與 IP 優(yōu)先級相關(guān) |
| Total length | 16 | 總長度,包括 header 和 payload |
| Identification | 16 | 標(biāo)識,數(shù)據(jù)報的標(biāo)識,分片數(shù)據(jù)報的各分片標(biāo)識相同 |
| Flags | 3 | 標(biāo)志,與分片相關(guān) |
| Fragment Offset | 13 | 片偏移,與分片相關(guān) |
| Time to Live | 8 | 數(shù)據(jù)報在傳輸中的跳數(shù)限制 |
| Protocol | 8 | 協(xié)議,上一層封裝的協(xié)議號 |
| Header Checksum | 16 | 首部校驗(yàn)和,只校驗(yàn)首部,不包含數(shù)據(jù)部分 |
| Source IP Address | 32 | 源 IP |
| Destination IP Address | 32 | 目的 IP |
| Options | 0~40 | 選項(xiàng)字段,必須是 4 字節(jié)的倍數(shù),否則以 0 填充 |
| Data | 填充報文 |
Version - 版本號
4 bits
0x4: IPv4, ethernetII type 為 0x0800
0x6: IPv6, ethernetII type 為 0x86dd
Header Length - 首部長度
4 bits
IPv4 首部長度,1 個單位代表 4 個字節(jié),在沒有選項(xiàng)的情況下,IPv4 首部長度為 5,即固定長度 20 字節(jié)(從 version 到 destination IP address),報頭長度必須是 4 字節(jié)的整數(shù)倍,如果不是,需要填充 PAD 補(bǔ) 0 湊齊。
Type of Service - 服務(wù)類型
8 bits
|0|1|2|3|4|5|6|7|
前 6 位 (0~5, RFC 2474) : 區(qū)分服務(wù)碼點(diǎn) (DSCP - Different Services Code Point), 是 IP 優(yōu)先級和服務(wù)類型字段的組合。

-
第 0~2 位 (優(yōu)先級從高到低)
- 111:Network Control
- 110:Internetwork Control
- 101:Critic/ECP
- 100:Flash Override
- 011:Flash
- 010:Immediate
- 001:Priority - 優(yōu)先
- 000:Routine - 常規(guī)
-
第 3 位
- 1:Low delay - 低延遲
- 0:Normal delay - 正常延遲
-
第 4 位
- 1:High Throughput - 高吞吐量
- 0:Normal Throughput - 正常吞吐量
-
第 5 位
- 1:High Reliability - 高可靠性
- 0:Normal Reliability - 正??煽啃?/li>
后 2 位 (RFC 3168):擁塞通知 (ECN - Explicit Congestion Notification)。
-
第 6 位
- 1:Minimise monetary cost (RFC 1349)
- 0
-
第 7 位
- 0:必需為 0
IP 優(yōu)先級表
- CS: 類選擇器 (Class Selector) (RFC 2474) - 同一 class 的優(yōu)先級相同
- AFxy: 保證轉(zhuǎn)發(fā) (Assured Forwarding) (x=class, y=drop precedence) (RFC 2579 - Textual Conventions for SMIv2) - MIB 相關(guān)
- EF: 加急轉(zhuǎn)發(fā) (Expedited Forwarding) (RFC 3246) - 快速轉(zhuǎn)發(fā) PHB (Per-Hop Behavior),低延遲、低抖動、低損耗
| DSCP | Binary | IP Precedence |
|---|---|---|
| CS0 | 000 000 | 0 |
| CS1 | 001 000 | 1 |
| AF11 | 001 010 | 1 |
| AF12 | 001 100 | 1 |
| AF13 | 001 110 | 1 |
| CS2 | 010 000 | 2 |
| AF21 | 010 010 | 2 |
| AF22 | 010 100 | 2 |
| AF23 | 010 110 | 2 |
| CS3 | 011 000 | 3 |
| AF31 | 011 010 | 3 |
| AF32 | 011 100 | 3 |
| AF33 | 011 110 | 3 |
| CS4 | 100 000 | 4 |
| AF41 | 100 010 | 4 |
| AF42 | 100 100 | 4 |
| AF43 | 100 110 | 4 |
| CS5 | 101 000 | 5 |
| EF | 101 110 | 5 |
| CS6 | 110 000 | 6 |
| CS7 | 111 000 | 7 |
Total length - 總長度
16 bits
總長度 = IP 頭部長度 + 數(shù)據(jù)長度
16 bit 能表示的最大長度為 65535 字節(jié)(2 的 16 次方 - 1),超過該長度的報文可以通過 IP 分片進(jìn)行構(gòu)造。
Identification - 標(biāo)識
16 bits
每個數(shù)據(jù)報有唯一標(biāo)識,每次加1,同一個數(shù)據(jù)報產(chǎn)生分片,所有分片的標(biāo)識相同,給分片重組作為依據(jù)。
Flags - 標(biāo)志
3 bits
|0|1|2|
分片標(biāo)志:
- 第 0 位 - Reserved,沒有使用,保持為 0;
- 第 1 位 - DF (Don't Fragment)
- DF = 1:不允許分片
- DF = 0:允許分片
- 第 2 位 - MF (More Fragment)
- MF = 1:表示后面有分片
- MF = 0:表示當(dāng)前是最后一個分片
Fragment Offset - 片偏移
13 bits
表示在當(dāng)前分片在數(shù)據(jù)報的位置,如果沒有分片,該字段為 0 ;如果有分片,首片片偏移為 0,偏移的一個單位表示 8 字節(jié),因此非尾片的數(shù)據(jù)部分需是 8 字節(jié)的整數(shù)倍,如果當(dāng)前分片為第二片,首片數(shù)據(jù)部分為 24 字節(jié),即結(jié)束位置為第 24 * 8 - 1 = 191 位,因此當(dāng)前分片的片偏移為 3,即起始位置為第 3 * 8 * 8 = 192 位。


Time to Live (TTL) - 生存時間
8 bits
表示該報文傳輸中允許經(jīng)過的跳數(shù),沒經(jīng)過一個路由器,該值就減 1 ,當(dāng) TTL = 0 時,丟棄這個報文,從而阻止報文在網(wǎng)絡(luò)上無限傳輸。TTL 最大值為 255 (2 的 8 次方 -1)。
Protocol - 上層協(xié)議
8 bits
告訴主機(jī)的 IP 層應(yīng)該將數(shù)據(jù)交給哪個上層處理過程。
Header Checksum - 首部校驗(yàn)和
16 bits
用于IP首部校驗(yàn),校驗(yàn)失敗則丟棄該報文。
Source IP Address
32 bits
發(fā)送端 IP 地址。
Web 應(yīng)用中,源 IP 不能是受限廣播 IP。
Destination IP Address
32 bits
接收端 IP 地址。
255.255.255.255 為受限廣播,路由器將丟棄該報文。
x.x.x.255 直接廣播,該報文將被發(fā)送到 x.x.x.0/24 子網(wǎng)的每一臺主機(jī)上。
Options - 選項(xiàng)
可選的 IP 報頭字段。
選項(xiàng)長度需要是 4 字節(jié)的整數(shù)倍,非整數(shù)倍將 PAD 填充。

- Option type
- Copy flag - 1 bit:
- 0:如果報文分片,該選項(xiàng)將不被復(fù)制到每個分片中;
- 1:如果報文分片,該選項(xiàng)將被復(fù)制到每個分片中;
- Option class - 2 bits:只使用了 0 和 2
- 0:控制;
- 2:For debugging and measurement;
- Option number - 5 bits:類似于協(xié)議號,指明是什么選項(xiàng);
- Option length - 8 bits:該選項(xiàng)的整個長度,即從 type 起始到 data 結(jié)束的長度,1 個單位代表 1 字節(jié);
- Option data - 詳細(xì)見 RFC 791;
- Copy flag - 1 bit:
| Copy | Class | Option Number | Length (字節(jié)) | Description |
|---|---|---|---|---|
| 0 | 0 | 0 | - | EOOP - End of Options List, 無長度和數(shù)據(jù),用于標(biāo)記選項(xiàng)列表的結(jié)尾。 |
| 0 | 0 | 1 | - | NOP - No Operation (忽略選項(xiàng)),無長度和數(shù)據(jù), 用于對齊 IP 頭中 32 位邊界對齊的內(nèi)部填充。 |
| 1 | 0 | 2 | 11 | SEC - Security(IP 安全性選項(xiàng)),用于指定 IP 數(shù)據(jù)包的安全性分類。 |
| 1 | 0 | 3 | 可變 | LSR - Loose Source Route (松散路由),向目的轉(zhuǎn)發(fā)時指定路由,網(wǎng)關(guān)可以不遵守。 |
| 0 | 2 | 4 | 可變 | TS - Time Stamp(時間戳),與 RR 類似,只是將路由改為時間戳,每個路由器都插入時間戳,用來查看路由之前的傳輸時長。 |
| 1 | 0 | 5 | E-SEC - Extended Security(擴(kuò)展安全選項(xiàng)),與基本安全選項(xiàng)一起使用,附加安全標(biāo)簽信息。 | |
| 1 | 0 | 6 | CIPSO - Commercial Security(商業(yè)安全) | |
| 0 | 0 | 7 | 可變 | RR - Record Route(記錄路由),記錄數(shù)據(jù)報走過的每個路由,長度由始發(fā)設(shè)備設(shè)置,不能被放大,如果到達(dá)目的前被填滿,則只會記錄部分路由。 |
| 1 | 0 | 8 | 4 | SID - Stream ID(流),在不支持流概念的網(wǎng)絡(luò)中傳輸 16 位 SATNET 流標(biāo)識 |
| 1 | 0 | 9 | 可變 | SSR - Strict Source Route(嚴(yán)格源路由),指定路由,路由器必須按照該路由進(jìn)行轉(zhuǎn)發(fā),并且在轉(zhuǎn)發(fā)過程中將源路由替換為路由器地址。 |
| 0 | 0 | 10 | ZSU - Experimental Measurement(實(shí)驗(yàn)測量) | |
| 0 | 0 | 11 | MTUP - MTU Probe,用于從非分片數(shù)據(jù)報傳輸?shù)木W(wǎng)絡(luò)路徑中找到最低 MTU,MTU 值將在 MTU Reply 中返回。已過時。 | |
| 0 | 0 | 12 | MTUR - MTU Reply,已過時。 | |
| 1 | 2 | 13 | FINN - Experimental Flow Control(實(shí)驗(yàn)測量控制) | |
| 1 | 0 | 14 | VISA - Experimental Access Control(實(shí)驗(yàn)訪問控制) | |
| 0 | 0 | 15 | ENCODE(用于圍繞 IP 層加密實(shí)驗(yàn)) | |
| 1 | 0 | 16 | IMITD - IMI Traffic Descriptor(IMI 流量描述符) | |
| 1 | 0 | 17 | EIP - Extended Internet Protocol(擴(kuò)展互聯(lián)網(wǎng)協(xié)議) | |
| 0 | 2 | 18 | 12 | TR - Traceroute(跟蹤路由),路由器將 ICMP Traceroute 消息發(fā)送給始發(fā)主機(jī),從而告訴發(fā)起方傳輸路徑。RFC 1393。 |
| 1 | 0 | 19 | 10 | ADDEXT - Address Extension(地址擴(kuò)展),用于載入 IPv4 地址轉(zhuǎn)換為 IPv7 地址所需附加字節(jié)。 |
| 1 | 0 | 20 | 4 | RTRALT - Router Alert(路由報警),通知中轉(zhuǎn)路由器更仔細(xì)的檢查 IP 數(shù)據(jù)報的內(nèi)容。 |
| 1 | 0 | 21 | 6~38 | SDB - Selective Directed Broadcast(選擇性定向廣播模式),為 IPv4 數(shù)據(jù)報的選項(xiàng)字段包含的一組 IP 地址提供 UDP 傳輸。 |
| 1 | 0 | 22 | unassigned | |
| 1 | 0 | 23 | DPS - Dynamic Packet State(動態(tài)分組狀態(tài)) | |
| 1 | 0 | 24 | UMP - Upstream Multicast Pkt(上游組播包) | |
| 0 | 0 | 25 | QS - Quick-Start(快速開始) | |
| 0 | 0 | 30 | EXP - RFC 3682 | |
| 0 | 2 | 30 | EXP - RFC 3682 | |
| 1 | 0 | 30 | EXP - RFC 3682 | |
| 1 | 2 | 30 | EXP - RFC 3682 |
EOOL - End of Options List
無長度和數(shù)據(jù),用于標(biāo)記選項(xiàng)列表的結(jié)尾。
+--------+
|00000000|
+--------+
Copy - 1 bit: 0
Class - 2 bits: 0
Number - 5 bits: 0
NOP - No Operation (忽略選項(xiàng))
無長度和數(shù)據(jù), 用于對齊 IP 頭中 32 位邊界對齊的內(nèi)部填充。
+--------+
|00000001|
+--------+
Copy - 1 bit: 0
Class - 2 bits: 0
Number - 5 bits: 1

LSR - Loose Source Route (松散路由)
向目的轉(zhuǎn)發(fā)時指定路由,網(wǎng)關(guān)可以不遵守。
+--------+--------+--------+---------//--------+
|10000011| length | pointer| route data |
+--------+--------+--------+---------//--------+
Copy - 1 bit: 1
Class - 2 bits: 0
Number - 5 bits: 3
Length - 8 bits
Pointer - 8 bits
Route data

TS - Time Stamp(時間戳)
與 RR 類似,只是將路由改為時間戳,每個路由器都插入時間戳,用來查看路由之前的傳輸時長。
為了不暴露內(nèi)網(wǎng)路徑相關(guān)信息,防火墻應(yīng)丟棄攜帶 TS Option 的報文。
+--------+--------+--------+--------+
|01000100| length | pointer|oflw|flg|
+--------+--------+--------+--------+
| internet address |
+--------+--------+--------+--------+
| timestamp |
+--------+--------+--------+--------+
| . |
.
.
Copy - 1 bit: 0
Class - 2 bits: 1
Number - 5 bits: 4
Length - 8 bits
Pointer - 8 bits:指向下一個時間戳記錄添加位置。
Overflow - 4 bits:由于缺少空間而無法記錄時間戳的跳數(shù)。
Flag - 4 bits:
0: 只記錄時間戳
1: 記錄 IP 地址和時間戳
3: 提前指定 IP 地址,當(dāng)前網(wǎng)絡(luò)節(jié)點(diǎn)匹配該 IP 時,記錄該時間戳

RR - Record Route(記錄路由)
記錄數(shù)據(jù)報走過的每個路由,長度由始發(fā)設(shè)備設(shè)置,不能被放大,如果到達(dá)目的前被填滿,則只會記錄部分路由。
為了不暴露內(nèi)網(wǎng)路徑,防火墻應(yīng)丟棄攜帶 RR Option 的報文。
+--------+--------+--------+---------//--------+
|00000111| length | pointer| route data |
+--------+--------+--------+---------//--------+
Copy - 1 bit: 0
Class - 2 bits: 0
Number - 5 bits: 7
Pointer - 8 bits: 指向下一個路由記錄添加位置。

SSR - Strict Source Route(嚴(yán)格源路由)
指定路由,路由器必須按照該路由進(jìn)行轉(zhuǎn)發(fā),并且在轉(zhuǎn)發(fā)過程中將源路由替換為路由器地址。
+--------+--------+--------+---------//--------+
|10001001| length | pointer| route data |
+--------+--------+--------+---------//--------+
Copy - 1 bit: 1
Class - 2 bits: 0
Number - 5 bits: 9

TR - Traceroute(跟蹤路由)
路由器將 ICMP Traceroute 消息發(fā)送給始發(fā)主機(jī),從而告訴發(fā)起方傳輸路徑。
+--------+--------+--------+--------+
|01010010| Length | ID Number |
+--------+--------+--------+--------+
|Outbound Hop Count|Return Hop Count|
+--------+--------+--------+--------+
| Originator IP Address |
+--------+--------+--------+--------+
Copy - 1 bit: 0
Class - 2 bits: 2
Number - 5 bits: 18