欢迎来到天天文库
浏览记录
ID:40489657
大小:56.12 KB
页数:10页
时间:2019-08-03
《Linux QoS 实现简介》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、文档名称文档密级LinuxQoS实现简介摘要:QoS是当前一个非常热门的话题,几乎所有高端的网络设备都支持QoS功能,并且这个功能也是当前网络设备之间竞争的一个关键技术。Linux为了在在高端服务器能够占有一席之地,从2.2.x内核开始就支持了QoS。本文在linux2.4.0的代码基础上对Linux如何支持QoS进行了分析。并且分析了Linux内核的缺省队列处理方法PFIFO的实现。1.1Linux内核对QoS的支持Linux内核网络协议栈从2.2.x开始,就实现了对服务质量的支持模块。具体的代码位于net/sched/目
2、录。在Linux里面,对这个功能模块的称呼是TrafficControl,简称TC。首先我们了解一下Linux网络协议栈在没有TC模块时发送数据包的大致流程。如图1。注:上图的分层是按照Linux实现来画,并没有严格遵守OSI分层从上图可以看出,没有TC的情况下,每个数据包的发送都会调用dev_queue_xmit,然后判断是否需要向AF_PACKET协议支持体传递数据包内容,最后直接调用网卡驱动注册的发送函数把数据包发送出去。发送数据包的机制就是本文开始讲到的FIFO机制。一旦出现拥塞,协议栈只是尽自己最大的努力去调用网卡
3、发送函数。所以这种传统的处理方法存在2007-04-27H3C机密,未经许可不得扩散第10页,共10页文档名称文档密级着很大的弊端。为了支持QoS,Linux的设计者在发送数据包的代码中加入了TC模块。从而可以对数据包进行分类,管理,检测拥塞和处理拥塞。为了避免和以前的代码冲突,并且让用户可以选择是否使用TC。内核开发者在上图中的两个红色圆圈之间添加了TC模块。(实际上在TC模块中,发送数据包也实现对AF_PACKET协议的支持,本文为了描述方便,把两个地方的AF_PACKET协议处理分开来了)。下面从具体的代码中分析一下对
4、TC模块的支持。net/core/dev.c:dev_queue_xmit函数中略了部分代码:intdev_queue_xmit(structsk_buff*skb){……………….q=dev->qdisc;if(q->enqueue){/*如果这个设备启动了TC,那么把数据包压入队列*/intret=q->enqueue(skb,q);/*启动这个设备发送*/qdisc_run(dev);return;}if(dev->flags&IFF_UP){………….if(netdev_nit)dev_queue_xmit_nit(
5、skb,dev);/*对AF_PACKET协议的支持*/if(dev->hard_start_xmit(skb,dev)==0){/*调用网卡驱动发送函数发送数据包*/return0;}}………………}从上面的代码中可以看出,当q->enqueue为假的时候,就不采用TC处理,而是直接发送这个数据包。如果为真,则对这个数据包进行QoS处理。1.1TC的具体设计与实现第一节描述了linux内核是如何对QoS进行支持的,以及是如何在以前的代码基础上添加了tc模块。本节将对TC的设计和实现进行详细的描述。2007-04-27H3C
6、机密,未经许可不得扩散第10页,共10页文档名称文档密级QoS有很多的拥塞处理机制,如FIFOQueueing(先入先出队列),PQ(优先队列),CQ(定制队列),WFQ(加权公平队列)等等。QoS还要求能够对每个接口分别采用不同的拥塞处理。为了能够实现上述功能,Linux采用了基于对象的实现方法。上图是一个数据发送队列管理机制的模型图。其中的QoS策略可以是各种不同的拥塞处理机制。我们可以把这一种策略看成是一个类,策略类。在实现中,这个类有很多的实例对象,策略对象。使用者可以分别采用不同的对象来管理数据包。策略类有很多的方
7、法。如入队列(enqueue),出队列(dequeue),重新入队列(requeue),初始化(init),撤销(destroy)等方法。在Linux中,用Qdisc_ops结构体来代表上面描述的策略类。前面提到,每个设备可以采用不同的策略对象。所以在设备和对象之间需要有一个桥梁,使设备和设备采用的对象相关。在Linux中,起到桥梁作用的是Qdisc结构体。通过上面的描述,整个TC的架构也就出来了。如下图:2007-04-27H3C机密,未经许可不得扩散第10页,共10页文档名称文档密级加上TC之后,发送数据包的流程应该是这
8、样的:(1)上层协议开始发送数据包(2)获得当前设备所采用的策略对象(3)调用此对象的enqueue方法把数据包压入队列(4)调用此对象的dequeue方法从队列中取出数据包(5)调用网卡驱动的发送函数发送接下来从代码上来分析TC是如何对每个设备安装策略对象的。在网卡注册的时候,都会调用r
此文档下载收益归作者所有