基于Linux的流量控制研究及应用

2018-07-07 07:16骆华杰郑仕龙
网络安全技术与应用 2018年7期
关键词:网络流量网卡数据流

◆骆华杰 陈 洋 郑仕龙



基于Linux的流量控制研究及应用

◆骆华杰 陈 洋 郑仕龙

(中国电子科集团公司第三十研究所 四川 610041)

本文分析了流量控制的几种功能,介绍了Linux系统下的流量控制模块(TC),讨论了 T C的队队规定、 分类和过滤器三个关键组件的相关细节,并针对Linux流量控制的机制在分类时若处理不当会降低带宽的缺点,结合具体实例,提出了一种流量控制设计。

Linux;TC;队列;过滤器

0 引言

当今时代,为提高办事效率,政府、学校、企业等机构依托于互联网开展各种业务,随着交互数据量的迅猛增加,如何保障主流业务占用绝大部分带宽、对非主流业务进行流量控制是一个值得研究的问题。流量控制能够对网络带宽进行合理分配和规划,比如根据不同的QoS划分不同的流量类型,还可以允许带宽合理借用,针对不种的流量执行不同的流量控制策略,这样可实现有限带宽下网络的最优利用。

Linux作为当前网络设备中应用最广泛的操作系统,其自带的流量控制模块TC也正在越来越多的被研究和使用。本文利用流量控制模块TC对数据包进行应用层协议识别、分类,设计了一个高效的流量控制系统。

1 流量控制原理

1.1 Linux流量控制模型

Linux的流量控制模型如图1所示,该模型基于Linux网桥模式,使用TC对内网传输的数据进行识别和标记完成流量控制。

图 1 Linux流量控制模型

1.2 流量控制模块TC

Linux内核发展到现在,其流量控制模块TC已经比较成熟稳定。TC的三个组件:队列规定(Qdisc)、过滤器(Filter)、类(Class)。

(1)队列规定

每个网卡都与一个队列规定(Qdisc)相联系,当有报文分组需要从网卡发送出去,会把该报文分组添加到该网卡对应的队列规定中,并由该队列规定决定报文分组的发送顺序。故流量控制只能在队列规定中进行。

队列规定分为两种:无类队列规定(Classless Qdisc)和分类队列规定(Classful Qdisc)。

无类队列规定比较简单,能够接收数据包和重新编排、 延迟或丢弃数据包。可用作对网卡的流量进行整形, 不细分各种情况, 属于粗放型的流量管理。常见的无类队列规定有先进先出 (pfifo_fast)、随机公平队列 (SFQ)、令牌桶过滤器(TBF)。

分类队列规定的概念中又延伸出类 (Class) 和过滤器(Filter)两个组件,在类和过滤器的支持下,Linux可以根据数据包的类型、优先级别、端口等来区分不同类型的流量,然后通过不同的规则来控制数据包的发送,从而实现对流量的控制。

(2)三种常见的分类队列规定

①优先级队列(PRIO Qdisc,PRIO)

PRIO 队列规定仅根据配置的过滤器把流量进一步细分,不进行流量整形。PRIO 队列规定是pfifo_fast 的一种衍生物,区别在于每个波段都是一个单独的类,非简单的FIFO。

PRIO 队列规定中有数据包进入,它将根据你给定的过滤器设置选择一个类。

PRIO 队列规定实现对流量进行优先级管理很容易, 发送完高优先级类别的数据包, 才会发送低优先级类别的数据包。

②基于类的队列(Class Based Queueing,CBQ)

CBQ既具有带宽优先级管理的能力, 又具有固定带宽的能力,实现了一个丰富的共享连接的类别层次。CBQ确保一定的传输速率下,根据对流量特征处理数据包,在接收数据包时根据IP协议头、 IP地址、应用程序或协议、URL或其它参数等进行分类。

③分层的令牌桶(HierarchicalTokenBuchet,HTB)

HTB的分层机制较好地满足这样一种情况:在带宽固定的情况下实现对每个类别的带宽分配,且允许特定的类可以突破带宽上限,占用其它类的空闲带宽,对于要在具有固定连接速率的链路上实现带宽管理非常方便。

从以上一些概念及其相关内容的描述不难看出,分类队列规定不仅可以看作是一个分类器,可以使流量得到分类;而且也可以看作是一个整形器,因为它实际上也起了限制带宽的整形作用。

在分类队列规定中,分类器负责流量大小及分类,过滤器为分类选择适当的数据包。

(3)过滤器

过滤器应用于分类队列中。一个过滤器根据源IP地址、端口、目地IP、端口、协议类型、TOS 字段等参数对进入队列的数据包分类。常用的过滤器有种:fw、u32、route等。

fw 依据防火墙如何对这个数据包做标记进行判断。

u32依据数据包中的各个字段进行判断,如源IP 地址等。

route依据数据包将被哪条路由进行路由来判断。

过滤器中提供可设置的参数一般有protocol、parent、prio、handle。其中protocol和parent是必要参数。protocol指示过滤器接受的协议,parent用来指示附带在哪个已经存在的句柄上。

prio指的是分类器的优先权值。优先权值低的优先。

Handle是过滤器句柄的描述。对于不同过滤器,它的意义不同。

2 分类队列的操作实现

2.1 为网络物理设备如以太网卡eth1创建一个队列

命令格式:tc qdisc add dev DEV parent qdisk-id|root handle qdisc-id qdisc qdisc specific parameters

例如需要为网卡eth1配置一个HTB队列,使用下列命令:

tc qdisc add dev eth1 root handle 1:htb

其中,“add”示意要添加一个队列,“dev eth1”示意要操作的网卡为eth1。”root”示意为网卡eth1添加的是一个根队列。“handle 1:”示意该队列的句柄为1:。“htb”示意该队列为HTB队列。

2.2 在某一队列上建立分类

命令格式:tc class add dev DEV parent qdisc-id

Classid class-id qdisc qdisc specific parameters

例如为根队列1创建1:10、1:20、1:30三个类别,它们分别占用55、35和10Mbit的带宽。

tc class add dev eth1 parent 1:classid 1:10 htb rate 55Mbit ceil 55Mbit

tc class add dev eth1 parent 1:classid 1:20 htb rate 35Mbit ceil 35Mbit

tc class add dev eth1 parent 1:classid 1:30 htb rate 10Mbit ceil 10Mbit

其中“parent 1:”示意类别的父亲为根队列1:。“classid 1:10”示意创建一个标识为1:10的类别,“rate 55Mbit”示意系统将为该类别确保带宽55Mbit,“ceil 55Mbit”示意该类别的最高可占用带宽为55Mbit。

2.3 为每一分类建立一个过滤器

命令格式:tc filter add dev DEV protocol protocolname [parent qdisc-id|root] prio priority filtertype [filtertype specific parameters] flowid flow-id

例如分别将WWW、E-mail、FTP三种流量分配到上述三个类别1:10、1:20、1:30中。创建三个过滤器的命令如下:

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:20

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 21 0xffff flowid 1:30

其中,“protocol ip”示意该过滤器应该检查报文分组的协议字段。“prio 1”示意它们报文处理的优先级是相同的,对于不同优先级的过滤器,系统将按照从小到大的优先级顺序来执行过滤器,对于相同的优先级,系统将按照命令的先后顺序执行。这几个过滤器还用到了u32选择器(命令中u32后面的部分)来匹配不同的数据流。以第一个命令为例,判断的是dport字段,若该字段与0xffff进行与操作的结果是80,则“flowid 1:10”表示将把该数据流分配给类别1:10。

3 企业级流量控制的实例

某中小型企业的出口(网卡eth1)有100Mbit/s的带宽,分配给WWW、E-mail和FTP三种数据流量,其中的FTP独立分配10Mbit/s的带宽。另一方面,WWW分配55Mbit/s的带宽,E-mail分配35Mbit/s的带宽。同时,它们又共享90Mbit/s的带宽。

图 2 业务带宽需求图

首先我们来了解HTB的特性:某一个类别中的所有子类别,均可共享该父类别所拥有的带宽,而且每个子类别各自申请的带宽能得到保证。当某个数据流的实际使用带宽小于配额时,剩余的带宽可以被其它的数据流借走。入股该数据流的数据量增大,则被借走的带宽部分将收回,用来保证该数据流的带宽配额。

(1)在根队列1中创建根类别1:5、根类别1:6,其中根类别1:5对应FTP数据流,根类别1:6对应90Mbit带宽数据流。

tc qdisc add dev eth1 root handle 1:htb default 21

tc class add dev eth1 parent 1: classid 1:5 htb rate 10Mbit ceil 10Mbit

tc class add dev eth1 parent 1: classid 1:6 htb rate 90Mbit ceil 90Mbit

(2)在根类别1:6中,分别为WWW、E-mail数据流创建子类别1:61、子类别1:62。

tc class add dev eth1 parent 1:6 classid 1:61 htb rate 55Mbit ceil 90Mbit

tc class add dev eth1 parent 1:6 classid 1:62 htb rate 35Mbit ceil 90Mbit

(3)分别为FTP、WWW、E-mail数据流创建过滤器。

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:61

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:62

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 21 0xffff flowid 1:5

本实例中,类别1:6包含类别1:61和类别1:62两个子类别,故子类别1:61和类别1:62可共享分配90Mbit的带宽,且子类别1:61的带宽至少55Mbit,子类别1:62的带宽至少35Mbit。因此我们可以看出,要构建更加复杂的多层次类别树,实现更加灵活的带宽,共享和独占模式达到企业级的带宽管理目的,利用HTB类别和子类的包含关系可以实现。

4 结束语

网络流量管控问题让许多网络管理者感到困扰, 如何根据实际业务制定灵活的网络流量方案是当今网络管理者必须思考的课题。通过实践证明通过 Linux平台下的流量控制模块TC可以实现网络流量的有效管控,提升用户的网络服务体验。

[1]蔡文郁,金心宇,张昱.基于 Linux 的网络流量控制机制[D].浙江:浙江大学,2006.

[2]郭正球.基于Linux下TC的网络流量管理[D].湖南:长沙航空职业技术学院,2010.

[3]高旸,聂永锋.一种基于Linux下TC的流量控制管理架构[D].重庆:重庆邮电学院,2006.

[4]周序生,阳爱民,孙星明等.TC控制器在校园网络带宽管理中的应用[D].湖南:株洲工学院,2004.

猜你喜欢
网络流量网卡数据流
基于多元高斯分布的网络流量异常识别方法
大数据驱动和分析的舰船通信网络流量智能估计
汽车维修数据流基础(上)
汽车维修数据流基础(下)
部署Linux虚拟机出现的网络故障
Server 2016网卡组合模式
AVB网络流量整形帧模型端到端延迟计算
基于数据流聚类的多目标跟踪算法
挑战Killer网卡Realtek网游专用Dragon网卡
北医三院 数据流疏通就诊量