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 字节 |
这三个单位不一样,做题时千万看清楚。
交互可视化
易错点
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 后面还有分片