📜  路由器中的数据包排队和丢弃

📅  最后修改于: 2022-05-13 01:56:18.621000             🧑  作者: Mango

路由器中的数据包排队和丢弃

路由器是必不可少的网络设备,可引导网络上的数据流。路由器有一个或多个输入输出接口,分别接收和发送数据包。由于路由器的内存是有限的,路由器可能会用尽空间来容纳新到达的数据包。如果数据包的到达速率大于数据包从路由器内存中退出的速率,则会发生这种情况。在这种情况下,新数据包被忽略旧数据包被丢弃。作为资源分配机制的一部分,路由器必须实施一些排队规则,以控制数据包在需要时如何缓冲或丢弃。

路由器排队

图 1:路由器入站和出站流量的描述

队列拥塞和队列规则

由于可用的缓冲内存有限,路由器队列容易受到拥塞的影响。当入口流量的速率变得大于可以在输出接口上转发的量时,就会观察到拥塞。造成这种情况的潜在原因主要包括:

  • 传入流量的速度超过传出流量的速度
  • 所有输入接口的总流量超过总输出容量
  • 路由器处理器无法处理转发表的大小以确定路由路径

为了在这种拥塞情况下管理路由器内存给数据包的分配,路由器可能会遵循不同的规则来确定保留哪些数据包以及丢弃哪些数据包。因此,我们在路由器中有以下重要的排队规则:

先进先出队列 (FIFO)

大多数路由器遵循的默认排队方案是 FIFO。这通常几乎不需要在服务器上进行任何配置。 FIFO 中的所有数据包都按照它们到达路由器的顺序进行服务。当内存达到饱和时,尝试进入路由器的新数据包将被丢弃(尾部丢弃)。然而,这种方案不适合实时应用,尤其是在拥塞期间。诸如 VoIP 等不断发送数据包的实时应用程序在拥塞期间可能会被饿死并丢弃所有数据包。

优先排队 (PQ)

在优先级队列中,路由器不是使用单个队列,而是根据某种优先级度量将内存分成多个队列。在此之后,每个队列都以先进先出的方式处理,同时一个接一个地循环通过队列。队列根据优先级标记为HighMediumLow 。来自高队列的数据包总是在来自中队列的数据包之前处理。同样,Medium 队列中的数据包总是在 Normal 队列中的数据包之前处理,等等。只要高优先级队列中存在一些数据包,其他队列的数据包不会被处理。因此,高优先级数据包切到线路的最前面并首先得到服务。一旦较高优先级的队列被清空,只有较低优先级的队列才会被服务。

优先排队子队列

图 2:优先排队方案中使用的多个子队列

PQ 的明显优势是总是首先处理更高优先级的流量。然而,PQ 方案的一个显着缺点是较低优先级的队列通常可以接收
由于饥饿,根本没有服务。源源不断的高优先级流量会使低优先级队列饿死

加权公平排队 (WFQ)

加权公平队列 (WFQ) 根据流量动态创建队列,并根据优先级为这些流量分配带宽。子队列被动态分配带宽。假设存在 3 个队列,当它们都处于活动状态时,它们的带宽百分比分别为 20%、30% 和 50%。然后,如果 20% 的队列空闲,则在剩余队列之间分配释放的带宽,同时保持原始带宽比率。因此,现在为 30% 的队列分配了 (75/2)% 的带宽,而现在为 50% 的队列分配了 (125/2)% 的带宽。

根据数据包中的各种头域来区分和识别流量流,例如:

  • 源和目标 IP 地址
  • 源和目标 TCP(或 UDP)端口
  • IP 协议号
  • 服务类型值(IP 优先级或 DSCP)

加权公平排队

图 3: WFQ 中为子队列动态分配的带宽

因此,数据包根据与它们对应的流量被分成不同的队列。一旦被识别,属于同一流量的数据包就会被插入到一个队列中,该队列是专门为此类流量创建的。默认情况下,路由器内最多可以建立 256 个队列,但是,这个数字可能会增加到 4096 个队列。与 PQ 方案不同,WFQ 队列根据其队列优先级分配不同的带宽。具有较高优先级的数据包在同时到达的较低优先级数据包之前被调度。

排队规则对网络的影响

排队规则的选择会影响网络在丢包数量、延迟等方面的性能。在分析选择不同方案的效果时,我们观察到对各种参数的显着影响。

丢包分析

图 4:不同排队规则下丢弃的数据包数量与时间的关系(在 Riverbed Modeler 上运行的仿真)

测量三种方案在网络中的整体丢包率,得出以下结果:

  • 在所有机制中,一开始都没有丢包,直到某个点。这是因为路由器缓冲存储器被填满需要有限的时间。由于数据包丢失仅在缓冲区满后发生,因此在缓冲区容量尚未达到时没有数据包丢失的初始时间段
  • 在 FIFO 方案中,丢包在 PQ 之后但在 WFQ 之前开始。更突出的是,在 FIFO 的情况下,被丢弃的数据包数量最多。这是因为一旦拥塞,来自所有应用程序的所有传入流量都会毫无区别地被完全丢弃
  • 在 PQ 方案中,丢包最早开始。由于 PQ 根据优先级划分队列,因此各个队列的总体大小被划分。假设将内存简单地划分为“重要”队列和“不太重要”队列,则队列大小减半。因此,被定向到子队列的数据包将导致队列更早被填满(因为容量较小),因此数据包丢弃将更早开始