基于Linux 网络流量控制系统的设计与实现
2022-07-11张艺耀
张艺耀
(枣庄科技职业学院 山东省滕州市 277599)
随着网络技术的飞速发展,网络上的业务流量不断增长,用户对网络服务质量(QoS,Quality of Service)的要求也越来越高。而传统的计算机网络是为进行非实时的数据传输而设计的,它提供的是一种“尽力而为”的服务,难以满足现阶段网络传输业务对服务质量的新要求。流量控制技术的产生主要为了满足网络QoS 的需求, Linux 作为一个开源的、应用广泛的操作系统,很早就提供了对QoS 的支持,经过多年的不断发展与完善,已经相当的成熟。TC 是Linux 平台下进行流量管理的一个开源工具,它包含大量的队列管理算法,可以用来实现复杂的流量控制。
1 Linux的流量控制
图1 表示了在Linux 内核中进行流量控制的流程图。数据流就像左面的箭头所表示的那样,经过网卡进入内核。首先经过的是入口队列,根据队列规则有部分数据包可能被过滤器丢弃,判断一个数据包是否丢弃的方法叫做策略。在数据包被内核进行进一步的处理之前先经策略处理,丢掉无需内核处理的数据包,这样可以有效的节省CPU 时间。当数据包顺利地通过了策略,如果数据包地目的主机就是发本机,它就会先进入IP 协议栈进行相应的处理,然后提交给目的进程;如果该数据包地目的主机不是本机就需要进行进一步的转发,直接把该数据包发往出口队列。
图1:Linux 内核中流量管理流程图
2 流量控制系统的设计与实现
2.1 设计思想
流量控制系统主要是利用Linux 内核的网络模块,通过队列规则来分类、引导、调整数据流的发送顺序,优先发送优先级较高的网络流量,延迟发送优先级较低的网络流量,即使当网络发生拥塞时也能够保证用户的最低带宽,不会影响业务的正常通信;并且可以为每个用户设定最高可用带宽,当网络的带宽资源还有剩余的时候,可共享剩余的带宽,同时设定最高可用带宽可以抑制异常的网络流量。
2.2 流量控制系统的设计
2.2.1 系统功能
流量控制系统是通过该网络节点内部的不同的用户提供不同的网络带宽,满足他们对网络QoS要求的流量控制系统。为了达到以上的要求,流量控制系统应该具有如下功能:
(1)保证每个用户的最小带宽,当网络发生拥塞的时候,本网络节点仍能够为每个用户提供最基本保证带宽,以确保其网络传输的服务质量。
(2)带宽共享,当网络节点中有剩余的网络带宽时,用户的实际带宽可以大于他们所申请的网络带宽,实现网络带宽的共享与互借,通过这种方式可提高带宽的利用率。
(3)限制每个用户的最大带宽,避免异常流量。为了防止某些用户非法利用网络带宽的共享功能,进行恶意的网络攻击,给他人的利益造成损害,必需限制每个用户的最大网络带宽。
(4)双向的网络流量管理,根据用户的不同的需求对于流入与流出带宽分别作规划,进行更精确的带宽管理,能够更好的控制网络拥塞。
2.2.2 系统总体设计
本流量控制系统基于Linux 平台进行开发,其核心部分在Linux 流量控制TC 框架的基础上进行研发。根据系统要实现的主要功能,可以将流量控制系统分成三个主要的模块:流量控制模块,指令处理模块和通信模块。其整体架构如图2 所示。
图2:流量控制系统架构图
流量控制模块是整个流量控制系统的核心部分,是负责具体的设置、删除、修改某个用户主机的带宽。指令处理模块主要是接收来自网络或者本机控制台的操作指令,解析指令并生成相应的QoS 规则,并传送到流量控制模块进行相应的操作。
通信模块主要负责完成流量控制系统与其他系统间的通信以及本系统内的各个模块之间的通信工作。为了规范各模块之间以及本系统与其他系统间的通信,该模块定义了一系列的通信协议,操作指令的发送以及操作结果的返回都是通过该模块实现的
2.3 流量控制系统的实现
2.3.1 关键技术
流量控制系统中主要使用了Linux 中的TC(Traffic Control)工具,TC 是用来进行流量控制,流量整形,带宽共享的一个网络工具,它主要针对输出流量进行相应的操作,支持各种类型的网络层通信协议。
当有数据流量通过一台有流量控制的功能的主机时,首先系统通过事先配置好的过滤规则对数据流量进行区分,如可以通过检测数据包包头中的源/目的IP 地址、源/目的端口号、协议类型等来对数据包进行分类,然后把分好类的数据包送入到排队规则的队列中,通过排队规则队列的出队算法对数据包进行调度,最后把数据包送到网卡的出口。
2.3.2 指令解析模块
指令处理模块用来接收来自网络或者是控制台的发送过来的操作指令,当接收到一条指令是接到的指令的长度,然后验证长度的合法性,验证接收到的数据是否符合预先制定的协议,以防止接收到了非法的或不完整的指令。通过对指令数据解析可以知道指令的类型和该指令相关的数据信息,根据这些内容可以把指令放到一个结构体中,即生成一条QoS 规则。
2.3.3 流量控制模块
流量控制系统的核心功能是通过流量控制模块来实现的,它能够设定、删除、修改一台内网主机的带宽限制。对于这些操作可以通过网络发送命令的方式进行远程操作,也可通过控制台的CLI 命令进行操作。该模块的流程图如图3所示。
图3:流量控制模块流程图
网络中的流量是双向的,对于入流量和出流量限制,最理想的位置就是“边缘位置”,所谓“边缘位置”就是在一个网络中,管理员所能控制的最靠近边缘的位置,所以要对一台内网主机的如流量做带宽限制,最理想的地方就是内网主机的网关。
2.3.4 规则查找优化
在Linux 系统中,匹配QoS 规则默认使用的是顺序查找算法,它的最好和最坏时间复杂度为O(n)。哈希(HASH)查找算法很显然是一种比较高效的查找算法,最坏时间复杂度是O(n),而它的最好时间复杂度是O(1)。
对当前的应用主要是想通过哈希查找算法来提高查找系统中QoS 规则的速度,在流量控制系统中的QoS 规则是通过IP 地址来区分不同分类的,所以可以利用IP 地址来作为哈希函数的key,把IP 地址经过处理后得到一个值作为地址。同时利用链地址法来处理哈希冲突。
3 系统测试与结果分析
3.1 测试环境的搭建
3.1.1 测试网络结构及配置
因为我们需要测试从内网主机到外网、从外网到内网主机、从内网主机到内网主机等三种情况下的网络流量,所以我们至少需要2 台内网主机,一台网关,两台有外网IP 的机器,测试环境的网络结构如图4 所示。
图4:测试环境网络结构
各个机器的网络配置如表1 所示。
表1:测试环境机器配置
3.1.2 测试工具
本章测试的主要工具是iperf, iperf 是一款网络性能测试的开源工具。它可以测试最大TCP 和UDP 带宽性能,真实载荷下的网络质量,端到端的网络质量,还可以测试一定吞吐率下的丢包、抖动。
3.2 测试场景与结果分析
3.2.1 带宽限制效果
(1)测试目的:测试一台内网主机在有无带宽限制时的出入流量情况
(2)测试方法:
对于出流量,首先把S 作为服务端,C1 作为客户端,在S 上执行以下命令:
利用流量控制系统将总带宽设为200M,C1 的带宽分别设定为100M,200M,250M 测试C1 的出入流量,测试指令同1,2 步。
(3)期望结果:无限制时内网主机出入流量的最大值应该小于1Gbps,有带宽限制时,带宽值应该等于设定的值,但小于总带宽值。通过这种方法可以测试出内网主机出入流量的最大值,网关的出口带宽是10Gbps 的。
(4)结果分析:无带宽限制时,内网内网的带宽是1Gbps,800Mbps 应该是内网主机出入流量所能达到的最大的带宽值。当有带宽限制时,系统的总带宽设置为200Mbps,C1设置的前三个不同的带宽值都小于等于总带宽,所以实际的带宽达到设定的标准应该是没有问题的;对于第四个设定的带宽值是250Mbps,这个带宽之已经大于设定的总带宽值,而实际带宽是不可能超过总带宽的,测试的结果也充分证明了这一点。
3.2.2 带宽共享
(1)测试目的:测试子类是否可以向父类“借”带宽。
(2)测试方法:利用流量控制系统将总带宽设为50M,C1 的带宽设定为40M,最大带宽为45M。具体的测试命令如下所示。
(3) 期望结果:C1 的带宽大于40Mbps, 小于45Mbps。
(4)结果分析:系统总带宽为50Mbps,且系统中仅有一个主机C1,带宽设定为40Mbps,最大带宽设为45Mbps,当系统满足了C1 的带宽40Mbps 后,系统中的带宽还剩余10Mbps,剩余的这一部分是可以全部“借”给子类的,而C1 设定的最大值为45Mbps,它只需要向父类借5Mbps 的带宽,所以C1 带宽大于它设定的带宽,小于它的最大带宽。
3.2.3 分配带宽大于实际带宽
(1)测试目的:当分配的带宽大于总带宽时的带宽分配情况。
(2)测试方法:利用流量控制系统将总带宽设为20M,C1 的带宽分别设定为15M,最大带宽设为15M,C2的带宽为20M,最大带宽为25M,测试C1,C2 的出入流量情况。具体的测试命令如下所示。
对于出流量,在S1,S2 上分别执行以下命令:
(3)期望结果:C1 的带宽为15 /(15 + 20)× 20Mbps= 9Mbps;
C2 的带宽为20 /(15 + 20)× 20Mbps = 11Mbps。
(4)结果分析:从理论上讲,当分配的带宽大于总带宽时:
实际分配到的带宽 = 分配的带宽 /(分配的总带宽)×实际总带宽 (1)
从(公式1)可以看出,每台内网主机的实际带宽都会等比例的缩小。本实验的结果也充分验证了这一点。
3.2.4 剩余带宽与实际带宽的关系
(1)测试目的:测试随着剩余带宽的动态变化,实际带宽是怎样变化的。
(2)测试方法:利用流量控制系统把总带宽设为30M,C1 的带宽分别设定为10M,最带带宽为15M,C2 的带宽为20M,最大带宽为25M,先让C1 开始测试,10 分钟后C2 开始,持续20 分钟后让C1 停下,C2 继续10 分钟,观察C1、C2 的出入流量情况。具体的测试命令如下所示:
测试出流量:把S1,S2 作为服务端,C1,C2 作为客户端测试出流量
(3)期望结果:在前10 分钟,C1 的带宽为15Mbps;C2 的带宽为0Mbps。在第10 分钟到第30 分钟,C1 的带宽为10Mbps,C2 的带宽为20Mbps。在最后10 分钟,C1 的带宽为0Mbps,C2 的带宽为25Mbps。在前10 分钟,C1 的带宽为14Mbps;C2 的带宽为0Mbps。在第10 分钟到第30分钟,C1 的带宽为9Mbps,C2 的带宽为18Mbps。在最后10 分钟,C1 的带宽为0Mbps,C2 的带宽为23Mbps。
(4)结果分析:当有剩余带宽的时候,子类是可以向父类“借”带宽的,所以在前10 分钟,由于C2 没有流量,不占用带宽,C1 的带宽为10Mbps,剩余20Mbps 的带宽,所以C1 可以达到它的最大带宽15Mbps。最后10 分钟的情况与前十分钟类似。中间的20 分钟,由于系统中没有剩余的带宽,父类没法向子类“借”带宽,每个与主机只能达到自己设定的带宽,没法达到最大带宽。
4 结束语
流量控制技术是保证网络QoS 的一种有效手段,通过把一条固定带宽的物理链路分成多条并行的虚拟链路,通过为每一条虚拟链路提供的最小保证带宽,来保证不同用户或业务类型的网络服务质量。本文基于Linux TC 的设计了一个流量控制系统,它能够通过实现用户自定义的QoS 策略,保证用户的最大带宽、最小带宽、带宽共享等,从而提高网络带宽的利用率。通过对该系统的功能进行测试,并对测试结果进行分析,验证了该系统的流量控制功能。