Linux流量控制中的HTB队列创建与过滤
众所周知,在互联网诞生之初都是各个高校和科研机构相互通讯,并没有Linux流量控制方面的考虑和设计,IP协议的原则是尽可能好地为所有数据流服务,不同的数据流之间是平等的.然而多年的实践表明,这种原则并不是最理想的,有些数据流应该得到特别的照顾, 比如,远程登录的交互数据流应该比数据下载有更高的优先级. 针对不同的数据流采取不同的策略,这种可能性是存在的.并且,随着研究的发展和深入, 人们已经提出了各种不同的管理模式.IETF已经发布了几个标准, 如综合服务(Integrated Services)、区分服务(Diferentiated Services)等.其实,Linux内核从2 2开始,就已经实现了相关的流量控制功能.本文将介绍Linux中有关流量控制的相关概念, 用于Linux流量控制的工具TC的使用方法,并给出几个有代表性实例. 一、相关概念 由此可以看出, 报文分组从输入网卡(入口)接收进来,经过路由的查找, 以确定是发给本机的,还是需要转发的.如果是发给本机的,就直接向上递交给上层的协议,比如TCP,如果是转发的, 则会从输出网卡(出口)发出.网络流量控制通常发生在输出网卡处.虽然在路由器的入口处也可以进行流量控制,Linux也具有相关的功能, 但一般说来, 我们无法控制自己网络之外的设备, 入口处的Linux流量控制相对较难.本文将集中介绍出口处的流量控制.流量控制的一个基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系, 每当内核需要将报文分组从网卡发送出去, 都会将该报文分组添加到该网卡所配置的队列中, 由该队列决定报文分组的发送顺序.因此可以说,所有的Linux流量控制都发生在队列中,详细流程图见图1.
有些队列的功能是非常简单的, 它们对报文分组实行先来先走的策略.有些队列则功能复杂,会将不同的报文分组进行排队、分类,并根据不同的原则, 以不同的顺序发送队列中的报文分组.为实现这样的功能,这些复杂的队列需要使用不同的过滤器(Filter)来把报文分组分成不同的类别(Class).这里把这些复杂的队列称为可分类(ClassfuI)的队列.通常, 要实现功能强大的Linux流量控制, 可分类的队列是必不可少的.因此,类别(class)和过滤器(Filter)也是流量控制的另外两个重要的基本概念.图2所示的是一个可分类队列的例子.
由图2可以看出,类别(CIass)和过滤器(Filter)都是队列的内部结构, 并且可分类的队列可以包含多个类别,同时,一个类别又可以进一步包含有子队列,或者子类别.所有进入该类别的报文分组可以依据不同的原则放入不同的子队列或子类别中,以此类推.而过滤器(Filter)是队列用来对数据报文进行分类的工具, 它决定一个数据报文将被分配到哪个类别中. 二、使用TC 在Linux中,Linux流量控制都是通过TC这个工具来完成的.通常, 要对网卡进行流量控制的配置,需要进行如下的步骤: ◆ 为网卡配置一个队列; ◆ 在该队列上建立分类; ◆ 根据需要建立子队列和子分类; ◆ 为每个分类建立过滤器. 在Linux中,可以配置很多类型的队列,比如CBQ、HTB等,其中CBQ 比较复杂,不容易理解.HTB(HierarchicaIToken Bucket)是一个可分类的队列, 与其他复杂的队列类型相比,HTB具有功能强大、配置简单及容易上手等优点.在TC 中, 使用"major:minor"这样的句柄来标识队列和类别,其中major和minor都是数字. 对于队列来说,minor总是为0,即"major:0"这样的形式,也可以简写为"major: 比如,队列1:0可以简写为1:.需要注意的是,major在一个网卡的所有队列中是惟一的.对于类别来说,其major和它的父类别或父队列的major相同,而minor在一个队列内部则是惟一的(类别肯定是包含在某个队列中的).举个例子,如果队列2:包含两个类别,则这两个类别的句柄是2:x这样的形式,并且它们的 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |