一种结合Sketch和数据流元数据的网络测试数据生成方法设计

    付韬 孙宏

    

    

    

    【摘要】 ? ?网络性能测试中需要构造多种数据发向被测设备,目前已有的测试方法大多使用固定的流量模型和固定变化模式,无法真实反映网络负载的特征。本文提出一种结合Sketch计数和数据流元数据压缩复原的网络测试数据生成方法,其中Sketch用来学习网络中真实的数据流分布情况,元数据则采用压缩的方式保存负载特征,在测试时将被压缩的元数据恢复成测试数据并按Sketch统计值发送,从而以更加真实的仿真数据流完成性能测试。

    【关键字】 ? ?重放测试 ? ?Sketch ? ?正则表达式

    一、背景介绍

    网络性能测试是通过测试软件或硬件产生超越被测设备性能极限的网络测试数据,经过被测网络或设备处理后得到可观测的测试结果。目前最精准的网络性能测试方法是采用网络测试仪硬件平台搭配专用软件,具有端口密度大、时间戳精确、测试结果误差小的优点,典型的测试仪厂商如思博伦、是德、福禄克、信雅纳、信而泰等均设计端口封装涵盖所有主流网络接口、模块可替换、协议种类丰富的系列化测试仪。网络性能测试的核心基本功能是构建测试数据流、全线速捕获、数据流统计分析,在此通过支持标准的RFC系列测试和字段变化规则可以完成网络设备如路由器、交换机等的性能测试。

    在目前工业界网络性能测试中,常见的测试数据主要依据三种方式产生,一是依据特定标准规范的流量模型,二是依据真实捕获的网络通信数据,三是用户输入特定的数据内容。在理论领域,文献[1]提出使用正则表达式来构造测试数据,但该方法没有对各数据流占带宽的比例进行控制,在流量分布方面无法按照用户设置或真实网络通信分布进行测试。

    1.标准规范的流量模型:规定测试仪和被测设备的连接结构,定义多个数据流结构及字段内容变化模式,一般支持递增、递减、随机等测试数据,但存在着较强的规律。

    2.真实网络通信数据:直接保存从网络中捕获的真实数据,但占用大量存储空间。

    3.用户输入特定的数据内容:用户配置基本的URL或载荷数据,但灵活性较差。

    测试数据构造方法需要满足真实性、存储空间、流量分布情况三方面的要求,真实性是指测试数据包的内容是否满足被测网络的要求,如果采用存在固定规律的假数据,测试结果与真实网络中的实际性能会存在较大误差。存储空间则代表测试仪用于存储测试数据的总容量。流量分布情况则代表发送数据流时是否反映真实网络中的分布情况。

    从这三个角度分析,上述四种方法无法同时兼顾仿真的测试数据的真实性、存储空间、流量分布情况。标准规范的流量模型真实性较差,仅占用测试配置文件的存储空间,支持规律性的流量模型。重放网络通信数据具有无损的真实性,但全部数据占用大量存储空间,流量模型也与录制的真实情况一致。用户输入特定的数据内容真实性介于前两种方案之间,占用的存储空间也较少,没有流量模型的配置。正则表达式的方法具有一定的真实性,存储空间仅需要用于保存有限条表达式,但不具备流量分布信息,最终无法复现特定的场景。

    因此需要使用一种新的方法记录真实网络中的通信,在保留网络通信核心特征的背景下将其抽象为存储空间小、分布情况准确的网络性能测试数据流量模型。本文将网络性能测试过程中产生测试流的特征分为两部分:一部分是数据流的分布特征,该部分采用Sketch进行记录,在重放时根据相关统计值恢复成测试包序列;另一部分是数据流的元数据,该部分针对非关键字进行正则表达式化替代,当重放时根据正则表达式的特征进行多种适配数据的填充和发送,从而兼顾真实性、存储空间和流量分布的要求,优于现有测试数据流构造方法。

    二、Sketch计数基本原理

    一个简单的Sketch由一组哈希函数和计数器矩阵构成,如图1所示,如果哈希函数的数量为n,那么计数器矩阵的行数也为n,每一行计数器的数量m则由计数方案的精度需求决定。当一个数据包Pkt的流标签L进入Sketch后,如果第i个哈希函数计算该标签并获得一个哈希值j,则将该数据流标签对应的统计值更新到第Ci,j单元上。Sketch采用n个哈希值对n行进行更新,通过多个统计副本降低碰撞概率,查询时一般采用最低值、平均值等获得精度较低的结果,其中应用比较广泛的是采用最低值代表技术结果的CountMin Sketch [2]。

    Sketch的特征在于只要n个副本不全都出现碰撞,就能得到准确的统计结果,统计精度可控。同时不针对每一个流建立独立的统计条目,整个统计结构的存储空间不会随者目标被统计数据流数量的增加出现指数级增长。

    三、基于Sketch和数据流元数据的重放框架

    本文设计的重放测试框架由Sketch结构组、元数据存储、测试数据复原模块、发包控制模块、发包队列构成。其中,每一个Sketch结构存储各个数据流的统计信息,反映某一个端口上检测到的数据流标签和每个标签的数据量,在有线网络中标签由2层地址、3层地址、端口号、协议类型构成,在移动边缘计算网络中标签则由手机号、账号、网络地址构成,该部分内容在测试开始之前已经存在于测试仪存储中。元数据存储中包含测试仪所需的预定义的测试数据模板,在选择网络重放配置后,测试数据复原模块通过对数据流元数据中的正则表达式进行变换,得到丰富的仿真测试数据。发包队列则以复原模块输出的数据作为输入,发包控制模块根据Sketch结构组的流量约束条件調节发包队列的速度,将周期内的测试数据发送至被测设备。

    1. Sketch结构组:由多个Sketch构成,每个Sketch存储着一个端口采集到的真实数据流分布统计结果,具体包括数据流标识列表和Sketch计数器。表示列表除记录所有标识之外,还要记录该数据流的数据类型,以便根据相应的数据流元数据生成测试数据。

    2.元数据存储:元数据使用XML保存由数据流类型和正则表达式构成的混合字符串,其中正则表达式可以给出数据的变化规则,例如特定的字符类型组合、特定的关键字组合等等。在遇到任意字符串如*、[A-Za-z]时采用配置选择的字符串集合填充。

    3.测试数据复原模块:根据Sketch结构组和数据流元数据得到测试数据,这里首先读取Sketch中的某一个数据流的频次n和类型,根据类型得到XML流模板,实现n次数据包构造,每次读取XML流模板并逐个处理XML标签,当XML标签为关键字时,直接填充至数据包,而XML标签为正则表达式时,逆向构造符合正则表达式的字符串,该方法目前已有多种尝试,这里我们根据用户输入的网络重放测试配置进行随机构造。

    4.发包队列:测试数据复原模块产生的大量数据包会添加进入发包队列。

    5.发包控制模块:会根据测试仪指定的发包速率定期发出发包控制指令,调整发包队列和收发端口的发送速度。

    Sketch存储的数据流统计值对存储的占用很低,使用正则表达式构成的数据流元数据也不需要完整保存网络信息数据,因此能够在测试以上以较低的存储空间定义大量测试流量模型。

    四、数据流元数据设计

    传统网络性能测试仪器采用数据流模板(即一种固定的协议栈及其字段结构)为基础,在字段内容上进行随机、递增、递减、指定数据等方法构造测试数据,最后补充时间戳和校验和。

    虽然能够验证被测网络或设备的性能,但简易的数据内容已被应用检测为错误数据并丢弃。如果完整保存真实网络数据,则需要保存性能测试过程中以Tb为单位的大量数据,对测试仪的存储空间造成极大浪费,也减少可保存的流量模型数量。

    元数据是用于描述数据的数据,包含对目标数据及信息资源的描述信息[3]。性能测试中的数据流元数据描述测试流模型的特征,由描述元數据部分、结构元数据部分和管理元数据部分构成。已经保存在测试仪的数据流元数据将真实网络流量特征进行抽象,在保留原有网络通信特征的基础上将数据压缩为更加精简的描述,从而节省网络测试仪的存储空间。

    本文设计的数据流元数据由类型、XML流模板和填充数据UUID构成。其中,类型是描述元数据,用于识别某一类构造的测试数据类别。XML流模板是结构元数据,保存相应类别测试流的通用结构,填充数据UUID则在必要时给出需要额外引用的数据内容。管理元数据是保存的测试配置文件,给出该数据流元数据构造测试数据时应遵守的约束条件。XML流模板结构的简单案例如下:

    

    

    

    example string

    

    ......

    

    331b6525-6199-40ef-bdba-dd5f00384f42

    

    ......

    

    [0-9]+(\.[0-9]{2})[A-Za-z]@\w+([-.]\w+)*\.\w+([-.]\w+)* //电子邮箱的表达式格式

    

    ......

    

    该案例中strKey标签是关键字数据,其中fixed类型直接填充example string,fillData类型则通过uuid去文件中寻找相应数据填充。RegExp标签是正则表达式字符串,用于测试数据构造的正则表达式仅保留对数字、字母、符号以及通配符等常用的表达式,不执行环视和修饰符功能。本方法中涉及到的数据流元数据标签如表1所示,未来可以根据测试需要扩展标签种类。

    五、重放数据复原方法

    当对某个端口的数据流进行完整重放时,会查找对应Sketch中的关键字列表,假如处理到关键字为Keyi的数据流,则根据该标识哈希到计数矩阵中,如采用CountMin Sketch就取所有哈希函数结果中的最小值作为实际计数值NQ,总共需要针对Keyi数据流构造NQ个测试包。通过Keyi在标识列表中对应的载荷类型Tpi识别载荷的构造模式,在数据流元数据中查找具体的XML模板,正则表达式的填充数据则从本地文件读取,具体过程如图2所示。

    在获取相关信息后,Ns代表当前已经构造的数据包数量,在构造一个具体的测试包时,测试数据复原模块将读取解析XML流模板。测试数据复原模块遍历标签时首先进行关键字识别,这里的关键字是指网络协议相关的特定字符串,如http、https等,这些字符串并不会进行替换。随后找出标记为正则表达式标签的内容,此时根据正则表达式的规则逆向生成测试载荷,具体可以使用文献[4]中的方法,任意字符串的部分使用本地填充数据替换。

    最后,为保证测试包能够顺利通过网络发送至接收端,对长度字段和校验等有严格约束条件的字段进行重新计算,将封装完毕的测试数据包加入发包队列。

    六、结束语

    本文提出一种应网络性能测试的数据流仿真方法,充分利用Sketch和数据流元数据存储空间较少的优点,利用Sketch和正则表达式逆向产生具有明确流量分布特征和数据特征的测试数据,实现一种高效的性能测试流量构造方法,可广泛应用于网络性能测试软件和网络测试仪的设计和研制。

    参 ?考 ?文 ?献

    [1]基于正则表达式的测试数据自动生成技术[J]. 董敏,毕盛,齐德昱. 计算机工程. 2009(16).

    [2]Cormode, G, Muthukrishnan, et al. An improved data stream summary: the count-min sketch and its applications[J]. Journal of Algorithms, 2005.

    [3] Merriam-Webster.元数据字典网站[EB/OL].(2020-01-01)[2020-09-12]. http://www.merriam-webster.com/dictionary/metadata.

    [4]郝忠虎.基于正则表达式扩展的Web服务测试用例自动生成方法研究[D].华南理工大学,2012.