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 协议版本号 |
Header Length | 4 | IPv4 首部长度 |
Type of Service | 8 | 区分服务, 与 IP 优先级相关 |
Total length | 16 | 总长度,包括 header 和 payload |
Identification | 16 | 标识,数据报的标识,分片数据报的各分片标识相同 |
Flags | 3 | 标志,与分片相关 |
Fragment Offset | 13 | 片偏移,与分片相关 |
Time to Live | 8 | 数据报在传输中的跳数限制 |
Protocol | 8 | 协议,上一层封装的协议号 |
Header Checksum | 16 | 首部校验和,只校验首部,不包含数据部分 |
Source IP Address | 32 | 源 IP |
Destination IP Address | 32 | 目的 IP |
Options | 0~40 | 选项字段,必须是 4 字节的倍数,否则以 0 填充 |
Data | 填充报文 |
Version - 版本号
4 bits
0x4: IPv4, ethernetII type 为 0x0800
0x6: IPv6, ethernetII type 为 0x86dd
Header Length - 首部长度
4 bits
IPv4 首部长度,1 个单位代表 4 个字节,在没有选项的情况下,IPv4 首部长度为 5,即固定长度 20 字节(从 version 到 destination IP address),报头长度必须是 4 字节的整数倍,如果不是,需要填充 PAD 补 0 凑齐。Type of Service - 服务类型
8 bits
|0|1|2|3|4|5|6|7|
前 6 位 (0~5, RFC 2474) : 区分服务码点 (DSCP - Different Services Code Point), 是 IP 优先级和服务类型字段的组合。
-
第 0~2 位 (优先级从高到低)
- 111:Network Control
- 110:Internetwork Control
- 101:Critic/ECP
- 100:Flash Override
- 011:Flash
- 010:Immediate
- 001:Priority - 优先
- 000:Routine - 常规
-
第 3 位
- 1:Low delay - 低延迟
- 0:Normal delay - 正常延迟
-
第 4 位
- 1:High Throughput - 高吞吐量
- 0:Normal Throughput - 正常吞吐量
-
第 5 位
- 1:High Reliability - 高可靠性
- 0:Normal Reliability - 正常可靠性
后 2 位 (RFC 3168):拥塞通知 (ECN - Explicit Congestion Notification)。
-
第 6 位
- 1:Minimise monetary cost (RFC 1349)
- 0
-
第 7 位
- 0:必需为 0
IP 优先级表
- CS: 类选择器 (Class Selector) (RFC 2474) - 同一 class 的优先级相同
- AFxy: 保证转发 (Assured Forwarding) (x=class, y=drop precedence) (RFC 2579 - Textual Conventions for SMIv2) - MIB 相关
- EF: 加急转发 (Expedited Forwarding) (RFC 3246) - 快速转发 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 头部长度 + 数据长度
16 bit 能表示的最大长度为 65535 字节(2 的 16 次方 - 1),超过该长度的报文可以通过 IP 分片进行构造。
Identification - 标识
16 bits
每个数据报有唯一标识,每次加1,同一个数据报产生分片,所有分片的标识相同,给分片重组作为依据。
Flags - 标志
3 bits
|0|1|2|
分片标志:
- 第 0 位 - Reserved,没有使用,保持为 0;
- 第 1 位 - DF (Don't Fragment)
- DF = 1:不允许分片
- DF = 0:允许分片
- 第 2 位 - MF (More Fragment)
- MF = 1:表示后面有分片
- MF = 0:表示当前是最后一个分片
Fragment Offset - 片偏移
13 bits
表示在当前分片在数据报的位置,如果没有分片,该字段为 0 ;如果有分片,首片片偏移为 0,偏移的一个单位表示 8 字节,因此非尾片的数据部分需是 8 字节的整数倍,如果当前分片为第二片,首片数据部分为 24 字节,即结束位置为第 24 * 8 - 1 = 191 位,因此当前分片的片偏移为 3,即起始位置为第 3 * 8 * 8 = 192 位。
Time to Live (TTL) - 生存时间
8 bits
表示该报文传输中允许经过的跳数,没经过一个路由器,该值就减 1 ,当 TTL = 0 时,丢弃这个报文,从而阻止报文在网络上无限传输。TTL 最大值为 255 (2 的 8 次方 -1)。
Protocol - 上层协议
8 bits
告诉主机的 IP 层应该将数据交给哪个上层处理过程。
Header Checksum - 首部校验和
16 bits
用于IP首部校验,校验失败则丢弃该报文。
Source IP Address
32 bits
发送端 IP 地址。
Web 应用中,源 IP 不能是受限广播 IP。
Destination IP Address
32 bits
接收端 IP 地址。
255.255.255.255 为受限广播,路由器将丢弃该报文。
x.x.x.255 直接广播,该报文将被发送到 x.x.x.0/24 子网的每一台主机上。
Options - 选项
可选的 IP 报头字段。
选项长度需要是 4 字节的整数倍,非整数倍将 PAD 填充。
- Option type
- Copy flag - 1 bit:
- 0:如果报文分片,该选项将不被复制到每个分片中;
- 1:如果报文分片,该选项将被复制到每个分片中;
- Option class - 2 bits:只使用了 0 和 2
- 0:控制;
- 2:For debugging and measurement;
- Option number - 5 bits:类似于协议号,指明是什么选项;
- Option length - 8 bits:该选项的整个长度,即从 type 起始到 data 结束的长度,1 个单位代表 1 字节;
- Option data - 详细见 RFC 791;
- Copy flag - 1 bit:
Copy | Class | Option Number | Length (字节) | Description |
---|---|---|---|---|
0 | 0 | 0 | - | EOOP - End of Options List, 无长度和数据,用于标记选项列表的结尾。 |
0 | 0 | 1 | - | NOP - No Operation (忽略选项),无长度和数据, 用于对齐 IP 头中 32 位边界对齐的内部填充。 |
1 | 0 | 2 | 11 | SEC - Security(IP 安全性选项),用于指定 IP 数据包的安全性分类。 |
1 | 0 | 3 | 可变 | LSR - Loose Source Route (松散路由),向目的转发时指定路由,网关可以不遵守。 |
0 | 2 | 4 | 可变 | TS - Time Stamp(时间戳),与 RR 类似,只是将路由改为时间戳,每个路由器都插入时间戳,用来查看路由之前的传输时长。 |
1 | 0 | 5 | E-SEC - Extended Security(扩展安全选项),与基本安全选项一起使用,附加安全标签信息。 | |
1 | 0 | 6 | CIPSO - Commercial Security(商业安全) | |
0 | 0 | 7 | 可变 | RR - Record Route(记录路由),记录数据报走过的每个路由,长度由始发设备设置,不能被放大,如果到达目的前被填满,则只会记录部分路由。 |
1 | 0 | 8 | 4 | SID - Stream ID(流),在不支持流概念的网络中传输 16 位 SATNET 流标识 |
1 | 0 | 9 | 可变 | SSR - Strict Source Route(严格源路由),指定路由,路由器必须按照该路由进行转发,并且在转发过程中将源路由替换为路由器地址。 |
0 | 0 | 10 | ZSU - Experimental Measurement(实验测量) | |
0 | 0 | 11 | MTUP - MTU Probe,用于从非分片数据报传输的网络路径中找到最低 MTU,MTU 值将在 MTU Reply 中返回。已过时。 | |
0 | 0 | 12 | MTUR - MTU Reply,已过时。 | |
1 | 2 | 13 | FINN - Experimental Flow Control(实验测量控制) | |
1 | 0 | 14 | VISA - Experimental Access Control(实验访问控制) | |
0 | 0 | 15 | ENCODE(用于围绕 IP 层加密实验) | |
1 | 0 | 16 | IMITD - IMI Traffic Descriptor(IMI 流量描述符) | |
1 | 0 | 17 | EIP - Extended Internet Protocol(扩展互联网协议) | |
0 | 2 | 18 | 12 | TR - Traceroute(跟踪路由),路由器将 ICMP Traceroute 消息发送给始发主机,从而告诉发起方传输路径。RFC 1393。 |
1 | 0 | 19 | 10 | ADDEXT - Address Extension(地址扩展),用于载入 IPv4 地址转换为 IPv7 地址所需附加字节。 |
1 | 0 | 20 | 4 | RTRALT - Router Alert(路由报警),通知中转路由器更仔细的检查 IP 数据报的内容。 |
1 | 0 | 21 | 6~38 | SDB - Selective Directed Broadcast(选择性定向广播模式),为 IPv4 数据报的选项字段包含的一组 IP 地址提供 UDP 传输。 |
1 | 0 | 22 | unassigned | |
1 | 0 | 23 | DPS - Dynamic Packet State(动态分组状态) | |
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
无长度和数据,用于标记选项列表的结尾。
+--------+
|00000000|
+--------+
Copy - 1 bit: 0
Class - 2 bits: 0
Number - 5 bits: 0
NOP - No Operation (忽略选项)
无长度和数据, 用于对齐 IP 头中 32 位边界对齐的内部填充。
+--------+
|00000001|
+--------+
Copy - 1 bit: 0
Class - 2 bits: 0
Number - 5 bits: 1
LSR - Loose Source Route (松散路由)
向目的转发时指定路由,网关可以不遵守。
+--------+--------+--------+---------//--------+
|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 类似,只是将路由改为时间戳,每个路由器都插入时间戳,用来查看路由之前的传输时长。
为了不暴露内网路径相关信息,防火墙应丢弃携带 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:由于缺少空间而无法记录时间戳的跳数。
Flag - 4 bits:
0: 只记录时间戳
1: 记录 IP 地址和时间戳
3: 提前指定 IP 地址,当前网络节点匹配该 IP 时,记录该时间戳
RR - Record Route(记录路由)
记录数据报走过的每个路由,长度由始发设备设置,不能被放大,如果到达目的前被填满,则只会记录部分路由。
为了不暴露内网路径,防火墙应丢弃携带 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(严格源路由)
指定路由,路由器必须按照该路由进行转发,并且在转发过程中将源路由替换为路由器地址。
+--------+--------+--------+---------//--------+
|10001001| length | pointer| route data |
+--------+--------+--------+---------//--------+
Copy - 1 bit: 1
Class - 2 bits: 0
Number - 5 bits: 9
TR - Traceroute(跟踪路由)
路由器将 ICMP Traceroute 消息发送给始发主机,从而告诉发起方传输路径。
+--------+--------+--------+--------+
|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