随机早期检测RED(Random Early Detection)算法--两个门限防抖动

RED算法其实很简单的,简单说就是防止网络拥塞 的,一般来讲它是端到端的TCP拥塞控制的补充,用于路由器的居多,因为端到端的拥塞控制仅仅负责一条虚电路,额外可以探测网络通路情况,但是却不能保证 每个端点的这种控制行为是一致的或者使能的,因此必须存在一种类似于监督机制的拥塞控制机制,在路由器上监督和管理一切数据包,而不能天真的相信TCP端 到端拥塞控制会做的很好,事实证明,它做的并不是很好。

路由器的QOS算法有很多,包括很多队列机制,这里由于不是重点就不说了,RED算法是与之相似但不同的一个,它旨在能预测到网络将要拥塞,而提前采取丢 包动作,而不是等到网络实际拥塞了以后再采取措施,这里的方式和操作系统的内存置换策略有点类似,因为在操作系统内核中也是需要提前预知内存将不足,而不 是到实际内存不足的时候再腾地方,这是一种以保障持续运行为目的的策略,RED算法也是,典型的实现就是设置一个经验性的阀值,一旦剩余内存低于这个阀值 (对于内存置换算法)或者网络包的总长度大于这个阀值(对于RED算法),那么就认为必须采取措施了,采取措施的结果就是统计值落入这些阀值之下,但是这 样好吗?虽然可以确保系统不会撑死,但是会引起系统剧烈抖动,以内存置换为例,剩余内存刚小于阀值的时候就被发现了,然后去置换内存页面,但是还没有置换 几个页面,剩余内存就大于阀值了,毕竟发现的早,剩余内存还没有到稀缺的地步,此时就停止了置换,在系统几乎满载的情况下,然后没过一会儿,剩余内存又小 于阀值了,如此反复...网络包的例子就不举了。

实际上,在应用中是用两个阀值而不是一个阀值进行管理的,两个阀值可以有效防止抖动的发生将震动从一个点扩展到了一个区间,一个阀值的算法会引起抖动是因 为数值的课徘徊路径太短,就是一个点,一个点只有左右两个自由度,太左了就要右一点,反之就要左一点,没有缓冲的余地,而两个阀值有效的拉长了数值的徘徊 区间,在此区间内数值是可以徘徊的,徘徊的过程是系统已经出问题但是还没有到解决问题的时候的意思,体现了一种积累的效果,同时也是一种懒惰的体现。下面 看一下RED算法:
Avq=0,Count=-1;
当有分组到达时:
[
If( 队列空)    
{
    =f(time-q_time); 
    Avq=(1-w)m Avq;
}
else         
    Avq<—(1-w) Avq+wq;
If(MINth<= Avq <=MAXth)   
{
    Count=Count+1;
        Pb=maxp((Avq- MINth)/( MAXth- MINth));
    Pa=Pb/ (1-Count*P);
}
else if(Avq>= MAXth)
丢弃分组
else
    Count=-1;
]
其中:
Avq:路由器队列平均长度;
q:当前队列长度。
Pa:当前分组被丢弃的概率;
Pb:计算中临时使用的概率。
m:路由器空闲期间可能发送的最小分组数;
time:当前时间。
q_time:队列空闲时间的开始;
f(t):时间t的一个线性函数;
Count:上次丢弃分组后收到的分组个数;             
maxp: Pb的最大值。
看 完了理论之后会发现,在队列长度介于两个阀值之间的时候,包被丢弃的概率和队列的长度成正比,也就可以引申得到,队列中的包中,流量越大的包越容易被丢 弃,这是不公平的,再想想,TCP的RTT和发送的频率一般成反比,但是RED算法的丢包率的计算根本不考虑连接属性,只管到达此接口的数据包,这样的 话,越是RTT小的连接其数据包越容易被丢弃,但是RTT小的链接一般都比较近,不会造成太大的拥堵。RED算法在linux中实现为 red_enqueue函数。

网络状况一个操作系统中的内存状况还有点不同,考虑一下堵车,一般而言,如果你发现了轻微的堵车,那么继续走下去的话,前方拥堵的可能性会很大,发现轻微 拥堵是狂堵的前兆的概率要比是狂堵刚结束的概率要大,因此对待两个阀值的策略不应该相同,下阀值代表拥堵的结束或者开始,而上阀值代表已经拥堵了,于是如 果队列长度首次超越了下阀值,那么就意味着需要加强管制了,目的尽量不要让队列长度达到上阀值,但是一旦到了上阀值,应该采取更加强硬的管制措施,因此从 下阀值到上阀值的管制措施将逐步加大,措施总是会起到效果的,如果一个警察在路口预测到了马上要拥堵,但是他采取措施了,比如限制了很多车辆通行,我敢肯 定这里马上就会疏通,那位警察不需要一直站在那里疏导交通。当队列长度达到下阀值,开始采取措施,隔了一段时间,发现队列长度一直在下阀值附近激烈震荡, 那么就说明管制过激了,于是就应该放松一下管制了,如果不放松的话,双阀值就会退化成单阀值了,放松之后,一旦发现队列长度到达上阀值了,那么重新强硬起 来,本质上就是通过判断在队列长度哪里震荡判断是管制措施是激进还是保守,通过这样发挥双阀值的作用,要点就是从下阀值到上阀值的管制措施逐步加大,丢包 概率与队列长度成正比体现和实现了这一点。以上是对于稳定的同一个网络而言的,不同的网络环境自然也不同,如果按照同一个策略生成丢包概率的话也会导致问 题,比如在两个阀值之间丢包的概率Da=f(length),那么在不同的网络环境下将会有不同的效果,比如有的环境运行很好,有的用f(length) 作为丢包概率则会导致队列长度一直在上阀值或者下阀值震荡,因此自适应机制同样也有利于RED算法适应不同的网络环境,比如发现队列长度在下阀值震荡,就 减少丢包概率计算的基数,反之在上阀值震荡,就增加该基数。

对于RED算法的改进有三种,分别为ARED,FRED,SRED,其中ARED就是上面说的意思;FRED区分了不同的流,这样会改进原始的RED导致 的不公平问题,对于FRED,如果一个流的流量很小,那么它会得到保护,同时大流量的流也会公平;SRED算法则是最有意思的,它保留了一个痕迹,一个过 往包的痕迹,该痕迹中包含着目的地址,源地址等信息,另外还有一个时间戳,然后再收到包的时候,会用刚收到的包和痕迹中的若干包进行命中,一旦命中就判断 出属于同一个流,如果多次命中就说明该流的流量太大了,如果没有命中,就用一个概率p来用新的包替换掉痕迹中的一个最老的包,(1-p)的概率维持原有的 痕迹,很有意思吧,我觉得很有趣。它和FRED的区别在于省去了很多的流归类判断操作,将这一切交给了这条已经过去的包留下的痕迹来做经验判断,节省了运 算开销,基于经验的判断来自于这样一个事实,如果一个包属于一个很流行的流,那么很快该流的包还会来,言外之意就是接收到的包很大的概率属于一个很流行的流。

你可能感兴趣的:(随机早期检测RED(Random Early Detection)算法--两个门限防抖动)