拥塞避免
拥塞避免是指通过监视网络资源(如队列或内存缓冲区)的使用情况,在拥塞有加剧的趋势时,主动丢弃报文,通过调整网络的流量来解除网络过载的一种流控机制。
华为路由器支持两种丢弃策略:
- 尾丢弃
- WRED(Weighted Random Early Detection)
尾丢弃
拥塞避免传统的处理方法是尾丢弃(Tail Drop),当网络发生拥塞时,所有新到来的报文都被丢弃。
这种丢弃策略会引发TCP全局同步现象——对于TCP报文,如果大量的报文被丢弃,将造成TCP超时,从而引发TCP慢启动,使得TCP减少报文的发送。当队列同时丢弃多个TCP连接的报文时,将造成多个TCP连接同时进入拥塞避免和慢启动状态以降低并调整流量,称之为“TCP全局同步”。这样多个TCP连接发往队列的报文将同时减少,而后又会在某个时间同时出现流量高峰,如此反复,使网络资源利用率低。
WRED
加权随机早期检测WRED(Weighted Random Early Detection)是在队列拥塞前进行报文丢弃的一种拥塞避免机制。WRED通过随机丢弃报文避免了TCP的全局同步现象——当某个TCP连接的报文被丢弃,开始减速发送的时候,其他的TCP连接仍然有较高的发送速度。这样,无论何时总有TCP连接在进行较快的发送,提高了线路带宽的利用率。
WRED为每个队列都设定一对低门限和高门限值,并规定:
- 当队列长度小于低限时,不丢弃报文,丢弃概率为0%。
- 当队列长度超过高限时,丢弃所有新到来的报文,即进行尾丢弃,丢弃概率为100%。
- 当队列长度在低限和高限之间时,开始随机丢弃新到来的报文,且设定了一个最大丢弃概率,队列越长,丢弃概率越大。如果以报文长度为横坐标,丢弃概率为纵坐标,则丢弃概率曲线如图8-13。
WRED详细实现过程如图8-14,WRED为每个到来的报文赋予一随机数i(0<i%<=100%),并用该随机数与当前队列的丢弃概率比较,小于丢弃概率则新到的报文被丢弃。假设最大丢弃概率为a%,当前队列长度为m,对应的丢弃概率为x%,如果随机数0<i<=x,则丢弃新到的报文;如果随机数x<i<=100%,则不丢弃新到的报文。
如图8-15,假设队列长度为m(低门限<m<高门限)时丢弃概率为x%,则当随机数落入区间[0,x]时新到的报文被丢弃;长度为n(m<n<高门限)时丢弃概率为y%,则当随机数落入区间[0,y]时报文被丢弃。区间[0,y]比[0,x]的范围大,随机数落入区间[0,y]比落入区间[0,x]的可能性大,因此,队列越长,新到的报文被丢弃的可能性越高。
假设有两个队列Q1和Q2,对应的最大丢弃概率分别为a%和b%,则两个队列的丢弃概率曲线图如图8-16。假设当队列长度为m时,Q1的丢弃概率为x%,Q2的丢弃概率为y%,则当随机数落入区间[0,x]时Q1新到的报文被丢弃;当随机数落入区间[0,y]时Q2新到的报文被丢弃。区间[0,y]比[0,x]的范围大,随机数落入区间[0,y]比落入区间[0,x]的可能性大,因此,相同队列长度时,最大丢弃概率配置得越大,丢弃可能性越高。
华为路由器支持为每个流队列FQ和每个类队列CQ配置WRED丢弃策略,且WRED区分三种丢弃优先级(对应红、黄、绿三种报文颜色),允许用户对每种丢弃优先级设定高低门限百分比和丢弃概率,因此WRED可以对各种业务流以及同一业务流内部不同的丢弃级别报文进行不同概率的丢弃。
丢弃策略的选择
对于实时性要求比较高的业务一般使用的是尾丢弃。因为这种报文要提供最大限度的带宽保证。采用尾丢弃是只有当报文队列达到最大长度时才会丢弃,由于使用PQ调度,抢占其他业务的带宽,所以当发生拥塞时,实时性的业务带宽能够得到最大的保证。
对于WFQ队列,一般采用WRED。由于WFQ队列是按权重分享带宽,容易发生拥塞,采用WRED策略有效的避免了TCP全局同步现象。
WRED高低门限及丢弃概率的设置
实际应用时,WRED低门限百分比建议从50%开始取值,根据不同颜色的丢弃优先级逐级调整。一般推荐绿色报文设置的丢弃概率比较小,高、低门限值比较大;黄色报文次之;红色报文设置的丢弃概率最大,高、低门限值最小,如图8-17。这样,在网络趋近拥塞时,红色报文由于设置的低门限值比较小,丢弃概率比较大,红色报文最先开始被丢弃;随着队列的长度逐渐增长,最后才开始丢弃绿色报文。如果队列长度达到相应颜色的最大门限,这种颜色的报文开始作尾丢弃。
WRED队列最大长度的设置
华为路由器允许在配置WRED时修改队列最大长度。“队列及拥塞管理”中介绍过,当网络拥塞时,报文在缓存中产生堆积,被延迟处理,延迟时间的大小主要取决于队列的缓存长度以及该队列获得的输出带宽。因此,在队列输出带宽一定的情况下,队列越短,时延越小;队列越长,时延越大。
队列不能设置过短。如果某队列过短,缓存空间过小,容易造成丢包,流量即使速率不大也容纳不下。队列越短,容忍的突发量越小。队列越大,容忍的突发量越大。
队列也不能设置过长。如果队列太长,时延过大。尤其对于TCP应用,通信两端会预测网络拥塞情况,在发送完一个报文后,启动超时定期器等待对方应答,如果在定时器超时前没有等到应答,发送方会重发报文。如果报文在网络中被缓存的时间过长,不丢弃与丢弃没有区别。
推荐高优先级队列(CS7、CS6、EF)的长度设置为10ms * 队列输出带宽;低优先级队列的长度设置为100ms * 队列输出带宽。