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←(1−wq)avg+wqq=avg+wq(q−avg)
只要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} m←s(time−q_time)
由以上avg公式,推导出空闲之后,平均队列长度avg计算如下:
a v g ← ( 1 − w q ) m a v g avg\leftarrow \left ( 1-w_{q} \right )^{m}avg avg←(1−wq)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} pb←C1avg−C2
其中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=maxth−minthmaxp
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=maxth−minthmaxpminth
参数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<1−count∗pbpb
如果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