Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1472269
  • 博文数量: 150
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 3415
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 10:30
个人简介

游戏后台开发

文章分类

全部博文(150)

文章存档

2020年(1)

2019年(4)

2017年(3)

2016年(6)

2015年(4)

2014年(45)

2013年(86)

2012年(1)

分类:

2014-02-19 23:18:19

原文地址:网络QoS原理与实现 [3] 作者:conghonglei


Traffic Management

流量管理整体上基于一个简单的模型,就是token bucket模型。一个token bucket,有固定的容量和流出速度,数据包不断地流入到bucket中,然后流出,因为bucket有固定的流出速度,当流入速度大于流出速度时,将会在bucket中buffer,当所buffer的数据超过bucket容量时,将会造成丢包;即使平均流入速度小于流出速度,当来个一个突然的burst造成bucket溢出时,也会丢包。流量管理整体上就是基于这个简单模型,根据配置的CoS参数,完成QoS。
另外,还可以从另一个角度来看token bucket。如下图所示:
每个输入的数据包都需要一个token来可以被转发,系统以恒定的速度r将定时向bucket中添加token,因此当输入packet的流量超过r,将必然造成一定时间后没有足够的token给后续的packet,从而丢包;同样当虽然平均速率小于r,但是突然一个很大的burst时,也会造成bucket中没有token的情况,也会丢包。因此一个最简单的token bucket有两个参数(r, b)。而一个再复杂一点的token bucket如下图所示:
上图中有两个token bucket,一个参数为(p, 1),另一个参数为(r, b),其中 p > r,而且两个token bucket是串联状态,利用这个token bucket可以完成peak速率为p,平均速率r,token bucket size为b的流量管理。
对这个token bucket就可以用下面的方法简单实现:

/* Get an input packet with packet length pkt_len */
current_deficit = current_deficit – r * (current_time – last_acc_time)
if (current_deficit > 0 && current_deficit + pkt_len > B) {
                make the pkt as non-conforming; return;
} else if (current_deficit < 0) {
                current_deficit = 0;
}
current_deficit += pkt_len
last_acc_time = current_time
make the packet as conforming;
return


另外还有一种将token bucket概念转变为时间概念进行流量管理的方法,叫做virtual scheduling,他根据当前允许的输出速率r算出完成一个pkt转发所应占用的时间,如果各个pkt间到达时间都大于其所应占用的时间则所有packet都是合法的,并且类似于token bucket,规定系统中能容忍提前占用的最大时间为L,因此系统参数为(r, L)。算法如下:

/* get an input packet at current_time, with size pkt_len */
If (expected_next_time > current_time + L) {
                make the pkt as non-conformed, return;
} else if (expected_next_time < current_time ) {
                Expected_next_time = current_time
}
Expected_next_time += pkt_len / r
Make the pkt as conformed
Return


通过上面简单的token bucket进行流量管理,我们可以判断一个新输入的packet是符合流量要求的,什么时候流量超标。

待续

阅读(1350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~