(2)丢包概率的计算。其计算方法如式(2.1)、式(2.2)所示:
可见,丢包概率与平均队长有密切联系。
下面,我们给出RED算法中关键步骤的源代码。首先给出计算平均队长的代码:
double REDQueue::estimator(int nqueued, int m, double ave, double q_w)
{
double new_ave, old_ave;
new_ave = ave;
while (--m >= 1) {
new_ave *= 1.0 - q_w;
}
old_ave = new_ave;
new_ave *= 1.0 - q_w;
new_ave += q_w * nqueued;
double now = Scheduler::instance().clock();
if (now > edv_.lastset + edp_.interval)
updateMaxP(new_ave, now);
}
return new_ave;
}
接下来,我们给出计算丢包概率的源代码:
double REDQueue::calculate_p_new(double v_ave,double th_min, double th_max, double v_a,
double v_b,double max_p)
{
double p;
if ( v_ave>=th_min&&v_ave <=th_max) {
// p ranges from 0 to max_p as the average queue
// size ranges from th_min to th_max
p = v_a * v_ave + v_b;
p *= max_p;
}
if (p > 1.0)
p = 1.0;
return p;
}
2.2 RED算法分析
针对传统的DropTail丢尾算法的缺点,RED算法使用指数加权滑动平均法求解平均队长并均匀化分组丢弃概率,不仅使分组丢弃率和延迟达到最小,而且避免了全局同步以及对突发业务的偏见。由于Internet中含有很多突发数据,而在传统的丢尾算法中,突发性越高的流越容易造成缓冲队列溢出,使得突发性流被大量丢弃,这也被称为对突发业务的偏见[8]。然而,RED算法中当平均队长大于最大队长阈值时,分组被全部丢弃,这对稳定性有较大的影响。为此,我们对RED算法做出改进,使丢包概率更为平缓过渡,由此得到Gentle-RED算法。
2.3 Gentle-RED算法概述
由上文可知,在传统的RED算法中,当 时,丢包概率为1,为了降低不稳定性,我们引入变量 ,使得当 时,丢包概率不为1,而是依据式(2.3)计算[9]:
Gentle—RED的代码如下:
double REDQueue::calculate_p_new(double v_ave, double th_max, int gentle, double v_a,
double v_b, double v_c, double v_d, double max_p) NS2基于控制原理的网络拥塞控制设计(4):http://www.751com.cn/tongxin/lunwen_29471.html