随机早期检测 (RED) 队列规则
RED 是最早的主动队列管理 (AQM) 算法之一。 RED 由 Sally Floyd 于 1993 年提出。 RED 有三个不同的名称;又名随机早期丢弃或随机早期丢弃和随机早期检测(因此有 3 种可能的 RED 完整形式)。 RED 的主要目标是:
- 避免拥塞:被动队列管理存在这个问题。 AQM 预先检测到拥塞并避免它。
- 避免全局同步问题:被动队列管理存在这个问题。 AQM 避免了这个问题。
- 避免锁定问题:当长期流一直占用路由器的缓冲区时,短期流会遭受锁定问题。 AQM 解决了这个问题,现在短期流可以在缓冲区中获得空间。
- 最大化“Power”函数,即吞吐量与延迟的比率: AQM 正确处理缓冲区队列,因此不会丢包,因此不会重传数据包。流程将是流畅的,延迟将是最小的。
注意:RED 是在 1993 年提出的,“Bufferbloat”一词是在 2011 年创造的。不过,AQM 解决了 bufferbloat 的问题。尽管如此,RED 被认为适合解决 Bufferbloat 的问题,因为它将“队列长度”控制在指定的阈值内。它永远不允许缓冲区完全填满。所以,自然地,它正在防止缓冲膨胀的问题。就像 TCP 一样,这个算法已经做了很多工作。文献中提出了几种 RED 变体:温和 RED、非线性 RED (NLRED)、自适应 RED (ARED) 等。
RED算法的工作:
RED 在“排队”时间运行。它在入队期间在输出端口工作,不要将其与路由器架构中的“输入端口”混淆。 RED 在“输出端口”上运行,但在“入队”期间! RED 在“每个数据包到达时”运行。因此,没有调用 RED 的周期性时间间隔。如果数据包以较低的速度到达,则以较低的速度调用 RED。如果数据包没有到达,则不调用 RED 算法。 RED 决定传入的数据包是否应该入队或丢弃。当一个新的数据包到达时,RED 做出决定;这个数据包应该入队还是丢弃?即使队列中有空间,它也会做出这个决定。它做出这个决定是因为如果将数据包加入队列会增加整体延迟或使队列满,那么它将导致发生拥塞。如果 RED 在队列满之前丢弃了数据包,那么发送方将间接知道它,它会减小它的拥塞窗口大小,从而避免将来发生拥塞。
RED 算法包含以下组件:
- 平均队列长度的计算。
- 丢弃概率的计算,数据包是否会被排队或丢弃取决于这个概率。
- 决策逻辑(帮助决定传入的数据包是否应该入队或丢弃)。
平均队列长度的计算:
在每个数据包到达时,RED 使用公式计算平均队列长度。 (1)。这种数学模型被称为“指数加权移动平均线”或 EWMA。
=> newavg = (1 – wq) x oldavg + wq x current_queue_len Eq. (1)
=> where, newavg = new average queue length being calculated in this sample
=> oldavg = old average queue length obtained during the previous sample
=> current_queue_len = ‘instantaneous’ queue length at the router
=> wq = weight associated with the ‘current_queue_len’. Default value: 0.002
后来,RED 的作者 Sally Floyd 使 wq 变量具有自适应性。它不再是硬编码的值。但是,这里因为我们讨论的是原始的 RED 算法,所以它的值取为 0.002。
掉落概率的计算
一旦计算出“newavg”,RED 使用以下逻辑来计算丢弃概率 (P d ),其中 min th表示“平均队列长度”的最小阈值,max th表示“平均队列长度”的最大阈值。 min th和 max th是在平均队列长度的上下文中,而不是瞬时队列长度。在我们进一步深入之前,这是一个重要的收获。
=> if (newavg ≤ minth) // default value of minth in the paper is 5 packets
=> enqueue the incoming packet // it means Pd= 0
=> else if (newavg > maxth) // default value of maxth in the paper is 15 packets
=> drop the incoming packet // it means Pd= 1
=> else Calculate Pd as shown in Eq. (2)
=> Pd= maxp x [(newavg – minth) ÷ (maxth – minth)] Eq. (2)
=> The slope of the linear function will depend on this maxp value.
=> where, maxp = maximum drop probability. Default: 0.5 (previously, it was 0.02)
当新的队列平均长度小于等于队列大小的最小阈值5时,则数据包的丢弃概率为0。0表示数据包不会被丢弃,但会入队。当新的队列平均长度大于队列大小的最大阈值15时,丢包概率为1。1表示丢包。现在是中间情况,当队列的新平均长度介于最小和最大阈值之间时,将使用公式 2 中给出的公式计算丢弃概率。
我们用 P d做什么,这是我们下一步要做的。
决策逻辑
一旦计算出“Pd”,RED 使用以下逻辑来决定传入数据包是否必须入队或丢弃:
=> if (Pd≤ R) enqueue the incoming packet
=> else drop the incoming packet
=> where, R = uniformly distributed random number generated between [0, 1]
注意:重要的是使用众所周知的随机数生成器来生成 R。如果随机数生成器的实现不正确,RED 的性能可能会受到影响。
左侧是“No drop”区域。如果平均队列长度小于等于最小阈值,则数据包将被排队。右侧部分是“全部删除”区域。如果平均队列长度大于最大阈值,则数据包将被丢弃。如果平均队列长度在最小和最大阈值之间,则将计算该数据包的丢弃概率。根据该值,将做出关于入队或丢弃的最终决定。
P d是否足以实现统一的随机下降模式?
当平均队列大小变得恒定时,“在”丢弃数据包之间到达的数据包数量成为具有 P d的几何随机变量。这意味着丢包不是均匀分布的,因为在两次丢包之间有时到达的数据包较多,有时到达的数据包较少。因此,提供了一个新的方程来计算丢弃概率(P a )。
=> Pa = Pd ÷ (1 – count x Pd) Eq. (3) where, count = number of packets enqueued since last drop
当没有数据包到达路由器时,“平均队列大小”会发生什么?
由于仅在数据包到达时调用 RED,因此即使队列实际上是“空的”,“平均队列大小”值也可能错误地指示严重拥塞。如果发生这种情况,即使队列完全为空,传入的数据包也可能会被丢弃。基本问题是当队列空闲时,“平均队列大小”的值不会“衰减”。
=> When a first packet arrives at an empty queue, the ‘newavg’ is calculated as shown in Eq. (4)
=> newavg = (1 – wq)m x oldavg Eq. (4) where, m = the number of packets that ‘might’ have
=> been transmitted by the router if it was not idle. m is calculated as shown in Eq. (5)
=> m = (idle_stop_time – idle_start_time) ÷ (average transmission time of a packet) Eq. (5)
=> where, average transmission time of a packet = mean packet size ÷ bandwidth
=> Note: packets can be of different sizes in the network!
RED算法的伪代码:
每个数据包到达时:
第 1 步:如果(队列为空)newavg = (1 – w q ) m x oldavg。
否则 newavg = (1 – w q ) x oldavg + w q x current_queue_len。
第 2 步:如果 (newavg ≤ month) 将传入数据包排入队列。
否则如果(newavg > max th )。
丢弃传入的数据包。
否则计算 P d和 P a。
第 3 步:如果 (P a ≤ R) 将传入数据包入队。
否则丢弃传入的数据包。
RED 中的可配置旋钮:
- wq
- 分钟
- 最大
- 最大p
- 平均数据包大小