TC流量控制

概述

Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,它利用队列规定(qdisc)建立处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。TC模块实现流量控制功能使用的队列规定分为两类,一类是无类队列规定(classless qdisc), 另一类是分类队列规定(classful qdisc)。 无类队列规定相对简单,而分类队列规定则引出了分类和过滤器等概念,使其流量控制功能增强。

  • classless qdisc对进入网络设备的数据流不加区分的统一对待,
    • 无类别qdisc中,数据包被接收、重新编排、延迟或丢弃,实现对整个设备发出的流量进行整形处理,但是所有数据包统一处理,不能细分各种情况。
    • 常用classless qdisc有pfifo_fast(先进先出,默认)、TBF(令牌桶过滤器)、SFQ(随机公平队列)、ID(向前随机丢包)等。
  • classful qdisc对进入设备的数据包根据不同的需求以分类的方式区分对待的qdisc。
    • 数据包进入一个分类的qdisc中,就需要根据需要被送到某一个类中,在对应的类中进行分类处理,这个分类的根据就是过滤器,过滤器根据设定的规则以及包的属性,觉得该数据包被送往哪个制定的队列,没有匹配到过滤器的包就被送到默认的类中进行处理。
    • 每一个子类也可以包含自己的过滤器,被分配到该子类的数据包,会在子类的过滤器中进一步匹配,直到被匹配到制定的类中,或者被分配到默认的类中。
    • 类除了可以包含其他队列规定之外,绝大多数分类的队列还可以对流量进行整形,这对于同时需要进行调度和流量控制的场合非常有用。

基本原理

TC的基本原理是将准备发给接口发送的报重新进行排序、整理和设置优先级,使得数据包在发送的最后关头,按照设置的限制重新组合。
TC对于包的处理方式有四种:
1. SHAPING:控制,当流量被shaped,它的传输速率就被控制了,但是shaping不仅仅是降低可用的带宽,也被用于平抑流量中的突发流量,可以实现更好的网络体验。shaping只发送在流量出口的地方。
2. SCHEDULING:调度,通过调度数据包的传输,可以提高对需要它的通信的交互性,同时还可以保证带宽的传输。这种重新排序也被称为按照优先级排序,并且只发生在出口。
3. POLICING:监管,与shaping处理数据报的传递对应的,监管属于处理数据报到达时的处理方法,因此POLICING发生在入口处。
4. DROPPING:丢弃,超出指定带宽的数据报可能会立即被抛弃,这在入口和出口都会发生。
一般来说,TC只对网络设备发出的流量进行限制,不对接收的流量进行限制,所以在设计规则时,要注意数据的流向,比如上行速率的限制都是在外网接口进行,下行速率的限制都是在内网接口进行

TC通过三种结构qdisc(队列)、class(分类)和filter(过滤器)来组合成各种定制的数据包分发结构,这种结构类似于一个树,qdisc是树的节点,是每一个结构节点的载体,规定和限制了该节点可以承担怎样的功能,派生出怎样的子节点;class可以看做树上节点的值,它具体定义了该节点对于流量的带宽、优先级、延迟和burst的规定;filter就是节点的闸门,管理者数据包是否应该流入该节点。整个流量在TC树中的流动,就是这样从上到下,从小的minor_id到大的minor_id的类依次轮询,也有例外的就是,如果一个类下面的子类设置有不同的优先级,则流量会优先满足优先级高的子类(prio_id小的)。
首先,进入的是根qdisc,即根class,然后在根class下的filter之前过滤,决定该包进入哪一个子类,如果都没有匹配到,则进入default的子类,如果匹配到一个子类,则进入该子类进行进一步的filter,直到匹配到没有子类的子类,或被分配到默认的子类中。

队列QDISC

无类别qdisc

无类别的qdisc,包括以下三种

  • [p|b]fifo:使用最简单的filter,纯粹的先入先出,只通过一个参数limit限制队列的长度,pfifo中limit以数据包的个数为单位,bfifo中limit以字节数为单位。
  • pfifo_fast:当内核打开“高级路由(Advanced Router)”编译选项时,系统的标准qdisc,它的队列包括三个波段,每个波段都是用先入先出规则,但是三个波段优先级不同,从高到低依次是band0, - - band1和band2。系统优先处理高优先级的波段中的数据报,这些数据报是按照服务类型被分配到三个波段里的。
  • red:Random Early Detection,随机早期探测,使用该qdisc时,当单开的占用接近规定的带宽时,系统会随机的丢弃一些数据包,非常适用于高带宽的应用。
  • sfq:Stochastic Fairness Queueing,随机公平队列,它会按照会话ID(session ID)为流量进行排序,然后循环按时每个会话的数据包。
  • tbf:Token Bucket Filter,令牌桶过滤器,适用于降低带宽到一个精确配置的速率,很适用于大带宽。
    如果没有有类别的qdisc,那么无类别qdisc只能附属于一个设备的根,用法如下:
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS

使用如下命令删除该设备的qdisc:tc qdisc del dev DEV root。在没有配置qdisc时,pfifo_fast就是默认的qdisc。

有类别qdisc

有类别qdisc包括:
- CBQ:Class Based Queueing,基于类别排队,实现了一个具有丰富共享层次结构的类结构,它既有shaping限制带宽的能力,也具有带宽优先级管理的能力,带宽限制是通过计算机连接的空闲时间完成的,而空闲时间的计算标准就是数据报离队事件的频率和下层数据链路层的带宽。
- HTB:Hierarchy Token Bucket,层次结构令牌桶,实现了一个具有丰富链接共享的层次结构,重点是与现有的实践相一致。使用HTB可以很容易的保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。它包含基于TBF的限制元素来限制带宽,可以为类设置优先级。
- PRIO:不能限制带宽,因为不同类别的数据包是顺序离队的,使用PRIO qdisc可以很容易的对流量进行优先级管理,只有高优先级的数据包全部发送完之后,低优先级的数据包才会继续被发送。为了方便管理,需要使用iptables或ipchain(iptables的前身)处理数据包的TOS。

分类Class

分类class和qdisc总是成对出现,class为qdisc指定具体的整形、限流和优先级规则,由于不同的qdisc功能差别较大,其所属class的规则格式也差别很大,在使用时,需要查看具体的文档说明。注意,无类别qdisc没有class。

过滤器Filter

filter用于指定数据包被分配给哪一个类,除了默认的类之外,每一个class都应该有对应的filter来为他匹配数据包。

命名规则

  • 一个qdisc会被分配一个主序列号,被称为handle(句柄),然后把从序列号作为类的命名空间。句柄采用类似10:这样的表达方式。一般一个根qdisc被分配一个handle,类似handle_id:,该handle_id就是其下所有子类的major_id,这个id是表示该子类所属的标志,不能更改。每个子类分配的qdisc,使用该子类的minor_id构建类似minor_id的格式来产生自己的handle。
tc qdisc add dev eth0 root handle 2: htb default 100
  • 一个class的命名格式:major_id:minor_id,其中major_id必须和父类的major_id以及父qdisc的handle_id一致,所以在一个设备下,所有类的major_id都是一致的,这也就意味着该设备下的所有类的minor_id不能重复,不然内核会报出该配置重复的错误RTNETLINK answers: File exists
tc class add dev eth0 parent 2:0 classid 2:1 htb rate 5000kbit 
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值