付韜 孫宏
【摘要】 ? ?網(wǎng)絡(luò)性能測試中需要構(gòu)造多種數(shù)據(jù)發(fā)向被測設(shè)備,目前已有的測試方法大多使用固定的流量模型和固定變化模式,無法真實(shí)反映網(wǎng)絡(luò)負(fù)載的特征。本文提出一種結(jié)合Sketch計(jì)數(shù)和數(shù)據(jù)流元數(shù)據(jù)壓縮復(fù)原的網(wǎng)絡(luò)測試數(shù)據(jù)生成方法,其中Sketch用來學(xué)習(xí)網(wǎng)絡(luò)中真實(shí)的數(shù)據(jù)流分布情況,元數(shù)據(jù)則采用壓縮的方式保存負(fù)載特征,在測試時(shí)將被壓縮的元數(shù)據(jù)恢復(fù)成測試數(shù)據(jù)并按Sketch統(tǒng)計(jì)值發(fā)送,從而以更加真實(shí)的仿真數(shù)據(jù)流完成性能測試。
【關(guān)鍵字】 ? ?重放測試 ? ?Sketch ? ?正則表達(dá)式
一、背景介紹
網(wǎng)絡(luò)性能測試是通過測試軟件或硬件產(chǎn)生超越被測設(shè)備性能極限的網(wǎng)絡(luò)測試數(shù)據(jù),經(jīng)過被測網(wǎng)絡(luò)或設(shè)備處理后得到可觀測的測試結(jié)果。目前最精準(zhǔn)的網(wǎng)絡(luò)性能測試方法是采用網(wǎng)絡(luò)測試儀硬件平臺搭配專用軟件,具有端口密度大、時(shí)間戳精確、測試結(jié)果誤差小的優(yōu)點(diǎn),典型的測試儀廠商如思博倫、是德、福祿克、信雅納、信而泰等均設(shè)計(jì)端口封裝涵蓋所有主流網(wǎng)絡(luò)接口、模塊可替換、協(xié)議種類豐富的系列化測試儀。網(wǎng)絡(luò)性能測試的核心基本功能是構(gòu)建測試數(shù)據(jù)流、全線速捕獲、數(shù)據(jù)流統(tǒng)計(jì)分析,在此通過支持標(biāo)準(zhǔn)的RFC系列測試和字段變化規(guī)則可以完成網(wǎng)絡(luò)設(shè)備如路由器、交換機(jī)等的性能測試。
在目前工業(yè)界網(wǎng)絡(luò)性能測試中,常見的測試數(shù)據(jù)主要依據(jù)三種方式產(chǎn)生,一是依據(jù)特定標(biāo)準(zhǔn)規(guī)范的流量模型,二是依據(jù)真實(shí)捕獲的網(wǎng)絡(luò)通信數(shù)據(jù),三是用戶輸入特定的數(shù)據(jù)內(nèi)容。在理論領(lǐng)域,文獻(xiàn)[1]提出使用正則表達(dá)式來構(gòu)造測試數(shù)據(jù),但該方法沒有對各數(shù)據(jù)流占帶寬的比例進(jìn)行控制,在流量分布方面無法按照用戶設(shè)置或真實(shí)網(wǎng)絡(luò)通信分布進(jìn)行測試。
1.標(biāo)準(zhǔn)規(guī)范的流量模型:規(guī)定測試儀和被測設(shè)備的連接結(jié)構(gòu),定義多個(gè)數(shù)據(jù)流結(jié)構(gòu)及字段內(nèi)容變化模式,一般支持遞增、遞減、隨機(jī)等測試數(shù)據(jù),但存在著較強(qiáng)的規(guī)律。
2.真實(shí)網(wǎng)絡(luò)通信數(shù)據(jù):直接保存從網(wǎng)絡(luò)中捕獲的真實(shí)數(shù)據(jù),但占用大量存儲空間。
3.用戶輸入特定的數(shù)據(jù)內(nèi)容:用戶配置基本的URL或載荷數(shù)據(jù),但靈活性較差。
測試數(shù)據(jù)構(gòu)造方法需要滿足真實(shí)性、存儲空間、流量分布情況三方面的要求,真實(shí)性是指測試數(shù)據(jù)包的內(nèi)容是否滿足被測網(wǎng)絡(luò)的要求,如果采用存在固定規(guī)律的假數(shù)據(jù),測試結(jié)果與真實(shí)網(wǎng)絡(luò)中的實(shí)際性能會存在較大誤差。存儲空間則代表測試儀用于存儲測試數(shù)據(jù)的總?cè)萘?。流量分布情況則代表發(fā)送數(shù)據(jù)流時(shí)是否反映真實(shí)網(wǎng)絡(luò)中的分布情況。
從這三個(gè)角度分析,上述四種方法無法同時(shí)兼顧仿真的測試數(shù)據(jù)的真實(shí)性、存儲空間、流量分布情況。標(biāo)準(zhǔn)規(guī)范的流量模型真實(shí)性較差,僅占用測試配置文件的存儲空間,支持規(guī)律性的流量模型。重放網(wǎng)絡(luò)通信數(shù)據(jù)具有無損的真實(shí)性,但全部數(shù)據(jù)占用大量存儲空間,流量模型也與錄制的真實(shí)情況一致。用戶輸入特定的數(shù)據(jù)內(nèi)容真實(shí)性介于前兩種方案之間,占用的存儲空間也較少,沒有流量模型的配置。正則表達(dá)式的方法具有一定的真實(shí)性,存儲空間僅需要用于保存有限條表達(dá)式,但不具備流量分布信息,最終無法復(fù)現(xiàn)特定的場景。
因此需要使用一種新的方法記錄真實(shí)網(wǎng)絡(luò)中的通信,在保留網(wǎng)絡(luò)通信核心特征的背景下將其抽象為存儲空間小、分布情況準(zhǔn)確的網(wǎng)絡(luò)性能測試數(shù)據(jù)流量模型。本文將網(wǎng)絡(luò)性能測試過程中產(chǎn)生測試流的特征分為兩部分:一部分是數(shù)據(jù)流的分布特征,該部分采用Sketch進(jìn)行記錄,在重放時(shí)根據(jù)相關(guān)統(tǒng)計(jì)值恢復(fù)成測試包序列;另一部分是數(shù)據(jù)流的元數(shù)據(jù),該部分針對非關(guān)鍵字進(jìn)行正則表達(dá)式化替代,當(dāng)重放時(shí)根據(jù)正則表達(dá)式的特征進(jìn)行多種適配數(shù)據(jù)的填充和發(fā)送,從而兼顧真實(shí)性、存儲空間和流量分布的要求,優(yōu)于現(xiàn)有測試數(shù)據(jù)流構(gòu)造方法。
二、Sketch計(jì)數(shù)基本原理
一個(gè)簡單的Sketch由一組哈希函數(shù)和計(jì)數(shù)器矩陣構(gòu)成,如圖1所示,如果哈希函數(shù)的數(shù)量為n,那么計(jì)數(shù)器矩陣的行數(shù)也為n,每一行計(jì)數(shù)器的數(shù)量m則由計(jì)數(shù)方案的精度需求決定。當(dāng)一個(gè)數(shù)據(jù)包Pkt的流標(biāo)簽L進(jìn)入Sketch后,如果第i個(gè)哈希函數(shù)計(jì)算該標(biāo)簽并獲得一個(gè)哈希值j,則將該數(shù)據(jù)流標(biāo)簽對應(yīng)的統(tǒng)計(jì)值更新到第Ci,j單元上。Sketch采用n個(gè)哈希值對n行進(jìn)行更新,通過多個(gè)統(tǒng)計(jì)副本降低碰撞概率,查詢時(shí)一般采用最低值、平均值等獲得精度較低的結(jié)果,其中應(yīng)用比較廣泛的是采用最低值代表技術(shù)結(jié)果的CountMin Sketch [2]。
Sketch的特征在于只要n個(gè)副本不全都出現(xiàn)碰撞,就能得到準(zhǔn)確的統(tǒng)計(jì)結(jié)果,統(tǒng)計(jì)精度可控。同時(shí)不針對每一個(gè)流建立獨(dú)立的統(tǒng)計(jì)條目,整個(gè)統(tǒng)計(jì)結(jié)構(gòu)的存儲空間不會隨者目標(biāo)被統(tǒng)計(jì)數(shù)據(jù)流數(shù)量的增加出現(xiàn)指數(shù)級增長。
三、基于Sketch和數(shù)據(jù)流元數(shù)據(jù)的重放框架
本文設(shè)計(jì)的重放測試框架由Sketch結(jié)構(gòu)組、元數(shù)據(jù)存儲、測試數(shù)據(jù)復(fù)原模塊、發(fā)包控制模塊、發(fā)包隊(duì)列構(gòu)成。其中,每一個(gè)Sketch結(jié)構(gòu)存儲各個(gè)數(shù)據(jù)流的統(tǒng)計(jì)信息,反映某一個(gè)端口上檢測到的數(shù)據(jù)流標(biāo)簽和每個(gè)標(biāo)簽的數(shù)據(jù)量,在有線網(wǎng)絡(luò)中標(biāo)簽由2層地址、3層地址、端口號、協(xié)議類型構(gòu)成,在移動(dòng)邊緣計(jì)算網(wǎng)絡(luò)中標(biāo)簽則由手機(jī)號、賬號、網(wǎng)絡(luò)地址構(gòu)成,該部分內(nèi)容在測試開始之前已經(jīng)存在于測試儀存儲中。元數(shù)據(jù)存儲中包含測試儀所需的預(yù)定義的測試數(shù)據(jù)模板,在選擇網(wǎng)絡(luò)重放配置后,測試數(shù)據(jù)復(fù)原模塊通過對數(shù)據(jù)流元數(shù)據(jù)中的正則表達(dá)式進(jìn)行變換,得到豐富的仿真測試數(shù)據(jù)。發(fā)包隊(duì)列則以復(fù)原模塊輸出的數(shù)據(jù)作為輸入,發(fā)包控制模塊根據(jù)Sketch結(jié)構(gòu)組的流量約束條件調(diào)節(jié)發(fā)包隊(duì)列的速度,將周期內(nèi)的測試數(shù)據(jù)發(fā)送至被測設(shè)備。
1. Sketch結(jié)構(gòu)組:由多個(gè)Sketch構(gòu)成,每個(gè)Sketch存儲著一個(gè)端口采集到的真實(shí)數(shù)據(jù)流分布統(tǒng)計(jì)結(jié)果,具體包括數(shù)據(jù)流標(biāo)識列表和Sketch計(jì)數(shù)器。表示列表除記錄所有標(biāo)識之外,還要記錄該數(shù)據(jù)流的數(shù)據(jù)類型,以便根據(jù)相應(yīng)的數(shù)據(jù)流元數(shù)據(jù)生成測試數(shù)據(jù)。
2.元數(shù)據(jù)存儲:元數(shù)據(jù)使用XML保存由數(shù)據(jù)流類型和正則表達(dá)式構(gòu)成的混合字符串,其中正則表達(dá)式可以給出數(shù)據(jù)的變化規(guī)則,例如特定的字符類型組合、特定的關(guān)鍵字組合等等。在遇到任意字符串如*、[A-Za-z]時(shí)采用配置選擇的字符串集合填充。
3.測試數(shù)據(jù)復(fù)原模塊:根據(jù)Sketch結(jié)構(gòu)組和數(shù)據(jù)流元數(shù)據(jù)得到測試數(shù)據(jù),這里首先讀取Sketch中的某一個(gè)數(shù)據(jù)流的頻次n和類型,根據(jù)類型得到XML流模板,實(shí)現(xiàn)n次數(shù)據(jù)包構(gòu)造,每次讀取XML流模板并逐個(gè)處理XML標(biāo)簽,當(dāng)XML標(biāo)簽為關(guān)鍵字時(shí),直接填充至數(shù)據(jù)包,而XML標(biāo)簽為正則表達(dá)式時(shí),逆向構(gòu)造符合正則表達(dá)式的字符串,該方法目前已有多種嘗試,這里我們根據(jù)用戶輸入的網(wǎng)絡(luò)重放測試配置進(jìn)行隨機(jī)構(gòu)造。
4.發(fā)包隊(duì)列:測試數(shù)據(jù)復(fù)原模塊產(chǎn)生的大量數(shù)據(jù)包會添加進(jìn)入發(fā)包隊(duì)列。
5.發(fā)包控制模塊:會根據(jù)測試儀指定的發(fā)包速率定期發(fā)出發(fā)包控制指令,調(diào)整發(fā)包隊(duì)列和收發(fā)端口的發(fā)送速度。
Sketch存儲的數(shù)據(jù)流統(tǒng)計(jì)值對存儲的占用很低,使用正則表達(dá)式構(gòu)成的數(shù)據(jù)流元數(shù)據(jù)也不需要完整保存網(wǎng)絡(luò)信息數(shù)據(jù),因此能夠在測試以上以較低的存儲空間定義大量測試流量模型。
四、數(shù)據(jù)流元數(shù)據(jù)設(shè)計(jì)
傳統(tǒng)網(wǎng)絡(luò)性能測試儀器采用數(shù)據(jù)流模板(即一種固定的協(xié)議棧及其字段結(jié)構(gòu))為基礎(chǔ),在字段內(nèi)容上進(jìn)行隨機(jī)、遞增、遞減、指定數(shù)據(jù)等方法構(gòu)造測試數(shù)據(jù),最后補(bǔ)充時(shí)間戳和校驗(yàn)和。
雖然能夠驗(yàn)證被測網(wǎng)絡(luò)或設(shè)備的性能,但簡易的數(shù)據(jù)內(nèi)容已被應(yīng)用檢測為錯(cuò)誤數(shù)據(jù)并丟棄。如果完整保存真實(shí)網(wǎng)絡(luò)數(shù)據(jù),則需要保存性能測試過程中以Tb為單位的大量數(shù)據(jù),對測試儀的存儲空間造成極大浪費(fèi),也減少可保存的流量模型數(shù)量。
元數(shù)據(jù)是用于描述數(shù)據(jù)的數(shù)據(jù),包含對目標(biāo)數(shù)據(jù)及信息資源的描述信息[3]。性能測試中的數(shù)據(jù)流元數(shù)據(jù)描述測試流模型的特征,由描述元數(shù)據(jù)部分、結(jié)構(gòu)元數(shù)據(jù)部分和管理元數(shù)據(jù)部分構(gòu)成。已經(jīng)保存在測試儀的數(shù)據(jù)流元數(shù)據(jù)將真實(shí)網(wǎng)絡(luò)流量特征進(jìn)行抽象,在保留原有網(wǎng)絡(luò)通信特征的基礎(chǔ)上將數(shù)據(jù)壓縮為更加精簡的描述,從而節(jié)省網(wǎng)絡(luò)測試儀的存儲空間。
本文設(shè)計(jì)的數(shù)據(jù)流元數(shù)據(jù)由類型、XML流模板和填充數(shù)據(jù)UUID構(gòu)成。其中,類型是描述元數(shù)據(jù),用于識別某一類構(gòu)造的測試數(shù)據(jù)類別。XML流模板是結(jié)構(gòu)元數(shù)據(jù),保存相應(yīng)類別測試流的通用結(jié)構(gòu),填充數(shù)據(jù)UUID則在必要時(shí)給出需要額外引用的數(shù)據(jù)內(nèi)容。管理元數(shù)據(jù)是保存的測試配置文件,給出該數(shù)據(jù)流元數(shù)據(jù)構(gòu)造測試數(shù)據(jù)時(shí)應(yīng)遵守的約束條件。XML流模板結(jié)構(gòu)的簡單案例如下:
<?xml version=”1.0” encoding=”utf-8”?>
example string
......
331b6525-6199-40ef-bdba-dd5f00384f42
......
[0-9]+(\.[0-9]{2})[A-Za-z]@\w+([-.]\w+)*\.\w+([-.]\w+)* //電子郵箱的表達(dá)式格式
......
該案例中strKey標(biāo)簽是關(guān)鍵字?jǐn)?shù)據(jù),其中fixed類型直接填充example string,fillData類型則通過uuid去文件中尋找相應(yīng)數(shù)據(jù)填充。RegExp標(biāo)簽是正則表達(dá)式字符串,用于測試數(shù)據(jù)構(gòu)造的正則表達(dá)式僅保留對數(shù)字、字母、符號以及通配符等常用的表達(dá)式,不執(zhí)行環(huán)視和修飾符功能。本方法中涉及到的數(shù)據(jù)流元數(shù)據(jù)標(biāo)簽如表1所示,未來可以根據(jù)測試需要擴(kuò)展標(biāo)簽種類。
五、重放數(shù)據(jù)復(fù)原方法
當(dāng)對某個(gè)端口的數(shù)據(jù)流進(jìn)行完整重放時(shí),會查找對應(yīng)Sketch中的關(guān)鍵字列表,假如處理到關(guān)鍵字為Keyi的數(shù)據(jù)流,則根據(jù)該標(biāo)識哈希到計(jì)數(shù)矩陣中,如采用CountMin Sketch就取所有哈希函數(shù)結(jié)果中的最小值作為實(shí)際計(jì)數(shù)值NQ,總共需要針對Keyi數(shù)據(jù)流構(gòu)造NQ個(gè)測試包。通過Keyi在標(biāo)識列表中對應(yīng)的載荷類型Tpi識別載荷的構(gòu)造模式,在數(shù)據(jù)流元數(shù)據(jù)中查找具體的XML模板,正則表達(dá)式的填充數(shù)據(jù)則從本地文件讀取,具體過程如圖2所示。
在獲取相關(guān)信息后,Ns代表當(dāng)前已經(jīng)構(gòu)造的數(shù)據(jù)包數(shù)量,在構(gòu)造一個(gè)具體的測試包時(shí),測試數(shù)據(jù)復(fù)原模塊將讀取解析XML流模板。測試數(shù)據(jù)復(fù)原模塊遍歷標(biāo)簽時(shí)首先進(jìn)行關(guān)鍵字識別,這里的關(guān)鍵字是指網(wǎng)絡(luò)協(xié)議相關(guān)的特定字符串,如http、https等,這些字符串并不會進(jìn)行替換。隨后找出標(biāo)記為正則表達(dá)式標(biāo)簽的內(nèi)容,此時(shí)根據(jù)正則表達(dá)式的規(guī)則逆向生成測試載荷,具體可以使用文獻(xiàn)[4]中的方法,任意字符串的部分使用本地填充數(shù)據(jù)替換。
最后,為保證測試包能夠順利通過網(wǎng)絡(luò)發(fā)送至接收端,對長度字段和校驗(yàn)等有嚴(yán)格約束條件的字段進(jìn)行重新計(jì)算,將封裝完畢的測試數(shù)據(jù)包加入發(fā)包隊(duì)列。
六、結(jié)束語
本文提出一種應(yīng)網(wǎng)絡(luò)性能測試的數(shù)據(jù)流仿真方法,充分利用Sketch和數(shù)據(jù)流元數(shù)據(jù)存儲空間較少的優(yōu)點(diǎn),利用Sketch和正則表達(dá)式逆向產(chǎn)生具有明確流量分布特征和數(shù)據(jù)特征的測試數(shù)據(jù),實(shí)現(xiàn)一種高效的性能測試流量構(gòu)造方法,可廣泛應(yīng)用于網(wǎng)絡(luò)性能測試軟件和網(wǎng)絡(luò)測試儀的設(shè)計(jì)和研制。
參 ?考 ?文 ?獻(xiàn)
[1]基于正則表達(dá)式的測試數(shù)據(jù)自動(dòng)生成技術(shù)[J]. 董敏,畢盛,齊德昱. 計(jì)算機(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.元數(shù)據(jù)字典網(wǎng)站[EB/OL].(2020-01-01)[2020-09-12]. http://www.merriam-webster.com/dictionary/metadata.
[4]郝忠虎.基于正則表達(dá)式擴(kuò)展的Web服務(wù)測試用例自動(dòng)生成方法研究[D].華南理工大學(xué),2012.