1 / 13
文档名称:

LinuxQoS实现简介样本.docx

格式:docx   大小:47KB   页数:13页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

LinuxQoS实现简介样本.docx

上传人:业精于勤 2020/10/29 文件大小:47 KB

下载得到文件列表

LinuxQoS实现简介样本.docx

相关文档

文档介绍

文档介绍:LinuxQoS实现介绍摘要:QoS是目前一个很热门话题,几乎全部高端网络设备全部支持QoS功效,而且这个功效也是目前网络设备之间竞争一个关键技术。Linux为了在在高端服务器能够占有一席之地,。。而且分析了Linux内核缺省队列处理方法PFIFO实现。,就实现了对服务质量支持模块。/sched/目录。在Linux里面,ontrol,简称TC。首先我们了解一下Linux网络协议栈在没有TC模块时发送数据包大致步骤。图1。注:上图分层是根据Linux实现来画,并没有严格遵守OSI分层从上图能够看出,没有TC情况下,每个数据包发送全部会调用dev_queue_xmit,然后判定是否需要向AF_PACKET协议支持体传输数据包内容,最终直接调用网卡驱动注册发送函数把数据包发送出去。发送数据包机制就是本文开始讲到FIFO机制。一旦出现拥塞,协议栈只是尽自己最大努力去调用网卡发送函数。所以这种传统处理方法存在着很大弊端。为了支持QoS,Linux设计者在发送数据包代码中加入了TC模块。从而能够对数据包进行分类,管理,检测拥塞和处理拥塞。为了避免和以前代码冲突,而且让用户能够选择是否使用TC。内核开发者在上图中两个红色圆圈之间添加了TC模块。(实际上在TC模块中,发送数据包也实现对AF_PACKET协议支持,本文为了描述方便,把两个地方AF_PACKET协议处理分开来了)。/core/: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){………….dev_nit)dev_queue_xmit_nit(skb,dev);/*对AF_PACKET协议支持*/if(dev->hard_start_xmit(skb,dev)==0){/*调用网卡驱动发送函数发送数据包*/return0;}}………………}从上面代码中能够看出,当q->enqueue为假时候,就不采取TC处理,而是直接发送这个数据包。假如为真,则对这个数据包进行QoS处理。TC具体设计和实现第一节描述了linux内核是怎样对QoS进行支持,和是怎样在以前代码基础上添加了tc模块。本节将对TC设计和实现进行具体描述。QoS有很多拥塞处理机制,如FIFOQueueing(先入先出队列),PQ(优先队列),CQ(定制队列),WFQ(加权公平队列)等等。QoS还要求能够对每个接口分别采取不一样拥塞处理。为了能够实现上述功效,Linux采取了基于对象实现方法。上图是一个数据发送队列管理机制模型图。其中QoS策略能够是多种不一样拥塞处理机制。我们能够把这一个策略看成是一个类,策略类。在实现中,这个类有很多实例对象,策略对象。使用者能够分别采取不一样对象来管理数据包。策略类有很多方法。如入队列(enqueue),出队列(dequeue),重新入队列(requeue),初始化(init),撤销(destroy)等方法。在Linux中,用Qdisc_ops结构体来代表上面描述策略类。前面提到,每个设备能够采取不一样策略对象。所以在设备和对象之间需要有一个桥梁,使设备和设备采取对象相关。在Linux中,起到桥梁作用是Qdisc结构体。经过上面描述,整个TC架构也就出来了。以下图:加上TC以后,发送数据包步骤应该是这么:(1)上层协议开始发送数据包(2)取得目前设备所采取策略对象(3)调用此对象enqueue方法把数据包压入队列(4)调用此对象dequeue方法从队列中取出数据包(5)调用网卡驱动发送函数发送接下来从代码上来分析TC是怎样对每个设备安装策略对象。在网卡注册时候,device,给设备安装一个Qdisc和Qdisc_ops。device(_device*dev){………………….dev_init_scheduler(dev);………………….}voiddev_init_scheduler(_device*dev){…………./*安装设备qdisc为noop_qdisc*/dev->qdisc=&noop_qdisc;………….dev->qdisc_sleeping=&noop_qdisc;dev_watchdog_init(dev);}此时,网卡设备刚注册,还没有