当我们在网络层从一台路由器向另一台路由器发送数据包并且数据包大小大于路由器的 MTU(最大可传输单位)时,我们必须对数据包进行分段。我的问题是:假设我们需要在最后一个片段中添加填充位,那么我们在哪里添加填充位(在 LSB 或 MSB 中)以及目标路由器如何区分数据包位或填充位?
2 回答
我希望您在之前考虑以下事项:
- 数据链路协议对 IP 数据报的最大大小进行了限制。
- IP 是在路由器和主机上都实现的最高层协议。
- 原始数据报的重组仅在目标主机完成。这消除了网络核心中的路由器需要完成的额外工作。
这里数据包的初始长度为 2400 字节,需要根据 1000 字节的 MTU 限制进行分片。
片段偏移量只有 13 位可用,并且偏移量是 8 个字节的倍数。这就是为什么第一个和第二个片段中的数据字段的大小为 976 字节(它是可被 8 整除的最大数字,小于 1000 - 20 字节)。这使得总大小为 996 字节的第一个和第二个片段。最后一个片段包含剩余的 428 字节有效载荷(总共 448 字节)。
偏移量可以计算为0;976/8 = 122 和 1952/8 = 244。
当这些碎片到达目的主机时,需要进行重组。主机为此任务使用标识、标志和碎片偏移量。为了确定哪些片段属于哪个数据报,主机使用源地址、目的地址和标识来唯一标识它们。偏移值和更多片段位用于确定是否所有片段都已到达。
回答你的问题
只有非最后一个片段才需要将有效负载划分为 8 的倍数。使用偏移除以 8 的原因有助于主机识别下一个片段的起始地址。如果主机遇到最后一个分片,则不需要下一个分片的地址。因此,在最后一个片段的情况下,无需担心有效载荷是 8 的倍数。主机检查更多片段标志以识别最后一个片段。
一些额外的信息:保证数据报的传递不是网络层的责任。如果它遇到一个或多个片段还没有到达,它会简单地丢弃整个数据报。工作在网络层之上的传输层会处理这个问题,如果它使用 TCP,会要求源重新传输数据。
参考:计算机网络 - 自上而下的方法,James F. Kurose,Keith W. Ross(第五版)
您不需要添加任何填充位。所有位都将沿路由向下推送,直到发送完整帧。