https://songly.blog.csdn.net/category_9274818_2.html
报文结构

标识:指现一个数据包的名字,标志:指是否分片后 有DF、MF ,片偏移指:是分片后相对原始数据包的位置
在 IP 报文头中,有一个字段叫做“标识符(Identification)”和“片段偏移(Fragment Offset)”,这两个字段一起用于分片和重组 IP 分组。
当一个较大的数据包需要通过 MTU(最大传输单元)较小的链路传输时,原始数据包会被分割成多个较小的数据片段。每个数据片段都会带有相同的标识符,以便接收方可以识别它们属于同一个原始数据包,并按照正确的顺序重新组装。
IP 分片和重组
标识符(Identification)
- 用途:标识符字段是一个 16 位的字段,用于唯一标识属于同一原始数据包的不同分片。
- 值:每个原始数据包都有一个唯一的标识符值。
片段偏移(Fragment Offset)
- 用途:片段偏移字段是一个 13 位的字段,用于指示每个分片相对于原始数据包的起始位置。
- 单位:偏移量是以 8 字节(64 位)为单位来计算的。
- 计算公式:
片段偏移 = (分片在原始数据包中的起始位置 / 8)
示例计算
假设原始数据包需要被分割成两个分片:
- 第一个分片:
- 标识符:12345
- 片段偏移:0
- 因此,第一个分片在原始数据包中的起始位置是 0 字节。
- 第二个分片:
- 假设第一个分片的大小为 640 字节(80 字节头部 + 560 字节数据)。
- 标识符:12345
- 片段偏移:(640 / 8) = 80
- 因此,第二个分片在原始数据包中的起始位置是 640 字节。
注意事项
- 更多分片:如果有更多的分片,每个后续分片的偏移量会相应递增。
- 标志位:每个分片还有一个标志位(More Fragments),用于指示是否还有后续分片。如果是最后一个分片,则 More Fragments 标志位设置为 0。
示例计算
假设原始数据包被分成三个分片:
- 第一个分片:
- 标识符:12345
- 片段偏移:0
- More Fragments:1
- 假设大小为 640 字节。
- 第二个分片:
- 标识符:12345
- 片段偏移:80
- More Fragments:1
- 假设大小为 640 字节。
- 第三个分片:
- 标识符:12345
- 片段偏移:160
- More Fragments:0
- 假设大小为 640 字节。
总结
- 第一个分片 的起始位置是 0 字节。
- 第二个分片 的起始位置是 640 字节。
- 第三个分片 的起始位置是 1280 字节。
这样,接收方可以根据标识符和片段偏移字段将分片重新组合成原始数据包。