🎯 课程摘要:本节详解 IPv4 数据报首部的各字段含义与功能。首部由 20 字节固定部分 + 最大 40 字节可变部分(可选字段)组成,通过版本、首部长度、总长度、标识、标志、片偏移、TTL(生存时间)、协议、首部校验和等字段实现 IP 协议的各种功能,其中标识/标志/片偏移共同支持数据报分片,TTL(生存时间)防止数据报在网络中无限兜圈。
- 组成:IPv4 数据报首部 = 20 字节固定部分 + 最大 40 字节可变部分(可选字段)。
- 描述方式:TCP/IP 标准中以 32 比特(4 字节)为单位描述,每行 32 比特,每个格子称为字段(或域)。
- ⚠️ 重点/考点:固定部分必含;可变部分(可选字段)很少使用,但会使首部长度可变,增加路由器处理开销。
| 字段 | 长度 | 含义 | 备注 |
|---|
| 版本 | 4 bit | 表示 IP 协议版本 | 通信双方版本须一致,现广泛使用 IPv4 |
| 首部长度 | 4 bit | 表示首部长度,以 4 字节为单位 | 最小 0101(=5→20B),最大 1111(=15→60B) |
| 区分服务 | 8 bit | 提供不同等级的服务质量 | 旧称服务类型,一般不使用 |
| 总长度 | 16 bit | 首部 + 数据载荷的总长度,以字节为单位 | 最大 65535 字节 |
| 标识 | 16 bit | 同一数据报的各分片具有相同标识 | IP 计数器每产生一个数据报加 1 |
| 标志 | 3 bit | DF=禁止分片,MF=后面还有分片 | 最高位保留置 0 |
| 片偏移 | 13 bit | 分片数据载荷在原数据报中的偏移,以 8 字节为单位 | 必须为整数 |
| 生存时间 TTL | 8 bit | 限制数据报在网络中的生存跳数 | 最大 255,每经路由器减 1,为 0 则丢弃 |
| 协议 | 8 bit | 指明数据载荷是何种协议数据单元 | TCP=6, UDP=17, ICMP=1 等 |
| 首部校验和 | 16 bit | 检测首部传输是否出现差错 | 每经路由器需重新计算 |
| 源 IP 地址 | 32 bit | 发送方的 IPv4 地址 | — |
| 目的 IP 地址 | 32 bit | 接收方的 IPv4 地址 | — |
| 可选字段 | 0~40 字节 | 支持排错、测量、安全等功能 | 很少使用 |
| 填充 | 可变 | 全 0 填充,确保首部长度为 4 字节整数倍 | — |
- 首部长度字段:取值以 4 字节为单位,最小 5(→20B 固定部分),最大 15(→60B)。
- 总长度字段:取值以字节为单位,= 首部长度 + 数据载荷长度。
- 示例:首部长度字段为 0101(=5→20B),总长度字段为 001111111100(=1020B),则数据载荷 = 1020 − 20 = 1000B。
- 目的:确保 IPv4 数据报首部长度为 4 字节的整数倍。
- 原理:首部长度字段以 4 字节为单位,故首部长度必须是 4 的整数倍;当固定部分(20B) + 可选字段长度使总长非 4 整数倍时,用全 0 填充补齐。
- 示例:可选字段 3 字节 → 20+3=23B(非 4 整数倍)→ 填充 1 字节 → 24B,首部长度字段填 0110(=6→24B)。
- 分片原因:每种数据链路层协议规定了帧数据载荷的最大长度,即 MTU(最大传送单元)(如以太网 MTU = 1500 字节)。当 IPv4 数据报总长度超过 MTU 时,需分片为更小的数据报。
- 相关字段:标识、标志、片偏移三者共同用于分片。
| 位 | 名称 | 含义 |
|---|
| 最高位 | 保留位 | 必须置 0 |
| 中间位 | DF(Don't Fragment) | DF=1 禁止分片,DF=0 允许分片 |
| 最低位 | MF(More Fragments) | MF=1 后面还有分片,MF=0 是最后分片 |
- 片偏移:以 8 字节为单位,指出本分片数据载荷在原数据报数据载荷中的相对位置。
| 分片 | 数据载荷 | 总长度 | 标识 | MF | DF | 片偏移 |
|---|
| 原数据报 | 3800B | 3820 | 23333 | 0 | 0 | 0 |
| 分片1 | 1400B(0~1399) | 1420 | 23333 | 1 | 0 | 0 |
| 分片2 | 1400B(1400~2799) | 1420 | 23333 | 1 | 0 | 175 |
| 分片3 | 1000B(2800~3799) | 1020 | 23333 | 0 | 0 | 350 |
- ⚠️ 重点/考点:除最后一个分片外,每个分片数据载荷长度必须是 8 字节的整数倍(否则后续分片片偏移非整数);各分片标识字段相同。
- 初始定义:以秒为单位,最大 255 秒;路由器转发时减去耗费时间,为 0 则丢弃。
- 现行定义:以跳数为单位,路由器每转发一次减 1,为 0 则丢弃。
- 作用:防止被错误路由的 IP 数据报在路由环路中无限兜圈,浪费网络资源。
- ⚠️ 重点/考点:TTL(生存时间) 是防环路的关键机制;最大值 255。
| 协议字段值 | 协议 |
|---|
| 1 | ICMP |
| 2 | IGMP |
| 6 | TCP |
| 17 | UDP |
| 89 | OSPF |
- 作用:检测 IPv4 数据报首部在传输过程中是否出现差错。
- 计算方法(反码算术运算):
- 发送端将首部划分为若干 16 比特字的序列,首部校验和字段置全 0;
- 用反码算术运算将所有 16 比特字相加,取反码得到校验和,写入字段;
- 接收端将首部所有 16 比特字再反码求和并取反码,结果为 0 则无差错,否则丢弃。
- 特点:每经路由器(因 TTL、标志、片偏移等变化)都需重新计算;检测性能不如 CRC(循环冗余检验),但更易用软件实现,称为因特网校验和。
- ⚠️ 重点/考点:IPv6 中路由器不再计算首部校验和,以加快转发。
- 从低位到高位逐列计算:0+0=0,0+1=1,1+1=0 但产生进位 1 加到下一列。
- 最高位产生进位时,最终结果需加 1(循环进位)。
- 将最终求和结果取反码即得校验和。
- IPv4 首部 = 20B 固定部分 + 可选字段(0~40B) + 填充,首部长度以 4 字节为单位。
- 标识/标志/片偏移实现分片:DF 控制是否允许分片,MF 标记是否还有后续分片,片偏移以 8 字节为单位。
- TTL(生存时间) 以跳数为单位防环路;协议字段标识上层协议;首部校验和用反码求和检测差错。
- 分片时除最后一片外,各片数据载荷长度须为 8 字节整数倍。
- IPv4 数据报首部长度字段以什么为单位?最小和最大取值各代表多少字节?
- 某 IPv4 数据报总长度 3800 字节(含 20B 首部),MTU = 1500 字节,如何分片?写出各分片的 MF、片偏移值。
- TTL(生存时间)字段的作用是什么?若没有 TTL,路由环路会造成什么后果?
- 为什么除最后一个分片外,每个分片数据载荷长度必须是 8 字节的整数倍?
- 首部校验和的计算采用什么运算?为何 IPv6 取消了该字段?