Linux的QoS实现.docVIP

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux网络流量控制实现 文档编号:00-6201-100 当前版本: 创建日期:2011-6-13 编写作者:ganjingwei Linux网络流量控制实现 摘要 Linux提供了一套丰富的流量控制功能。这篇文章介绍了各个内核代码的设计,描述了其结构,并通过描述一个新的排队规则来说明新元素的加入。 1 介绍 最近发行的Linux内核提供了很多类型的流量控制功能。流量控制的核心部分,以及一些用来控制它们的用户空间程序已被Alexey Kuznetsovkuznet@ms2.inr.ac.ru实现。这项工作的灵感来自于[1]中描述的概念,但它也包括支持IETF“集成服务”团队开发的架构所需机制[2],并且将作为支持更近期的“区分服务”的基础[3]。另见[4]中关于集成服务和区分服务如何相关的进一步细节。这篇文章介绍了底层架构,并描述如何增添新的流量控制功能到Linux内核。我们使用的内核版本是2.2.6。 图1大致说明了内核进程如何从网络接收数据,以及如何生成新的在网络上发送的数据:传入的数据包被检查,然后要么直接转发到网络(例如:在不同的接口,在机器充当路由或者网桥的时候),要么提交给协议栈中的更高层(例如:移交给像UDP或TCP这样的传输层协议)来进行进一步的处理。这些高层也可能产生他们自己的数据并把数据提交给低层,以完成诸如封装、路由以及最终的传输这样的任务。 “转发”包括输出接口的选择,下一跳路由的选择,封装等。这一切都完成了以后,数据包在各自的输出接口排队。这里便是流量控制工作的地方。流量控制可以在做其他事之前决定数据包要排队还是丢弃(例如:如果该队列已达到一定长度的限制,或者超过一定的流量限速),可以决定数据包的发送顺序(例如:给某些数据流优先级),可以延迟数据包的发送(例如:限制输出流量速率),等等。 一旦流量控制给出一个数据包准备发送,网卡驱动马上得到这个数据包并把它发到网络上。 第2部分至第4部分给出一个概述,并解释一些术语。第5部分至第8部分更详细地描述了Linux内核中流量控制的元素。第9部分描述了一个已被笔者实现的排队规则。 2 概述 Linux内核中的流量控制代码主要包括以下概念: 队列规则 类 (对应一种队列规则) 分离器 策略 图1:网络数据处理流程 每个网络设备都有一个与它关联的队列规则,以控制进入队列的数据包如何被操作。一个非常简单的队列规则可以只包含一个单一的队列,所有的数据包将存放在其中,并按照进队的顺序排序,设备尽自己的努力取出它们并发送。图2展示了一个没有外部可见的内部结构队列规则。 图2:一个不分类的队列规则 更复杂的队列规则可能会用分离器来区分不同类别的数据包并按照特定的方式处理每个类,例如:给一个类高于其他类的优先级。 图3展示了一个队列规则的例子。注意,多个分离器可以映射到同一个类。 队列规则和类是紧密联系的: 类和类的含义是队列规则的基本属性。相反地,分离器可以与队列规则和类任意组合,只要队列规则和类对应就行。但是灵活性还在——类一般不管如何保存它们这个类别的数据包,而是通过队列规则来做到这一点。可以通过设置可用的队列规则来任意选择这个队列规则,它很可能已经有类,反过来又包含队列规则,等等。 图4展示了这样一个堆栈的例子:首先,这里有一个含有两个延迟优先级的队列规则。被分离器挑选的数据包进入高优先级的类,其他包进入低优先级的类。只要高优先级队列中有数据包,就先发送高优先级的包(例如:sch_prio队列就是这样工作的)。为了防止低优先级的流量完全得不到发送,我们使用一个令牌桶过滤器(TBF),使得速率最高1Mbps。最后,低优先级队列的数据包通过先进先出队列规则来排队。注意,有更好的方法来做到我们这里做到的结果,例如:使用基于类的队列(CBQ)[5]。 数据包像这样进入队列:当一个队列规则的入队函数被调用,它运行一个又一个分离器直到其中一个表示匹配。然后它按照相应的类给这个包排序,一般是通过请求这个类“拥有”的队列规则的入队函数。不匹配任何分离器的数据包都被归到默认类中。 通常情况下每个类“拥有”一个队列,但是原则上也可能若干个类共用同一个队列,或者甚至一个队列被各自的队列规则的所有类使用。但是要注意,数据包不包含关于这个包属于哪个类的任何明确信息。如果“内部”队列被共享,当数据包出队的时候改变每个类的信息的队列规则(例如:CBQ)可能因此不能正确地工作,除非他们能重新被分类或者是通过其他方式在进队到出队的过程中跳过分类的结果。 通常,当数据包进队列的时候,符合的数据流能够被处理,例如:丢弃超过流速的数据包。 我们将不会再试图引进新的术语来区分算法,更不会有他们的实现,实例。而是在本文整个过程中使用队列规则,类,以及分离器这些术语。用来同时指代三个抽象级别。 3 源代码

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档