普通数据包是否曾经组合成巨型数据包?

网络工程 以太网
2022-02-12 13:34:11

路由器是否曾经将多个小帧组合成一个巨型帧,然后在另一端再次拆分它们?我知道大多数时候这样做是没有意义的,因为您会通过等待第二个数据包进来来增加延迟,但是如果您有 QOS 积压,这可能是有意义的。还是巨型帧总是端到端?

2个回答

我认为您的意思是第 2 层帧,而不是第 3 层数据包。

普通数据包是否曾经组合成巨型数据包?

不,没有巨型数据包之类的东西。在第 2 层有诸如巨型帧之类的东西。第 2 层的帧直接从 LAN 上的主机发送到主机。路由器剥离帧以转发数据包,并为数据包转发到的下一个网络创建新帧。

如果下一个网络的 MTU 小于数据包大小,则数据包可能会被路由器分段。然后将数据包片段作为单独的数据包进行路由,目标主机将重新组合数据包。路由器单独路由数据包,包括片段,而不考虑任何其他数据包。

路由器的主要工作是尽可能快地路由数据包,而分段和重组会占用大量路由器资源,这些资源最好用于路由数据包,这就是为什么标准是路由器根据需要对数据包进行分段以便能够传递它们,但目标主机是重组数据包片段的主机。

来自RFC 791,互联网协议

基本的互联网服务是面向数据报的,并在网关处提供数据报的分段,并在目标主机中的目标互联网协议模块处进行重组。当然,也允许在网络内或通过网络网关之间的私有协议对数据报进行分段和重组,因为这对互联网协议和更高级别的协议是透明的。这种透明类型的分片和重组被称为“网络相关”(或内联网)分片,这里不再进一步讨论。

IP 保留了链路上的两个路由器可以协调以在链路的每一端对数据包进行分段和重组的可能性,但这不是标准的一部分。

路由器是否曾经将多个小帧组合成一个巨型帧,然后在另一端再次拆分它们?我知道大多数时候这样做是没有意义的,因为您会通过等待第二个数据包进来来增加延迟,但是如果您有 QOS 积压,这可能是有意义的。

路由器从数据包中剥离帧,它们不路由帧,所以,不,它们不会合并帧。路由器路由作为帧有效负载的数据包。

路由器组合数据包的想法确实违反了 IP 标准。路由器真的不知道一个数据包只是一个数据包,还是一个更大的数据包组的一部分。路由器将每个数据包视为一个单独的数据包,并尝试尽可能快地转发它,甚至不知道可以与第一个数据包组合的另一个数据包即将到来。

我知道大多数时候这样做是没有意义的,因为您会通过等待第二个数据包进来来增加延迟,但是如果您有 QOS 积压,这可能是有意义的。

为 QoS backlog 这样做是没有意义的。出接口只能以额定的速度进行序列化,所以合并报文实际上并没有什么好处,而且更大的报文会独占接口更长的时间,这违背了QoS的前提,即公平性。QoS 实际上最适用于较小的数据包。

还是巨型帧总是端到端?

巨型帧实际上是端到端的,但帧仅存在于单个第 2 层 LAN 中,因为路由器在转发数据包(帧有效负载)之前会剥离帧。正如我之前解释的,帧没有被路由。帧(第 2 层)可以在 LAN 上桥接(交换),但它们无法通过路由器(第 3 层)。

在第 2 层,如果巨型帧命中无法使用巨型帧的网桥或主机的接口,则该帧将被丢弃为损坏或巨型帧。巨型帧通过的每个接口必须识别巨型帧。问题在于巨型帧没有标准。每个供应商都有自己的方式来做到这一点,即使在一个供应商内部,不同的设备也可能使用不同的巨型帧大小。有些交换机可以对某些接口使用一种尺寸,但对其他接口使用其他尺寸。您必须仔细规划 LAN 以使用巨型帧,并且您的主机也必须识别它们。

让我看看我是否正确理解了您的情况:

  • 在发送方 A 和接收方 B 之间的路径中某处存在路由器 R (即 R 不一定是来自 A 的第一跳路由器)
  • 此路由器看到从 A 发送到 B 的 IP 数据报的多个片段
  • 来自 R 的传出接口上存在拥塞(即“QoS 积压”),从而导致这些片段位于等待传输的队列中
  • R 上的传出接口能够处理巨型帧
  • R 上的实现检查队列中的数据包,意识到它们都是同一个 IP 数据报的片段,然后想“嘿,我为什么不重新组装这些数据包并将它们作为单个巨型帧发送出去?”

假设我对您的问题陈述的理解是正确的,让我们看看实现它需要什么。

假设出口接口上的队列在某个时刻看起来像这样:

  (out)           Queue                    Queue
<--------------   Head                     Tail

                  P1  P2  P3  P4  P5  P6 . . .

(1) 识别:路由器必须检查这些数据包,检查它们是 IPv4 还是 IPv6(带有分片扩展头),然后查看分片字段以识别可重组的分片。(并非所有数据包都是 IPv4 或 IPv6,实施时必须不理会这些数据包。)

(2)传输顺序:有可能P1、P2、P5是一个数据报的分片,而P3、P4和P6是不同数据报的分片。因此,实现必须首先重新组装和传输 (P1 + P2 + P5),然后是 (P3 + P4 + P6)。通常队列是先到先得的,但现在您必须从整个队列中“挑选”片段。

还要考虑如果 P5 不是数据报的最后一个片段会发生什么;所以你必须等到最后一个片段出现在队列中,但同时(P3 + P4 + P6)准备好重新组装和传输,你会传输它吗?

(3) 乱序片段:还请注意,P2 实际上可能是第一个片段,P1 可能是第二个片段,P5 可能是第三个片段。这是因为这些碎片在从 A 到 R 的旅程中可能采取了不同的路径。通常,终端主机会处理这种无序碎片的情况,但是如果路由器开始进行重组,这是他们必须注意的事情的以及。

(4) 校验和重新计算:重组后您必须注意的另一件事是校验和重新计算。请注意,在路由管道的早些时候,我们已经重新计算了一次校验和(在递减 TTL 之后),现在在输出排队阶段,我们必须在重新组装后再次执行此操作。

(5) 重新分段:您必须考虑的另一件事是重新分段:如果在上面的示例中,P1、P2 和 P3 的大小分别为 4000、4000 和 1500 字节,并且输出接口的 MTU 为 9000,您会离开单独三个片段还是将您重新分成两个大小为 9000 和 500 的数据包?

(6) 最后你必须考虑性能。所有上述处理都必须以线速完成,即在每次进入队列之后。对于支持甚至 10Gbps 线速性能的路由器,您可以计算出上述重组相关处理必须发生的速度。

总而言之,我想说这在原则上是可能的,但实际问题很多。并且收益并不能证明实现这一点所涉及的工程成本是合理的(阅读:如果您是买家,您愿意花多少钱购买可以重新组装的路由器而不是不能重新组装的路由器?)。话虽如此,如果一些聪明的最终用户应用程序设计人员可以通过使用支持重组的路由器来构建一个可以展示卓越性能的应用程序(以 $$ :-) 衡量),那么情况就不同了。