《TC流量控制》由会员分享,可在线阅读,更多相关《TC流量控制(10页珍藏版)》请在金锄头文库上搜索。
1、TC 流量控制 (2011-11-19 14:06) 标签: 流量 tc 控制 分类: tc TC(流量控制)高手入 摘要tc 是一个设置 Linux 内核流量控制的工具名字tc - 显示维护流量控制设置摘要tc qdisc add | change | replace | link dev DEV parent qdisc-id | root handle qdisc-id qdisc qdisc specific parameters tc class add | change | replace dev DEV parent qdisc-id classid class-id qdisc
2、 qdisc specific parameters tc filter add | change | replace dev DEV parent qdisc-id | root protocol protocol prio priority filtertype filtertype specific parameters flowid flow-idtc -s | -d qdisc show dev DEV tc -s | -d class show dev DEV tc filter show dev DEV简介Tc 用于 Linux 内核的流量控制。流量控制包括以下几种方式:SHAP
3、ING(限制)当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小 于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制) 只适用于向外的流量。SCHEDULING(调度)通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。 SCHEDULING(调度)也只适于向外的流量。POLICING(策略)SHAPING 用于处理向外的流量,而 POLICIING(策略)用于处理接收到的数据。DROPPING(丢弃)如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和 fil
4、ter(过滤器)。QDISC(排队规则)QDisc(排队规则)是 queueing discipline 的简写,它是理解流量控制 (traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数 据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列。 然后,内核会尽可能多地从 qdisc 里面取出数据包,把它们交给网络适配器驱 动模块。最简单的 QDisc 是 pfifo 它不对进入的数据包做任何的处理,数据包采用 先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。CLASS(类)某些 QDisc(排队规则)可以包含一些类别,不同
5、的类别中可以包含更深入 的 QDisc(排队规则),通过这些细分的 QDisc 还可以为进入的队列的数据包排 队。通过设置各种类别数据包的离队次序,QDisc 可以为设置网络数据流量的 优先级。FILTER(过滤器)filter(过滤器)用于为数据包分类,决定它们按照何种 QDisc 进入队列。 无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可 以有多种,使用 fileter(过滤器)就是其中之一。使用 filter(过滤器)分类时, 内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有 判决返回,就作进一步的处理,而处理方式和 QDISC 有关。需
6、要注意的是,filter(过滤器)是在 QDisc 内部,它们不能作为主体。CLASSLESS QDisc(不可分类 QDisc)无类别 QDISC 包括:p|bfifo使用最简单的 qdisc,纯粹的先进先出。只有一个参数:limit,用来设置 队列的长度,pfifo 是以数据包的个数为单位;bfifo 是以字节数为单位。pfifo_fast在编译内核时,如果打开了高级路由器(Advanced Router)编译选项, pfifo_fast 就是系统的标准 QDISC。它的队列包括三个波段(band)。在每个波 段里面,使用先进先出规则。而三个波段(band)的优先级也不相同,band 0
7、的 优先级最高,band 2 的最低。如果 band 里面有数据包,系统就不会处理 band 1 里面的数据包,band 1 和 band 2 之间也是一样。数据包是按照服务类型 (Type of Service,TOS)被分配多三个波段(band)里面的。redred 是 Random Early Detection(随机早期探测)的简写。如果使用这种 QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它 非常适合高带宽应用。sfqsfq 是 Stochastic Fairness Queueing 的简写。它按照会话(session-对 应于每个 TCP 连接或者 U
8、DP 流)为流量进行排序,然后循环发送每个会话的数据 包。tbftbf 是 Token Bucket Filter 的简写,适合于把流速降低到某个值。不可分类 QDisc 的配置如果没有可分类 QDisc,不可分类 QDisc 只能附属于设备的根。它们的用 法如下:tc qdisc add dev DEV root QDISC QDISC-PARAMETERS要删除一个不可分类 QDisc,需要使用如下命令:tc qdisc del dev DEV root一个网络接口上如果没有设置 QDisc,pfifo_fast 就作为缺省的 QDisc。CLASSFUL QDISC(分类 QDisc)可
9、分类的 QDisc 包括:CBQCBQ 是 Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富 的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理 的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是 数据包离队事件的频率和下层连接(数据链路层)的带宽。HTBHTB 是 Hierarchy Token Bucket 的缩写。通过在实践基础上的改进,它实 现了一个丰富的连接共享类别体系。使用 HTB 可以很容易地保证每个类别的带 宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB 可以 通过 TBF(Tok
10、en Bucket Filter)实现带宽限制,也能够划分类别的优先级。PRIOPRIO QDisc 不能限制带宽,因为属于不同类别的数据包是顺序离队的。使 用 PRIO QDisc 可以很容易对流量进行优先级管理,只有属于高优先级类别的数 据包全部发送完毕,才会发送属于低优先级类别的数据包。为了方便管理,需 要使用 iptables 或者 ipchains 处理数据包的服务类型(Type Of Service,ToS)。操作原理类(Class)组成一个树,每个类都只有一个父类,而一个类可以有多个子类。 某些 QDisc(例如:CBQ 和 HTB)允许在运行时动态添加类,而其它的 QDisc(
11、例如: PRIO)不允许动态建立类。允许动态添加类的 QDisc 可以有零个或者多个子类,由它们为数据包排队。此外,每个类都有一个叶子 QDisc,默认情况下,这个叶子 QDisc 使用 pfifo 的方式排队,我们也可以使用其它类型的 QDisc 代替这个默认的 QDisc。 而且,这个叶子叶子 QDisc 有可以分类,不过每个子类只能有一个叶子 QDisc。当一个数据包进入一个分类 QDisc,它会被归入某个子类。我们可以使用 以下三种方式为数据包归类,不过不是所有的 QDisc 都能够使用这三种方式。tc 过滤器(tc filter)如果过滤器附属于一个类,相关的指令就会对它们进行查询。
12、过滤器能够 匹配数据包头所有的域,也可以匹配由 ipchains 或者 iptables 做的标记。服务类型(Type of Service)某些 QDisc 有基于服务类型(Type of Service,ToS)的内置的规则为数据 包分类。skb-priority用户空间的应用程序可以使用 SO_PRIORITY 选项在 skb-priority 域设置 一个类的 ID。树的每个节点都可以有自己的过滤器,但是高层的过滤器也可以直接用于 其子类。如果数据包没有被成功归类,就会被排到这个类的叶子 QDisc 的队中。相 关细节在各个 QDisc 的手册页中。命名规则所有的 QDisc、类和过滤
13、器都有 ID。ID 可以手工设置,也可以有内核自动 分配。ID 由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。QDISC一个 QDisc 会被分配一个主序列号,叫做句柄(handle),然后把从序列号 作为类的命名空间。句柄采用象 10:一样的表达方式。习惯上,需要为有子类 的 QDisc 显式地分配一个句柄。类(CLASS)在同一个 QDisc 里面的类分享这个 QDisc 的主序列号,但是每个类都有自 己的从序列号,叫做类识别符(classid)。类识别符只与父 QDisc 有关,和父类 无关。类的命名习惯和 QDisc 的相同。过滤器(FILTER)过滤器的 ID 有三部分,
14、只有在对过滤器进行散列组织才会用到。详情请参 考 tc-filters 手册页。单位tc 命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。带宽或者流速单位:kbps千字节秒mbps兆字节秒kbitKBits秒mbitMBits秒bps 或者一个无单位数字字节数秒数据的数量单位:kb 或者 k千字节mb 或者 m兆字节mbit兆 bitkbit千 bitb 或者一个无单位数字字节数时间的计量单位:s、sec 或者 secs秒ms、msec 或者 msecs分钟us、usec、usecs 或者一个无单位数字微秒TC 命令tc 可以使用以下命令对 QDisc、类和过滤器进行操作:add在一
15、个节点里加入一个 QDisc、类或者过滤器。添加时,需要传递一个祖 先作为参数,传递参数时既可以使用 ID 也可以直接传递设备的根。如果要建立 一个 QDisc 或者过滤器,可以使用句柄(handle)来命名;如果要建立一个类, 可以使用类识别符(classid)来命名。remove删除有某个句柄(handle)指定的 QDisc,根 QDisc(root)也可以删除。被删 除 QDisc 上的所有子类以及附属于各个类的过滤器都会被自动删除。change以替代的方式修改某些条目。除了句柄(handle)和祖先不能修改以外, change 命令的语法和 add 命令相同。换句话说,change
16、命令不能一 我配置了一些控制,但是发现没有起作用,不知何解。望高手帮忙 ! 我的配置如下:(注:我用了 Iptables 的 NAT ,不知有无关系) rootit rinehart# tc -s qdisc ls dev eth0 qdisc cbq 1: rate 100Mbit (bounded,isolated) prio no-transmit Sent 7961222715 bytes 10105696 pkts (dropped 0, overlimits 0)borrowed 0 overactions 0 avgidle 62 undertime 0 rootit rinehart# tc -s class ls dev eth0 class cbq 1: root rate 100Mbit (bounded,isolated) prio no-transmit Sent 7963827499 bytes 101094