路由器是否曾经将多个小帧组合成一个巨型帧,然后在另一端再次拆分它们?我知道大多数时候这样做是没有意义的,因为您会通过等待第二个数据包进入来增加延迟,但是如果您有 QOS 积压,这可能是有意义的。还是巨型帧总是结束?
普通数据包是否曾经组合成巨型数据包?
我认为您的意思是第 2 层帧,而不是第 3 层数据包。
普通数据包是否曾经组合成巨型数据包?
不。没有巨型数据包之类的东西。在第 2 层有诸如巨型帧之类的东西。第 2 层的帧直接从 LAN 上的主机发送到主机。路由器剥离帧以转发数据包,并为数据包转发到的下一个网络创建新帧。
如果下一个网络的 MTU 小于数据包大小,则数据包可能会被路由器分片。然后将数据包片段作为单独的数据包进行路由,目标主机将重新组合数据包。路由器单独路由数据包,包括片段,而不管任何其他数据包。
路由器的主要工作是尽可能快地路由数据包,分段和重组会占用相当多的路由器资源,这些资源更好地用于路由数据包,这就是为什么标准是路由器根据需要对数据包进行分段以便能够传送它们,但目标主机是重新组装数据包片段的主机。
基本的 Internet 服务是面向数据报的,并在网关处提供数据报的分段,在目标主机的目标 Internet 协议模块中进行重组。当然,也允许在网络内或通过网络网关之间的私有协议对数据报进行分段和重组,因为这对互联网协议和更高级别的协议是透明的。这种透明类型的分片和重组被称为“网络相关”(或内网)分片,这里不再进一步讨论。
IP 留下了链路上的两个路由器可以协调以在链路的每一端对数据包进行分段和重组的可能性,但这不是标准的一部分。
路由器是否曾经将多个小帧组合成一个巨型帧,然后在另一端再次拆分它们?我知道大多数时候这样做是没有意义的,因为您会通过等待第二个数据包进入来增加延迟,但是如果您有 QOS 积压,这可能是有意义的。
路由器从数据包中剥离帧,它们不路由帧,因此,不,它们不会组合帧。路由器路由作为帧有效载荷的数据包。
路由器组合数据包的想法确实违背了 IP 标准。路由器真的不知道一个数据包是否只是一个数据包,还是一个更大的数据包组的一部分。路由器将每个数据包视为一个单独的数据包,并尝试尽可能快地转发它,并且不知道可以与第一个合并的另一个数据包即将到来。
我知道大多数时候这样做是没有意义的,因为您会通过等待第二个数据包进入来增加延迟,但是如果您有 QOS 积压,这可能是有意义的。
为 QoS 积压做这件事是没有意义的。出接口只能以额定速度进行串行化,因此合并数据包实际上没有任何好处,并且更大的数据包会独占接口更长的时间,这违背了QoS的前提,即公平性。QoS 实际上最适用于较小的数据包。
还是巨型帧总是结束?
Jumbo 帧实际上是端到端的,但帧只存在于单个第 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) Refragmentation:另一件你必须考虑的事情是 Refragmentation:如果在上面的例子中 P1、P2 和 P3 的大小为 4000、4000 和 1500 字节,并且输出接口的 MTU 为 9000,你会离开单独三个片段还是你会重新整理成两个大小为 9000 和 500 的数据包?
(6) 最后你不得不考虑性能。所有上述处理都必须以线速完成,即在每次入队后。对于甚至支持 10Gbps 线速性能的路由器,您可以计算上述重组相关处理的速度。
总之,我会说这在原则上是可能的,但实际问题很多。并且好处并不能证明实现这一点所涉及的工程成本是合理的(阅读:如果您是买家,您愿意在可以重新组装的路由器与不能重新组装的路由器上花多少钱?)。话虽如此,如果一些聪明的最终用户应用程序设计人员可以通过使用支持重组的路由器构建一个可以展示卓越性能(以 $$ :-) 衡量的应用程序,那么情况就不一样了。