Fragment Offset 的作用
核心目的:让接收方知道每个分片应该拼回原始数据报的哪个位置。
为什么需要它
IP 数据报在传输过程中可能经过MTU 较小的链路,被路由器切成多个分片。这些分片:
- 可能走不同路径到达目的地
- 到达顺序可能乱序
- 需要在目的主机重新组装成原始数据报
没有偏移量,接收方根本不知道每块碎片放在哪里。
⭐举例说明
原始数据报数据部分 4000 字节,MTU = 1500(IP头20字节,每片最多携带1480字节数据):
| 分片 | 数据内容 | 字节范围 | 偏移值(÷8) | MF标志 |
|---|---|---|---|---|
| 分片1 | 第 0~1479 字节 | 0 | 0 | 1 |
| 分片2 | 第 1480~2959 字节 | 1480 | 185 | 1 |
| 分片3 | 第 2960~3999 字节 | 2960 | 370 | 0 |
接收方收到这三个分片后,根据偏移量就能准确拼回原始顺序。
为什么以 8 字节为单位
13位最大表示 2¹³ - 1 = 8191,若单位是字节则最多只能表示 8191 字节的偏移,远不够用。
以 8字节为单位后,最大可表示:
8191 × 8 = 65528 字节
恰好覆盖 IP 数据报数据部分最大长度(65515字节),用更少的位表示更大的范围。
配合 MF 标志一起理解
Fragment Offset 单独不够用,还需要配合 MF(More Fragments)标志位:
| 情况 | MF | Offset |
|---|---|---|
| 未分片的完整报文 | 0 | 0 |
| 分片中间片 | 1 | >0 |
| 最后一个分片 | 0 | >0 |
接收方同时根据这两个字段判断是否收齐所有分片,再重组。
一句话总结
Fragment Offset 本质上是一个**“拼图编号”**,告诉接收方这块碎片属于原始数据的第几个字节开始,以8字节为单位是为了用13位覆盖足够大的地址范围。