流量控制的相关算法与数据结构——Round Robin轮流服务,Weighted Fair Quequing(WFQ)加权公平队列与Leaky Bucket 漏桶限流

  Round Robin轮流服务,Weighted Fair Quequing(WFQ)加权公平队列与Leaky Bucket 漏桶限流是几种应用在路由调度网络资源和保障网络服务质量(QOS)时应用的算法及相关数据结构。

Round Robin轮流服务

  我们先从Round Robin轮流服务开始。轮流服务就是将需要路由发送的资源进行分类,为每种类别生成自有的一个队列,发送时轮流从队列中选取队首的文件包进行发送。如果轮到某个队列时,该队列为空,则跳过该队列。

  这样的服务能保障在各不同类型的网络服务中合理分配资源,不会让某一网络服务占用过大的带宽以至于影响其他的网络服务。比如某个下载程序占用过多网速,致使视频浏览出现卡顿或打开网页速度过慢。

 

(上图中的轮次里,等待队列Q1,Q2,Q3,Q5各有一个文件包被发送,Q4因为队列为空,本轮次被跳过)

 

Weighted Fair Quequing(WFQ)加权公平队列

  WFQ是基于Round Robin方法改进后而成的。对于某些网络服务,如网络电话或视频直播,为了保障能流畅进行,总是需要保留一定的优先带宽。这样情况下就可以使用Round Robin轮流服务的升级版本Weighted Fair Quequing(WFQ)加权公平队列。其中的思想很简单,轮流服务中已经有了各个公平队列,需要做的就是对一些带宽敏感型服务进行标记并附以相应权重wi,服务时进行侧重就可以。

  WFQ在发送时仍然轮流从队列中选取队首文件包,但选取的数量根据权重wi确定,权重大的服务在一次发送循环中就能多发送文件包,从而确保相应的服务带宽,保证网络的服务质量。

 

(上图中的轮次里,等待队列Q1发送1个包,Q2发送2个包,Q3发送3个包,虽然w4=2,但因为队列不满,Q4只发送1个包,Q5发送1个包)

 

Leaky Bucket 漏桶限流

  而有的时候,我们不仅想要为特定服务保留带宽,同时也想限制一些服务所能占用的带宽。比如限制某种程序上传或下载的最大速度。这时候我们可以使用Leaky Bucket 漏桶限流。

  这个模型就是某项服务的文件在进入等待队列之前,先装到一个桶(可以看作一个buffer)中,超过桶容量的文件则会被丢弃。每隔一段时间桶会漏(取)出一定数量的文件放入等待队列排队发送。这就能限制一定时间内能进入队列的最大文件包数量(相当于控制了传输的average rate),也能保障一次最大进入等待队列的文件数量不超过桶的容量(控制了传输的peak rate)。

 

  Leaky Bucket 在实现时有一个变种,又被成为令牌(token)桶。和普通漏桶的区别在于,桶中存放的不再时文件包,而是token发送令牌。发送令牌按一定频率生成后进入桶中存放,超过桶容量的令牌也会被丢弃。当某个网络有文件包需要进入相应等待队列时,就检查桶中是否有令牌,有的话则取出令牌,并放置相应数量文件包进入等待队列。没有令牌的话则进行等待(可以存放在另一层buffer中,也可以直接丢弃)。

  令牌桶相比普通漏桶的优点在于限流方式更加灵活:令牌桶中可以有一定量的令牌库存,故而可以容许在一段时间内短时传送较大量的文件(控制burst rate)。而普通漏桶只能控制peak rate和average rate。(普通漏桶在一定程度上相当于桶容量为1的令牌桶)

 

posted @ 2021-09-14 23:04  三十好几,从头学起  阅读(803)  评论(0编辑  收藏  举报