IP 分片和数据包头

网络工程 ip 碎片化
2021-07-19 15:55:38

我在某处读到碎片化的 ip 数据包可以根据网络的变化进一步碎片化。

现在如何在路由器重新组装数据包。因为识别位可以用于一组数据包。有人可以举个例子吗

其次,识别号是随机选择的还是背后有特定的算法。

最后,IP标志中使用的保留位的意义是什么

2个回答

IPv4维基百科文章分段和重组部分很好地解释了它:

分片和重组 主条目:IP 分片

Internet 协议使网络能够相互通信。该设计适应不同物理性质的网络;它独立于链路层中使用的底层传输技术。具有不同硬件的网络通常不仅传输速度不同,而且最大传输单元 (MTU) 也不同。当一个网络想要将数据报传输到具有较小 MTU 的网络时,它可能会将其数据报分段。在 IPv4 中,这个功能被放置在 Internet 层,并在 IPv4 路由器中执行,因此只需要这一层作为他们设计中实现的最高层。

相比之下,下一代互联网协议 IPv6 不允许路由器进行分片;主机必须在发送数据报之前确定路径 MTU。

碎片化

当路由器收到数据包时,它会检查目标地址并确定要使用的传出接口和该接口的 MTU。如果数据包大小大于 MTU,并且数据包头中的不分段 (DF) 位设置为 0,则路由器可能会对数据包进行分段。

路由器将数据包分成片段。每个片段的最大大小是 MTU 减去 IP 标头大小(最小 20 字节;最大 60 字节)。路由器将每个分片放入自己的数据包中,每个分片数据包有以下变化:

  • 总长度字段是片段大小。
  • 为除最后一个片段之外的所有片段设置更多片段 (MF) 标志,最后一个片段设置为 0。
  • 片段偏移字段是根据原始数据有效载荷中片段的偏移量设置的。这是以八字节块为单位测量的。
  • 重新计算标头校验和字段。

例如,对于 1,500 字节的 MTU 和 20 字节的报头大小,片段偏移量将是 (1500–20)/8 = 185 的倍数。这些倍数是 0、185、370、555、740、...

一个数据包可能在一个路由器上分段,而在另一个路由器上分段。例如,考虑一个大小为 4,500 字节、没有选项且 IP 报头大小为 20 字节的传输层段。因此 IP 数据包大小为 4,520 字节。假设数据包通过 MTU 为 2,500 字节的链路传输。那么就会变成两个片段:

在此处输入图片说明

请注意,片段保留了数据大小:2480 + 2020 = 4500。

请注意我们如何从数据大小中获取偏移量:

0.
0 + 2480/8 = 310.

假设这些片段到达一个 MTU 为 1,500 字节的链路。每个片段会变成两个片段:

在此处输入图片说明

请注意,片段保留了数据大小:1480 + 1000 = 2480,和 1480 + 540 = 2020。

同样在这种情况下,对于所有带有 1 的片段和到达的最后一个片段,更多片段位保持为 1,它照常工作,即 MF 位仅在最后一个中设置为 0。当然,标识字段在所有重新分片的片段中继续具有相同的值。这样,即使片段被重新分段,接收者也知道它们最初都是从同一个数据包开始的。

请注意我们如何从数据大小中获取偏移量:

0.
0 + 1480/8 = 185
185 + 1000/8 = 310
310 + 1480/8 = 495

我们可以使用最后一个偏移量和最后一个数据大小来计算总数据大小:495*8 + 540 = 3960 + 540 = 4500。

重新组装

如果至少满足以下条件之一,则接收器知道数据包是一个片段:

  • 设置了“更多片段”标志。(这对于除最后一个之外的所有片段都是正确的。)
  • “片段偏移”字段是非零的。(除第一个片段外,所有片段都是如此。)

接收器使用外部和本地互联网地址、协议 ID 和标识字段来识别匹配的片段。接收器将使用片段偏移量和更多片段标志从具有相同 ID 的片段重新组装数据。当接收器接收到最后一个片段(“更多片段”标志设置为 0)时,它可以通过将最后一个片段的偏移量乘以 8 并加上最后一个片段的数据大小来计算原始数据有效载荷的长度。在上面的例子中,这个计算是 495*8 + 540 = 4500 字节。

当接收器拥有所有片段时,它可以使用它们的偏移量将它们按正确的顺序排列。然后它可以将它们的数据向上传递堆栈以进行进一步处理。

至于保留位,是保留位,必须为零,没有特殊意义。

MRU 不太可能与 MTU 不同。如果需要对已经分片的数据包进行分片,路由器会像对待任何其他需要分片的 IP 数据包一样对待它。中间的路由器不会重新组装数据包。重新组装在目的地完成。路由器简单地将数据包分段并简单地调整偏移值。对于 IPID,我认为路由器不会改变它(这是我的猜测),因为目标主机是处理重组的主机。