流量控制TrafficControl
1 1TCTC原理介绍原理介绍 Interface II OI Output Interface Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输 出端口处建立一个队列来实现流量控制。 Linux流量控制的基本原理如下图所示。 从 Interface 收到包后,经过流量限制( Ingress Policing)丢弃不符合规定的数据包,由 De-Multiplexing 进行判断选择如果包的目的地址是本主机,那么将该包送给上层处理;否则需 要进行转发,将包交到 Forwarding Block 处理。Forwarding Block 也接收本主机上层(TCP、UDP 等)产生的包。它通过查看路由表,决定所处理包的下一跳。然后,对包进行排列并交给Output Interface。一般我们只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以我们可以通过 改变发送次序来控制传输速率。Linux流量控制 主要是在输出接口排列时进行处理和实现的。 2 2TCTC规则规则 2.12.1流量控制方式流量控制方式 流量控制包括以下几种方式 2.1.1SHAPING限制 当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以 平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。 2.1.2SCHEDULING调度 通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。 SCHEDULING调度也只适 于向外的流量。 2.1.3POLICING策略 SHAPING用于处理向外的流量,而POLICIING策略用于处理接收到的数据。 2.1.4DROPPING丢弃 如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。 2.22.2流量控制处理对象流量控制处理对象 流量的处理由三种对象控制,它们是qdisc排队规则、class类别和filter过滤器。 2.2.1QDISC Queuing Discipline QDisc是理解流量控制traffic control的基础。无论何时,内核如果需要通过某个网络接口发送数据 包,它都需要按照为这个接口配置的qdisc把数据包加入队列。然 后,内核会尽可能多地从qdisc里 面取出数据包,把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任 何的处理,数据 包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据 包。 QDISC的类别如下 (1)、CLASSLESS QDisc不可分类QDisc 1无类别QDISC包括 [p|b]fifo 使用最简单的qdisc,纯粹的先进先出。只有一个参数 limit,用来设置队列的长度,pfifo是以数据 包的个数为单位;bfifo是以字节数为单位。 pfifo_fast 在编译内核时,如果打开了高级路由器Advanced Router编译选项, pfifo_fast就是系统的标准 QDISC。它的队列包括三个 band。在band内部,使用FIFO规则。而三个band的优先级也不相同, band 0的优先级最高,band 2的最低。如果band 0里面有数据包,系统就不会处理band 1里面的数据 包,band 1和band 2之间也是一样。数据包是按照服务类型Type of Service,TOS被分配到三个band 里面的。 rednRandom Early Detection 2017-05-15第2页,共28页 如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非 常适合高带宽应用。 SfqStochastic Fairness Queueing 它按照会话session--对应于每个TCP连接或者UDP流为流量进行排序,然后循环发送每个会话的 数据包。 TbfToken Bucket Filter 适合于把流速降低到某个值。 2不可分类QDisc的配置 如果没有可分类QDisc,不可分类QDisc只能附属于设备的根。它们的用法如下 tc qdisc add dev DEV root QDISC QDISC-PARAMETERS 要删除一个不可分类QDisc,需要使用如下命令 tc qdisc del dev DEV root 一个网络接口上如果没有设置QDisc,pfifo_fast就作为缺省的QDisc。 (2)、CLASSFUL QDISC分类QDisc 可分类的QDisc包括 CBQClass Based Queueing 它实现了一个丰富的连接共享类别结构,既有限制shaping带宽的能力,也具有带宽优先级管理的 能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频 率和下层连接数据链路层的带宽。 HTBHierarchy Token Bucket 2017-05-15第3页,共28页 它实现了一个丰富的连接共享类别体系。使用 HTB可以很容易地保证每个类别的带宽,虽然它也 允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBFToken Bucket Filter实现 带宽限制,也能够划分类别的优先级。 PRIO PRIO QDisc不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用 PRIO QDisc可以很容 易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先 级类别的数据包。为了方便管理,需要使用iptables或者ipchains处理数据包的服务类型 Type Of Service,ToS。 2.2.2CLASS类 某些QDisc可以包含一些类别,不同的类别中可以包含更深入的QDisc,通过这些细分的QDisc还可 以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据 流量的优先级。 2.2.3FILTER Filter用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的 类别中,都需要进行分类。分类的方法可 以有多种,使用fileter就是其中之一。使用filter分类时, 内核会调用附属于这个类class的所有过滤器,直到返回 一个判决。如果没有判决返回,就作进一 步的处理,而处理方式和QDISC有关。需要注意的是,filter是在QDisc内部,它们不能作为主体。 3 3操作原理操作原理 类Class组成一个树,每个类都只有一个父类,而一个类可以有多个子类。某些QDisc例如 CBQ和HTB允许在运行时动态添加类,而其它的QDisc例如PRIO不允许动态建立类。允许动态 添加类的QDisc可以有 零个或者多个子类,由它们为数据包排队。此外,每个类都有一个叶子 QDisc,默认情况下,这个叶子QDisc使用pfifo的方式排队,我们也可以使用 其它类型