RED队列算法 - 实现

RED算法的大部分工作都可以与报文的转发处理并行进行,两个主要算法包括平均队列长度avg和报文标记概率pb计算,也可以按照低优先级任务执行,因此,RED完全可使用在高速网络中。

如果RED标记报文的方式不是丢弃报文,而是设置报文头部中的拥塞标志位(ECN方式),后者将影响报文的转发。但是,因为RED的随机算法被设计用来标记尽量少的报文,从而对转发的影响并不大。

对于每个接收到的报文,RED计算平均队列长度avg,如下实现:

a v g ← ( 1 − w q ) a v g + w q q = a v g + w q ( q − a v g ) avg \leftarrow \left ( 1-w_{q} \right )avg+w_{q}q = avg + w_{q}\left ( q-avg \right ) avg(1wq)avg+wqq=avg+wq(qavg)

只要wq选择为一个2的负值幂,以上计算可通过移位和两个相加操作实现。

由于RED在报文到达时计算平均队列长度avg,而不是依据固定的时间间隔进行计算。当一个报文到达时,如果队列为空,RED计算一个m值,其等于在空闲阶段(队列为空)可发送的报文数量。RED假设m个报文到达一个空队列(以上公式中的q为零),以此计算平均队列长度avg,如下m值的估算:

m ← ( t i m e − q _ t i m e ) s m\leftarrow \frac{\left ( time-q\_time \right )}{s} ms(timeq_time)

由以上avg公式,推导出空闲之后,平均队列长度avg计算如下:

a v g ← ( 1 − w q ) m a v g avg\leftarrow \left ( 1-w_{q} \right )^{m}avg avg(1wq)mavg

其中,q_time表示队列空间的开始时间,s表示一个小报文的典型传输时长。

当一个报文到达时,如果平均队列长度avg超过了最大阈值maxth,到达的报文都将被标记,此时不需要重新计算报文的标记概率。当报文到达时,如果平均队列长度avg位于最小阈值minth和最大阈值maxth之间时,初始的报文标记概率pb计算如下:

p b ← C 1 a v g − C 2 p_{b}\leftarrow C_{1}avg - C_{2} pbC1avgC2

其中C1的值如下:

C 1 = m a x p m a x t h − m i n t h C_{1}=\frac{max_{p}}{max_{th}-min_{th}} C1=maxthminthmaxp

C2的值如下:

C 2 = m a x p m i n t h m a x t h − m i n t h C_{2}=\frac{max_{p}min_{th}}{max_{th}-min_{th}} C2=maxthminthmaxpminth

参数maxp,maxth和minth都是提前设置的固定值,其中maxth和minth的值根据预期的平均队列长度来确定。maxp值的选择,倾向于能够让计算而得的C1为2的幂值,这样在计算pb时,可通过移位和加法来实现。

当minth<=avg<=maxth时,在报文到达时,计算一个伪随机值R=RANDOM[0,1],其中R在[0,1]之间成均匀分布。如果满足以下条件,将到达的报文进行标记:

R < p b 1 − c o u n t ∗ p b R< \frac{p_{b}}{1-count*p_{b}} R<1countpbpb

如果pb的值为2的负值幂,以上的公式将容易计算。

随机数的实现,可不在每个报文达到时进行,即仅在报文被标记的情况出现之后,更换随机数。当平均队列长度恒定时,在两个被标记的报文之间,接收到的报文数量成均匀分布:{1,2,…,1/pb},这样,在某个报文被标记之后,RED可简单的选择一个R值,如果n>=R/pb,标记第n个报文。但是,由于平均队列长度avg是不断变化的(pb随之改变),所以在每次pb变化之后,需要重新计算R/pb的值。以下为RED算法的伪代码:

Initialization:
    avg <- 0
    count <- -1
for each packet arrival:
    calculate the new average queue size _avg_:
        if the queue is nonempty
            avg <- avg + wq(q - avg)
        else using a table lookup:
            avg <- (1 - wq) ** ((time-q_time)/s) * avg 
    if minth <= avg < maxth
        increment _count_
        pb <- C1*avg - C2
    if count > 0 and count >= Aprox[R/pb]
        mark the arriving packet
        count <= 0
    if count = 0 (choosing random number)
        R <- Random[0, 1]
    else if maxth <= avg
        mark the arriving packet
        count <- -1
    else
        count <- -1
when queue becomes empty
    q_time <- time

New variables:
    R: a random number
New fixed parameters:
    s: typical transmission time
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页