晏子杰,王京梅,陳 卓,劉 宇
(電子科技大學(xué) 電子科學(xué)與工程學(xué)院,四川 成都 610054)
互聯(lián)網(wǎng)技術(shù)的快速發(fā)展和網(wǎng)絡(luò)流量的高速增長使得網(wǎng)絡(luò)業(yè)務(wù)流的種類越來越豐富,網(wǎng)絡(luò)規(guī)模和復(fù)雜性也越來越高[1]。其中,基于IP(Internet Protocol)的網(wǎng)絡(luò)更是極大地影響了人們的生活[2-3]。網(wǎng)絡(luò)流量作為網(wǎng)絡(luò)運行狀態(tài)的首要參考,監(jiān)聽、分析和研究網(wǎng)絡(luò)流量的數(shù)據(jù)信息是網(wǎng)絡(luò)運營和維護(hù)的重要環(huán)節(jié)[4]。通過對IP網(wǎng)絡(luò)流量的有效測量,獲得準(zhǔn)確的網(wǎng)絡(luò)性能特征參數(shù),為網(wǎng)絡(luò)運營商有效分配網(wǎng)絡(luò)帶寬及更加合理地利用網(wǎng)絡(luò)資源提供了建設(shè)性意見。
傳統(tǒng)網(wǎng)絡(luò)流量測量方法主要有兩種:基于硬件的測量方法和基于通用PC(Personal Computer)平臺的測量方法[5]。針對基于硬件的測量方法通常采用Cisco公司提出的NetFlow技術(shù),利用包交換芯片對IP數(shù)據(jù)流進(jìn)行轉(zhuǎn)發(fā)并同步進(jìn)行簡單的測量與統(tǒng)計[6]。由于該方案不要求對從每個接口接收到的每個數(shù)據(jù)包進(jìn)行處理,因此需要設(shè)定合適的采樣率。在這樣的采樣方式下,設(shè)備的設(shè)置的采樣率很大程度上決定了流量測量的準(zhǔn)確性[7-9],因此無法對網(wǎng)絡(luò)流做到精細(xì)化測量。基于通用PC平臺的測量方法是利用計算機(jī)網(wǎng)卡實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)幀的截取,然后進(jìn)一步分析,例如Sniffer、Wireshark、NetPeeker等[10]。但是,在高速海量的網(wǎng)絡(luò)流量下,網(wǎng)絡(luò)業(yè)務(wù)種類越來越豐富,傳統(tǒng)的軟件實現(xiàn)流量監(jiān)控方法必然會給處理器帶來額外的資源開銷[11]。此外,由于處理器速度和串行執(zhí)行等原因的限制,也使其遠(yuǎn)遠(yuǎn)無法滿足當(dāng)今網(wǎng)絡(luò)發(fā)展的需求。
鑒于上述情況,本文提出了一種軟件可編程的FPGA(Field Programmable Gate Array)網(wǎng)絡(luò)測量引擎技術(shù)實現(xiàn)方案。該方案既能解決采用NetFlow方案中無法對網(wǎng)絡(luò)流做到精細(xì)化測量的問題,又能解決傳統(tǒng)基于通用PC平臺的測量方法帶來的資源開銷較大及無法適配當(dāng)今高速網(wǎng)絡(luò)鏈路環(huán)境的問題。
本研究設(shè)計了一種軟件可編程的FPGA網(wǎng)絡(luò)測量引擎技術(shù)實現(xiàn)方案,該方案可應(yīng)用于分布式多點測量體系。數(shù)據(jù)采集點分布在網(wǎng)絡(luò)中的各個節(jié)點,測量控制器用于將輸入的自定義匹配規(guī)則編譯成自定義指令集封裝發(fā)送至數(shù)據(jù)采集點,并接收由數(shù)據(jù)采集點上報的數(shù)據(jù)幀,總體架構(gòu)如圖1所示。
圖1 系統(tǒng)總體架構(gòu)圖Figure 1. Architecture diagram of overall system
數(shù)據(jù)采集點由MAC(Media Access Control)控制邏輯和規(guī)則過濾引擎構(gòu)成,其中MAC控制邏輯用于實現(xiàn)交換機(jī)與測量目標(biāo)之間的雙向通路以及數(shù)據(jù)采集點與測量控制器之間的通信[12-13]。所述規(guī)則過濾引擎負(fù)責(zé)以流水線的方式處理由測量控制器下發(fā)的指令集[14-16]。當(dāng)指令集執(zhí)行完畢且指定結(jié)果寄存器的值發(fā)生改變時,認(rèn)定交換機(jī)與計算機(jī)之間交互的當(dāng)前數(shù)據(jù)幀與自定義規(guī)則相匹配,并根據(jù)不同的動作對當(dāng)前數(shù)據(jù)幀進(jìn)行過濾,或?qū)⑵渥止?jié)數(shù)信息通過MAC控制邏輯上報給測量控制器。數(shù)據(jù)采集點的控制電路在FPGA器件上綜合實現(xiàn),其整體框圖如圖2所示。
圖2 數(shù)據(jù)采集點整體框圖Figure 2.Overall block diagram of data collection point
規(guī)則過濾引擎所支持的指令均采用32位固定長度,將每一條指令的處理過程拆分成取指、譯碼、執(zhí)行、寫回4個階段。每個階段由專門的硬件單元構(gòu)成,采用多個硬件單元以流水線的方式并行處理多條指令。圖3所示為規(guī)則過濾引擎的簡單示意圖,其實際構(gòu)造比圖示復(fù)雜。
圖3 規(guī)則過濾引擎示意圖Figure 3. Schematic diagram of rule filter engine
取指階段負(fù)責(zé)確定下一條待讀取指令的地址PC_NEXT,并將每個時鐘周期的上升沿作為取指地址傳遞給指令存儲器。由于需要支持跳轉(zhuǎn)類指令,因此下一條指令的地址有可能是轉(zhuǎn)移地址1(PC+1),也可能是跳轉(zhuǎn)類指令指定的轉(zhuǎn)移地址。根據(jù)不同的跳轉(zhuǎn)類指令,轉(zhuǎn)移地址又有兩個不同的來源,分別是無條件跳轉(zhuǎn)指令J的轉(zhuǎn)移地址2、條件跳轉(zhuǎn)類指令BEQ和BNE的轉(zhuǎn)移地址3。所以用來選取PC_NEXT的多路選擇器會有3個輸入地址,在選擇信號JUMP_SEL的控制下選擇正確的地址。
譯碼階段由3個模塊組成,分別是寄存器堆、譯碼控制單元和跳轉(zhuǎn)條件判斷模塊。寄存器堆由64個16位的寄存器組成。值得一提的是,流經(jīng)雙向以太網(wǎng)通路數(shù)據(jù)幀的五元組信息將會分別被記錄到該模塊中的指定寄存器中。該模塊包含了兩組讀端口和一組寫端口,負(fù)責(zé)提供指令處理過程中所需的操作數(shù)以及保存指令執(zhí)行結(jié)果。所述譯碼控制單元負(fù)責(zé)根據(jù)指令的指定字段以及條件判斷模塊輸出的EQUAL信號進(jìn)行識別,產(chǎn)生相應(yīng)的控制信號,包括內(nèi)部操作碼、JUMP_SEL信號以及寄存器堆的讀使能信號和寫使能信號。讀使能信號用于判斷當(dāng)前指令所需的源操作數(shù)是否需要從寄存器堆中讀取,相應(yīng)地,寫使能信號則用于判斷當(dāng)前指令的運算結(jié)果是否需要寫入寄存器堆。
執(zhí)行階段由一個算術(shù)邏輯運算單元(Arithmetic and Logic Unit,ALU)構(gòu)成,在譯碼階段給出的內(nèi)部操作碼的作用下,對譯碼階段傳遞過來的兩個源操作數(shù)進(jìn)行運算并得到結(jié)果。
寫回階段負(fù)責(zé)將運算結(jié)果寫入寄存器堆中的目的寄存器。規(guī)則過濾引擎處理指令的狀態(tài)轉(zhuǎn)換圖如圖4所示,為其設(shè)計的指令集如表1所示。
圖4 指令處理狀態(tài)轉(zhuǎn)換圖Figure 4. State transition diagram of instruction processing
表1 規(guī)則過濾引擎指令集
規(guī)則轉(zhuǎn)譯器可實現(xiàn)將輸入的自定義匹配規(guī)則進(jìn)行預(yù)處理后轉(zhuǎn)譯成引擎可執(zhí)行的指令的功能。匹配對象包括源IP地址、源端口、目的IP地址和目的端口,支持的操作符有“-”和“|”操作符,匹配成功后對應(yīng)的動作可選擇字節(jié)計數(shù)或過濾。其中,“-”操作符執(zhí)行的是范圍匹配,而“|”操作符則表示“或”操作。例如輸入規(guī)則“180-196|225”,其表示判斷匹配對象是否為180~196范圍內(nèi)任一數(shù)值或者是否為225。需要說明的是, IP規(guī)則匹配的是IP地址和端口,以“-”字符進(jìn)行區(qū)分。針對IP地址的匹配在規(guī)則輸入界面表現(xiàn)為4組以“.”字符分隔的形式,對應(yīng)32位二進(jìn)制數(shù)的IP地址。規(guī)則輸入界面如圖5所示。
圖5 規(guī)則輸入界面示意圖Figure 5. Schematic diagram of rule input interface
規(guī)則輸入完畢后開始對其進(jìn)行預(yù)處理的操作。這里以圖5所示的源IP規(guī)則為例,由于其規(guī)則格式為part1.part2.part3.part4:part5的形式。因此,首先使用Java提供的String.split(String regex)函數(shù)以“:”字符為參數(shù)將規(guī)則拆分成源IP地址part1.part2.part3.part4和源端口part5兩部分。針對源IP地址以“\.” (“.”字符在正則表達(dá)式中為特殊符號需要轉(zhuǎn)義)為參數(shù)繼續(xù)切分成part1、part2、 part3和part4四部分。此時,規(guī)則已經(jīng)被解析成part1、part2、part3、part4和part5五個獨立的字符串,接下來開始對每個part進(jìn)行進(jìn)一步解析,將字符串型的part轉(zhuǎn)換成變量型的part,每個變量型的part都包含了range、simple兩個list和target_reg、temp_reg、zero_reg共3個字符串變量。基本處理策略如下:對于每個字符串型的part,遇到“\d+ - \d+”形式的字符串就將其放入range型list中,并標(biāo)識出最大值和最小值,否則將其放入simple型list里。分類完畢后,由于每個字符串型part針對的匹配對象不同,所以接下來需要對其寄存器組進(jìn)行不同的賦值。具體值與規(guī)則過濾引擎中寄存器堆模塊的設(shè)計相互約束。
經(jīng)預(yù)處理后的生成的變量型part都包含有上述5個類型,此時開始進(jìn)行生成指令的準(zhǔn)備工作:將所有變量型的part放入一個數(shù)組中,進(jìn)行下標(biāo)加1比較是否小于整個數(shù)組長度的操作。該過程用來確定是否存在下一個變量型part,若存在,則判斷其 range型List是否為空;若不為空,那么下一part的轉(zhuǎn)譯將從range型List開始。
生成指令的準(zhǔn)備工作完成后開始對指令進(jìn)行轉(zhuǎn)譯。首先查詢當(dāng)前變量型part中simple型List是否為空,若為空,則完成當(dāng)前part關(guān)于range型List的轉(zhuǎn)譯工作后會直接跳轉(zhuǎn)到下一part進(jìn)行轉(zhuǎn)譯,以此類推,即可完成對輸入規(guī)則的所有遍歷。生成的每一條指令包含有指令助記符、當(dāng)前指令的標(biāo)簽、指定寄存器地址和立即數(shù)四組變量,轉(zhuǎn)譯指令全部生成完畢后將其放入一個新的List中,采用后續(xù)遍歷的方法對每條指令的標(biāo)簽進(jìn)行替換。至此,完成了整個規(guī)則轉(zhuǎn)譯器的實現(xiàn)過程。
首先在測量控制器上的規(guī)則轉(zhuǎn)譯界面輸入自定義的匹配規(guī)則和對應(yīng)的動作,每個匹配對象都可以轉(zhuǎn)移條件加上操作符的形式輸入實現(xiàn)精確匹配或范圍匹配。將輸入的自定義規(guī)則編譯成自定義的指令集,根據(jù)以太網(wǎng)802.3協(xié)議標(biāo)準(zhǔn)和IP/UDP協(xié)議封裝發(fā)送至數(shù)據(jù)采集點。
數(shù)據(jù)采集點中的MAC控制邏輯對接收到測量控制器下發(fā)的數(shù)據(jù)幀進(jìn)行解幀操作,將封裝的指令剝離出來,以每32位二進(jìn)制數(shù)為一個地址單元存放至規(guī)則過濾引擎的指令寄存器中。當(dāng)來自雙向以太網(wǎng)通路的控制信號start_begin拉高,說明當(dāng)前有數(shù)據(jù)幀流經(jīng)雙向以太網(wǎng)通路且當(dāng)前數(shù)據(jù)幀的五元組信息已被剝離出來存入規(guī)則過濾引擎的寄存器堆中,此時規(guī)則過濾引擎開始工作。
規(guī)則過濾引擎以流水線的方式對指令進(jìn)行取指、譯碼、執(zhí)行、寫回操作,當(dāng)執(zhí)行完STOP指令后,判斷寄存器堆中的結(jié)果寄存器的值是否發(fā)生改變。若發(fā)生變化則根據(jù)對應(yīng)動作的不同,相應(yīng)的執(zhí)行過濾當(dāng)前流經(jīng)以太網(wǎng)通路的數(shù)據(jù)幀或是啟動計數(shù)信息數(shù)據(jù)幀的發(fā)送(其中包含了在雙向以太網(wǎng)通路中符合匹配規(guī)則數(shù)據(jù)幀的字節(jié)數(shù)信息),上報給測量控制器。從而完成了一種軟件可編程的FPGA網(wǎng)絡(luò)測量引擎技術(shù)的實現(xiàn)。
在動作為字節(jié)計數(shù)的條件下向規(guī)則輸入界面輸入“源IP:(180-196|225).(156|168).(0).(1)”實現(xiàn)對源IP地址的匹配,其中(180-196|225)用來匹配流經(jīng)雙向以太網(wǎng)通路的數(shù)據(jù)幀的源IP地址的第0個字節(jié)是否為180~196范圍內(nèi)任一數(shù)值或者是否為225;(156|168)則用來匹配源IP地址的第1個Byte的數(shù)值是否為156或168,其他以此類推。測量控制器通過對規(guī)則的編譯,形成數(shù)據(jù)采集點中規(guī)則過濾引擎可執(zhí)行的指令,如圖6所示。值得注意的是,若規(guī)則匹配成功將會執(zhí)行第34條指令(將第31個寄存器的值置1),否則執(zhí)行第36條指令(空指令),即不執(zhí)行任何操作。
圖6 編譯完成的指令示意圖Figure 6. Schematic diagram of compiled instructions
其中數(shù)據(jù)采集點的實現(xiàn)基于Xilinx Artix7系列FPGA設(shè)計完成。將MAC控制邏輯和規(guī)則過濾引擎采用一個頂層文件封裝,在一個多網(wǎng)口外設(shè)的開發(fā)板平臺上進(jìn)行驗證。實驗平臺如圖7所示。
圖7 實驗平臺Figure 7. Experimental platform
當(dāng)MAC控制邏輯接收完來自測量控制器下發(fā)的指令集并將其存入指令存儲器后,依次往雙向以太網(wǎng)通路中注入源IP地址為192.168.0.1,總字節(jié)數(shù)分別為86、87、88和89的數(shù)據(jù)幀。圖8所示為采用Wireshark抓包軟件抓取測量控制器接收到的數(shù)據(jù)幀(封裝有字節(jié)數(shù)的信息如圖箭頭所示),其中56、57、58和59數(shù)制為十六進(jìn)制,分別對應(yīng)十進(jìn)制數(shù)86、87、88和89。測試結(jié)果表明,所設(shè)計的系統(tǒng)能正確接收并處理由測量控制器下發(fā)的自定義指令集,從而實現(xiàn)對不同網(wǎng)絡(luò)流進(jìn)行測量的功能。
圖8 Wireshark抓包示意圖Figure 8. Capture package diagram of Wireshark
文中描述了一種基于FPGA的可配置網(wǎng)絡(luò)流量測量技術(shù)實現(xiàn)方案,并且通過Wireshark抓包軟件驗證了系統(tǒng)的正確性以及方案的可行性,為實現(xiàn)網(wǎng)絡(luò)流量測量提供了一種簡單可靠的設(shè)計。本設(shè)計只完成了基于UDP/IP協(xié)議的測量功能,后續(xù)可以考慮將更多功能集成到性能日益強(qiáng)大的FPGA內(nèi)部,例如TCP/IP的硬件實現(xiàn)、多核規(guī)則過濾引擎的實現(xiàn)等,其實現(xiàn)方案還需要進(jìn)一步驗證。