Appearance
IPv4 数据报格式
考情分析
IP 数据报格式是网络层的基础知识点,选择题中经常围绕某个具体字段出题,比如问 TTL 的作用、首部长度的单位、片偏移的单位等。偶尔也会在大题中结合分片一起考。
考频:★★★
IP 数据报的整体结构
一个 IP 数据报由首部和数据部分组成。首部又分为两部分:
- 固定部分:20 字节,每个 IP 数据报都有
- 可选部分:0~40 字节,长度可变
数据部分承载的是上层协议(TCP/UDP)的报文段。
+-----------------------------+
| IP 首部(20~60B) |
+-----------------------------+
| 数据部分 |
| (TCP/UDP报文段等) |
+-----------------------------+首部字段逐一解析
IP 首部固定部分共 20 字节,按 4 字节一行来看,共 5 行。
第 1 行(字节 0~3)
| 字段 | 位数 | 说明 |
|---|---|---|
| 版本(Version) | 4 bit | IPv4 填 4,IPv6 填 6 |
| 首部长度(IHL) | 4 bit | 单位是 4 字节。最小值 5(即 20B),最大值 15(即 60B) |
| 区分服务(TOS) | 8 bit | 指示期望的服务质量,一般不考 |
| 总长度(Total Length) | 16 bit | 整个数据报的长度,单位是字节。最大 |
首部长度字段是个容易出错的地方:它的值乘以 4 才是实际的首部字节数。如果首部长度字段值为 5,说明首部长
第 2 行(字节 4~7)
| 字段 | 位数 | 说明 |
|---|---|---|
| 标识(Identification) | 16 bit | 同一个数据报的所有分片使用相同的标识值 |
| 标志(Flags) | 3 bit | 见下方详解 |
| 片偏移(Fragment Offset) | 13 bit | 单位是 8 字节。表示该分片在原始数据报中的相对位置 |
标志字段的 3 个 bit:
| 位 | 名称 | 含义 |
|---|---|---|
| 第 1 位 | 保留 | 置 0 |
| 第 2 位 | DF(Don't Fragment) | 1 = 不允许分片 |
| 第 3 位 | MF(More Fragments) | 1 = 后面还有分片,0 = 这是最后一个分片 |
第 3 行(字节 8~11)
| 字段 | 位数 | 说明 |
|---|---|---|
| 生存时间(TTL) | 8 bit | 每经过一个路由器减 1,减到 0 就丢弃。防止数据报在网络中无限循环 |
| 协议(Protocol) | 8 bit | 指示数据部分使用的上层协议。TCP=6,UDP=17,ICMP=1,OSPF=89 |
| 首部校验和(Header Checksum) | 16 bit | 只校验首部,不校验数据部分 |
TTL 的最大值是 255(8 bit 无符号整数)。常见操作系统的默认 TTL 值:Linux 为 64,Windows 为 128。
第 4~5 行(字节 12~19)
| 字段 | 位数 | 说明 |
|---|---|---|
| 源 IP 地址 | 32 bit | 发送方的 IP 地址 |
| 目的 IP 地址 | 32 bit | 接收方的 IP 地址 |
可选部分(字节 20~59)
可选部分长度可变,用于支持安全、源路由、记录路由、时间戳等功能。408 考试很少涉及可选部分的具体内容,但要注意:如果有可选部分,需要用 0 填充对齐到 4 字节的整数倍。
首部校验和的计算
IP 首部校验和只保护首部,不保护数据部分(这和 TCP/UDP 不同,它们的校验和覆盖了伪首部+首部+数据)。
计算步骤:
- 将首部校验和字段置为 0
- 把首部视为若干个 16 位的字,逐个相加
- 如果有进位,将进位加到低位(反码求和)
- 对结果取反码,填入校验和字段
验证时,接收方对整个首部(包含校验和字段)做同样的反码求和运算,如果结果全为 1(即 0xFFFF),则校验通过。
为什么只校验首部?因为 IP 层认为数据部分的校验应该由上层协议(TCP/UDP)负责,这样可以减少路由器的计算负担——每经过一个路由器,TTL 减 1,首部校验和都要重新计算。
几个容易混淆的"单位"
| 字段 | 单位 |
|---|---|
| 首部长度 | 4 字节 |
| 总长度 | 1 字节 |
| 片偏移 | 8 字节 |
这三个单位不一样,做题时千万看清楚。
字段值速算速查
把"字段位数 / 单位 / 极值 / 常考动作"全部串起来,整道选择题就能在 30 秒内秒杀。
| 字段 | 位数 | 单位 | 最小 → 最大 | 常考动作 |
|---|---|---|---|---|
| 版本 | 4 | — | 4(IPv4)/ 6(IPv6) | 直接看值判 IP 版本 |
| 首部长度 IHL | 4 | 4 B | 5 × 4 = 20 B → 15 × 4 = 60 B | 已知 IHL = n → 实际首部 = 4n 字节 |
| 总长度 | 16 | 1 B | 0 → 65535 B | 数据部分长度 = 总长 − 4 × IHL |
| 标识 | 16 | — | 0 → 65535 | 同一原报文的所有分片共享同一标识 |
| 标志 DF/MF | 1+1 | — | 0 / 1 | DF=1 不分片;MF=1 后面还有分片 |
| 片偏移 | 13 | 8 B | 0 → (2¹³−1)×8 = 65528 B | 片偏移值 × 8 = 在原报文中的字节起点 |
| TTL | 8 | — | 0 → 255 | 每跳路由器减 1,到 0 丢弃并发 ICMP 超时 |
| 协议 | 8 | — | 见下 | TCP=6 / UDP=17 / ICMP=1 / OSPF=89 |
| 首部校验和 | 16 | — | — | 每跳重算(TTL 变了) |
| 源/目的 IP | 各 32 | — | 0.0.0.0 → 255.255.255.255 | 端到端不变(NAT 例外) |
分片速算公式(高频)
给定 IP 数据报总长 L、首部长 H、链路 MTU M,分片数 n 与各片细节:
- 每片可装数据 = (M − H) 向下取整到 8 的倍数(片偏移单位 8 B 决定)
- 分片数
- 第 k 片(k 从 0 起)的片偏移字段值 =
- 除最后一片外 MF = 1;最后一片 MF = 0
- 所有分片标识字段相同
经典坑:MTU = 1500 时,IP 头 20 B → 可装数据空间 1480 B,而 1480 恰好是 8 的倍数,所以多数考题没暴露"向下取整到 8"这步。一旦链路是 PPP 链路 MTU = 1006 这类 8 ≠ 整除的数字,必须先把 (M − H) 向下取整到 8 的倍数再算。
交互可视化
易错点
1. 首部长度的单位不是字节
首部长度字段的单位是 4 字节。如果看到首部长度字段值为 7,说明首部长度是
2. 总长度 vs 数据链路层的长度限制
IP 数据报最大可以 65535 字节,但受限于数据链路层的 MTU(最大传输单元,以太网为 1500 字节),超过 MTU 的数据报必须分片。总长度指的是 IP 层看到的长度,不是物理帧的长度。
3. 首部校验和每跳都要重新计算
因为 TTL 每经过路由器减 1,所以首部内容变了,校验和也必须重新计算。这是 IPv4 的一个效率痛点,IPv6 直接取消了首部校验和。
4. 协议字段的常考数值
TCP=6,UDP=17,ICMP=1。这几个值选择题里偶尔直接考。
高频考点清单
- 首部长度字段的单位是 4 字节,最小值 5,最大值 15
- 总长度字段的单位是字节,包含首部 + 数据
- 片偏移字段的单位是 8 字节
- TTL 的作用及每跳减 1 的机制
- 首部校验和只覆盖首部,且每跳重新计算
- 协议字段标识上层协议(TCP=6, UDP=17, ICMP=1)
- DF=1 不允许分片,MF=1 后面还有分片