对隧道数据包进行分段

网络工程 IPv4 碎片化
2022-02-04 16:22:28

我正在阅读这份 Cisco 文档 -使用 GRE 和 IPSEC 解决 IP 分段、MTU、MSS 和 PMTUD 问题

我对示例 3 感到困惑。下面的屏幕截图。

在此处输入图像描述

据我了解,标头大小的总和为 44(新 IP 标头(20)+ GRE 标头(4)+ 原始 IP 标头(20))。如示例 3 所述,路径之间的路由器具有 1400 字节的 MTU。这样就剩下 1400 - 44 = 1356 个字节用于 TCP 有效负载。

但是,该示例显示“1352 字节”,即沿 1400 字节路径的最小 MTU 短 4。剩余的 104 字节数据已被转移到下一个片段。

为什么第一个数据包不是完整的 1400 字节,而是 1396 字节(1352 + 44),并且在下一个片段中添加了 100 字节的 TCP 有效负载?

谢谢。

1个回答

您忘记了数据必须在八字节(64 位)边界上分段的事实。如果您采用 1400 字节的 MTU 并减去 44 字节的标头,则剩下 1356 个字节用于数据,但 1356 不能被 8 整除:1356 / 8 = 169.5,但是169 x 8 = 1352

请参阅RFC 791,互联网协议

为了对长互联网数据报进行分段,互联网协议模块(例如,在网关中)创建两个新的互联网数据报,并将互联网报头字段的内容从长数据报复制到两个新的互联网报头中。长数据报的数据在 8 个八位字节(64 位)边界上分为两部分(第二部分可能不是 8 个八位字节的整数倍,但第一部分必须是)。在第一部分 NFB 中调用 8 个八位字节块的数量(对于 Fragment Blocks 的数量)。数据的第一部分放在第一个新的互联网数据报中,总长度字段设置为第一个数据报的长度。more-fragments 标志设置为 1。数据的第二部分放在第二个新的互联网数据报中,总长度字段设置为第二个数据报的长度。more-fragments 标志携带与长数据报相同的值。第二个新互联网数据报的片段偏移字段设置为长数据报中该字段的值加上 NFB。