張碩琳,羅洪斌
(北京交通大學(xué)下一代互聯(lián)網(wǎng)互聯(lián)設(shè)備國(guó)家工程實(shí)驗(yàn)室 北京 100044)
隨著用戶(hù)規(guī)模和應(yīng)用數(shù)量的不斷增加,現(xiàn)有互聯(lián)網(wǎng)逐漸暴露出許多原始設(shè)計(jì)的不足。例如,現(xiàn)有互聯(lián)網(wǎng)的體系結(jié)構(gòu)采用的host to host通信模式,難以適應(yīng)當(dāng)前用戶(hù)對(duì)內(nèi)容獲取和分發(fā)的多樣化需求。當(dāng)同一個(gè)子網(wǎng)的兩個(gè)用戶(hù)要獲取同一個(gè)內(nèi)容時(shí),都要向遠(yuǎn)端的服務(wù)器獲取,從而導(dǎo)致資源浪費(fèi)。為了解決傳統(tǒng)互聯(lián)網(wǎng)的上述不足,以?xún)?nèi)容為中心的下一代互聯(lián)網(wǎng)體系結(jié)構(gòu)應(yīng)運(yùn)而生。
在以?xún)?nèi)容為中心的下一代互聯(lián)網(wǎng)體系結(jié)構(gòu)中,存儲(chǔ)數(shù)據(jù)分組將作為網(wǎng)絡(luò)節(jié)點(diǎn)的功能之一。當(dāng)數(shù)據(jù)分組流經(jīng)網(wǎng)絡(luò)節(jié)點(diǎn)時(shí),網(wǎng)絡(luò)節(jié)點(diǎn)應(yīng)該能夠根據(jù)控制信息的要求,存儲(chǔ)相應(yīng)的服務(wù)內(nèi)容。當(dāng)相同的服務(wù)再次被請(qǐng)求時(shí),網(wǎng)絡(luò)節(jié)點(diǎn)可以從自己的存儲(chǔ)區(qū)域中提取相應(yīng)的數(shù)據(jù),就近為用戶(hù)提供服務(wù),從而提高網(wǎng)絡(luò)資源利用率。
目前對(duì)于網(wǎng)絡(luò)節(jié)點(diǎn)存儲(chǔ)功能的研究大多停留在仿真階段,并沒(méi)有實(shí)際的硬件實(shí)現(xiàn)。本文基于NetFPGA10G硬件平臺(tái),設(shè)計(jì)具有存儲(chǔ)功能的網(wǎng)絡(luò)組件。之所以選擇NetFPGA10G作為開(kāi)發(fā)平臺(tái),是因?yàn)镹etFPGA平臺(tái)能夠很好地支持模塊化設(shè)計(jì),使得復(fù)雜的硬件設(shè)計(jì)可以通過(guò)各個(gè)模塊的組合來(lái)完成。而且,NetFPGA是一個(gè)基于Linux的開(kāi)放性平臺(tái),所有對(duì)它感興趣的人都可以利用平臺(tái)上現(xiàn)有的資源,在前人開(kāi)發(fā)的基礎(chǔ)上搭建自己的系統(tǒng);而自己開(kāi)發(fā)的系統(tǒng)也可以被其他人所用,從而不需要重復(fù)地搭建外圍模塊、開(kāi)發(fā)驅(qū)動(dòng)和GUI等,只要添加自己的模塊和修改現(xiàn)有的系統(tǒng)即可。NetFPGA平臺(tái)的模塊化和開(kāi)放性,大大簡(jiǎn)化了網(wǎng)絡(luò)研究的任務(wù)量。
傳統(tǒng)網(wǎng)絡(luò)中的路由器用于連接多個(gè)邏輯上分開(kāi),同時(shí)具有控制和轉(zhuǎn)發(fā)功能的網(wǎng)絡(luò)節(jié)點(diǎn)。而在下一代互聯(lián)網(wǎng)體系結(jié)構(gòu)的研究中,大多數(shù)研究人員認(rèn)為,網(wǎng)絡(luò)組件需要引入控制層面與數(shù)據(jù)層面的分離機(jī)制,將控制功能從網(wǎng)絡(luò)組件中剝離出去,交給控制器完成,而網(wǎng)絡(luò)組件只負(fù)責(zé)根據(jù)控制器下發(fā)的控制信息,轉(zhuǎn)發(fā)相應(yīng)的數(shù)據(jù)分組,從而實(shí)現(xiàn)網(wǎng)絡(luò)組件最基本的功能。而在以?xún)?nèi)容為中心的網(wǎng)絡(luò)體系結(jié)構(gòu)下,網(wǎng)絡(luò)組件必須具有存儲(chǔ)功能。首先,本文基于NetFPGA10G的網(wǎng)絡(luò)組件,在NetFPGA10G板卡上搭建OpenFlow交換機(jī),上層控制器可以通過(guò)數(shù)據(jù)通路,根據(jù)OpenFlow協(xié)議,向NetFPGA10G板卡下發(fā)流表信息,當(dāng)數(shù)據(jù)分組到來(lái)時(shí),NetFPGA10G查詢(xún)流表,根據(jù)查詢(xún)結(jié)果完成相應(yīng)的轉(zhuǎn)發(fā)動(dòng)作,從而實(shí)現(xiàn)網(wǎng)絡(luò)組件的轉(zhuǎn)發(fā)功能。然后,本文重構(gòu)了NetFPGA10G萬(wàn)兆光纖網(wǎng)卡驅(qū)動(dòng),使之在與NetFPGA10G通過(guò)PCIE連接的主機(jī)的內(nèi)存空間中利用內(nèi)存分配技術(shù),分配2 GB的存儲(chǔ)空間,并用STL提供的list_head對(duì)存儲(chǔ)空間進(jìn)行管理。當(dāng)接到存儲(chǔ)分組請(qǐng)求時(shí),進(jìn)行查詢(xún)匹配,然后根據(jù)請(qǐng)求分組中的路由信息進(jìn)行分組轉(zhuǎn)發(fā)?;贜etFPGA10G的具有存儲(chǔ)功能的網(wǎng)絡(luò)組件如圖1所示。
基于NetFPGA10G的具有存儲(chǔ)功能的網(wǎng)絡(luò)組件主要由兩個(gè)重要部分組成:基于NetFPGA10G的OpenFlow交換機(jī)以及萬(wàn)兆光纖網(wǎng)卡驅(qū)動(dòng)。OpenFlow交換機(jī)用于接收上層控制器下發(fā)的控制信息,配置流表,查詢(xún)流表,完成相應(yīng)的轉(zhuǎn)發(fā)、丟棄等動(dòng)作。當(dāng)不需要存儲(chǔ)的分組到達(dá)NetFPGA10G板卡時(shí),首先查詢(xún)精確匹配表和通配符匹配表,如果有對(duì)應(yīng)的流表項(xiàng),則執(zhí)行action域所規(guī)定的動(dòng)作;如果沒(méi)有對(duì)應(yīng)的流表項(xiàng),則向控制器發(fā)出請(qǐng)求信息,等待控制器下發(fā)控制信息之后再轉(zhuǎn)發(fā)。當(dāng)需要存儲(chǔ)的分組到達(dá)板卡時(shí),NetFPGA10G會(huì)將分組通過(guò)AXI-lite總線發(fā)送給PCI/DMA模塊,之后通過(guò)萬(wàn)兆光纖網(wǎng)卡驅(qū)動(dòng)進(jìn)行存儲(chǔ)。當(dāng)存儲(chǔ)空間有空閑時(shí),數(shù)據(jù)分組將直接存儲(chǔ)下來(lái);當(dāng)存儲(chǔ)空間為滿(mǎn)時(shí),執(zhí)行替換算法,對(duì)存儲(chǔ)的內(nèi)容進(jìn)行更新替換。當(dāng)查詢(xún)分組到達(dá)時(shí),驅(qū)動(dòng)將根據(jù)內(nèi)容名字,查找存儲(chǔ)空間是否有相應(yīng)的請(qǐng)求內(nèi)容,如果有就返回內(nèi)容到查詢(xún)分組進(jìn)入的端口,如果沒(méi)有就返回相應(yīng)的提示信息。這就構(gòu)成了基于NetFPGA10G的具有存儲(chǔ)功能的網(wǎng)絡(luò)組件。
在NetFPGA10G平臺(tái)上搭建OpenFlow交換機(jī),具體設(shè)計(jì)框架如圖2所示。
數(shù)據(jù)分組可以通過(guò)4個(gè)光纖網(wǎng)口進(jìn)入交換機(jī)進(jìn)行處理,其主要模塊分為以下4個(gè)部分:分組預(yù)處理模塊、流表控制模塊、行為處理模塊以及主機(jī)接口模塊。
(1)分組預(yù)處理模塊
數(shù)據(jù)分組進(jìn)入該模塊之后,該模塊負(fù)責(zé)解析提取分組頭部分的信息,將信息組裝成OpenFlow協(xié)議規(guī)定的12元組,該信息稱(chēng)為流表項(xiàng)。之后,分組預(yù)處理模塊會(huì)將流表項(xiàng)發(fā)送給流表控制模塊,并且將原始數(shù)據(jù)分組發(fā)送到行為處理模塊等待。
圖1 具有存儲(chǔ)功能的網(wǎng)絡(luò)組件
(2)流表控制模塊
流表控制模塊通過(guò)一個(gè)通往通配符流表和精確流表的單一管道來(lái)訪問(wèn)交換機(jī)的流表,該管道可以被所有的端口共享,所以該模塊響應(yīng)各端口對(duì)其發(fā)起的所有請(qǐng)求。在接收查找流表項(xiàng)請(qǐng)求后,流表控制器將同時(shí)查找精確匹配流表與通配符流表,若在流表中找到了匹配表項(xiàng),流表控制器就從內(nèi)存中抓取相應(yīng)的行為列表并把它發(fā)給對(duì)應(yīng)端口的行為處理器,同時(shí)更新其統(tǒng)計(jì)數(shù)據(jù)。若流表控制器在精確匹配流表和通配符流表中都匹配成功,則使用精確匹配流表中的轉(zhuǎn)發(fā)行為。
(3)主機(jī)接口模塊
該模塊是硬件交換機(jī)與上位控制器之間溝通的橋梁,控制器可以通過(guò)它來(lái)訪問(wèn)交換機(jī)中的寄存器,并對(duì)流表進(jìn)行修改、添加和刪除等操作。因?yàn)橹鳈C(jī)向交換機(jī)寫(xiě)入流表是以字為單位的,首先在主機(jī)接口模塊中緩存所有信息,一旦主機(jī)的一個(gè)寫(xiě)操作完成,主機(jī)接口觸發(fā)通信,通過(guò)使用分組預(yù)處理模塊與流表控制模塊通信時(shí)一樣的握手協(xié)議和流表控制器進(jìn)行通信。
(4)行為處理模塊
行為處理模塊根據(jù)流表控制模塊發(fā)送的轉(zhuǎn)發(fā)行為列表轉(zhuǎn)發(fā)數(shù)據(jù),更新其分組頭域與數(shù)據(jù)分組長(zhǎng)度。之后將重新封裝好的數(shù)據(jù)分組發(fā)送到輸出隊(duì)列排隊(duì)等待處理。
以上4個(gè)模塊構(gòu)成了基于NetFPGA10G的OpenFlow交換機(jī)核心功能,完成了解析分組、組裝流表項(xiàng)、查詢(xún)流表項(xiàng)、重構(gòu)流表、封裝分組、執(zhí)行轉(zhuǎn)發(fā)行為等一系列分組處理過(guò)程,實(shí)現(xiàn)了實(shí)際硬件網(wǎng)絡(luò)組件的基本轉(zhuǎn)發(fā)功能。
網(wǎng)絡(luò)組件存儲(chǔ)功能的實(shí)現(xiàn),是在網(wǎng)絡(luò)組件交換功能的基礎(chǔ)上,增加一個(gè)行為(action),當(dāng)需要查詢(xún)數(shù)據(jù)分組或存儲(chǔ)數(shù)據(jù)分組到達(dá)時(shí),硬件將該數(shù)據(jù)分組的行為定義為cache,轉(zhuǎn)發(fā)端口定義為PCI/DMA端口(5號(hào)端口),所以該數(shù)據(jù)分組將通過(guò)PCI通道進(jìn)入與NetFPGA10G相連的主機(jī)中進(jìn)行查詢(xún)和存儲(chǔ)。具體分組處理流程如圖3所示。
在上述查詢(xún)分組和存儲(chǔ)分組的處理流程中,關(guān)鍵技術(shù)部分是:存儲(chǔ)空間的分配與管理。其主要分為以下幾個(gè)步驟實(shí)現(xiàn)。
(1)創(chuàng)建存儲(chǔ)環(huán)型空間
物理地址被分成離散的單元,稱(chēng)為頁(yè)。系統(tǒng)內(nèi)部許多對(duì)內(nèi)存的操作都是基于單個(gè)頁(yè)的,目前大多數(shù)系統(tǒng)都使用每頁(yè)4 096 byte。在本設(shè)計(jì)中,存儲(chǔ)的單個(gè)數(shù)據(jù)分組最大為1 533 byte,本文選擇每頁(yè)存儲(chǔ)兩個(gè)數(shù)據(jù)分組,即存儲(chǔ)空間單元是2 KB。同時(shí),本設(shè)計(jì)總共分配了2 GB的內(nèi)存作為網(wǎng)絡(luò)組件存儲(chǔ)空間,并用get_free_pages進(jìn)行內(nèi)存申請(qǐng)。其中存儲(chǔ)單元類(lèi)型為store_node_list,并定義其結(jié)構(gòu)體如下:
圖2 OpenFlow交換機(jī)硬件設(shè)計(jì)
圖3 查詢(xún)分組/存儲(chǔ)分組處理流程
其中,port為存儲(chǔ)輸入端口號(hào);tstamp為每個(gè)分組更新的最新時(shí)間戳,每一次數(shù)據(jù)分組被請(qǐng)求時(shí),時(shí)間戳都會(huì)更新;list是查詢(xún)和維護(hù)存儲(chǔ)空間的數(shù)據(jù)結(jié)構(gòu),后面將有具體說(shuō)明。
(2)存儲(chǔ)空間的維護(hù)
由get_free_pages獲得的內(nèi)存是不連續(xù)的,需要數(shù)據(jù)結(jié)構(gòu)進(jìn)行管理和維護(hù)。利用Linux內(nèi)核中的雙向鏈表list_head將多個(gè)存儲(chǔ)單元連接起來(lái)。list_head結(jié)構(gòu)具備雙鏈表功能,通常它都組織成雙循環(huán)鏈表。與普通鏈表不同的是,list_head沒(méi)有數(shù)據(jù)域,list_head具體定義如下:
在Linux內(nèi)核鏈表中,不是在鏈表結(jié)構(gòu)中包含數(shù)據(jù),而是在數(shù)據(jù)結(jié)構(gòu)中包含鏈表節(jié)點(diǎn),正如store_node_list結(jié)構(gòu)體中的定義,包含list_head結(jié)構(gòu)成員。在遍歷鏈表時(shí),由于存儲(chǔ)空間鏈表中僅保存了數(shù)據(jù)項(xiàng)結(jié)構(gòu)中l(wèi)ist_head成員變量的地址,Linux為此提供了一個(gè) list_entry(ptr,type,member)宏,可以根據(jù)list_head的地址獲得數(shù)據(jù)存儲(chǔ)地址,從而對(duì)相應(yīng)的存儲(chǔ)單元進(jìn)行操作。
(3)存儲(chǔ)數(shù)據(jù)分組
當(dāng)需要存儲(chǔ)的數(shù)據(jù)分組到達(dá)時(shí),如果有空閑的存儲(chǔ)空間,數(shù)據(jù)分組就順序存儲(chǔ)在空閑的單元中,并且為該數(shù)據(jù)分組打時(shí)間戳;如果沒(méi)有空閑的存儲(chǔ)單元,將遍歷存儲(chǔ)空間,選擇時(shí)間戳最大的單元(即熱度最小的存儲(chǔ)分組)進(jìn)行替換。
對(duì)本文所設(shè)計(jì)的基于NetFPGA10G的具有存儲(chǔ)功能的網(wǎng)絡(luò)組件進(jìn)行功能測(cè)試。測(cè)試的硬件環(huán)境為:CPU為Intel Core i5-2400S CPU@2.50 GHz,內(nèi)存為 4 GB,數(shù)據(jù)分組存儲(chǔ)空間為2 GB,網(wǎng)卡為萬(wàn)兆光纖網(wǎng)卡;軟件配置為:Linux操作系統(tǒng),內(nèi)核版本為2.6.39,利用TCPdump查看本設(shè)計(jì)模塊功能測(cè)試結(jié)果,如圖4所示。
圖4中標(biāo)號(hào)為0的是查詢(xún)分組,標(biāo)號(hào)為4的是數(shù)據(jù)分組,本文設(shè)計(jì)模塊成功實(shí)現(xiàn)了數(shù)據(jù)分組的存儲(chǔ)和查詢(xún)功能。
圖4 測(cè)試結(jié)果
圖5 1 Gbit/s存儲(chǔ)速率下查詢(xún)分組返回時(shí)延
關(guān)于本文設(shè)計(jì)模塊的性能測(cè)試見(jiàn)表1。
表1 性能測(cè)試結(jié)果
可以看出,在不同的存儲(chǔ)速率下,本文設(shè)計(jì)的模塊功能實(shí)現(xiàn)相對(duì)穩(wěn)定,由于本文設(shè)計(jì)中,對(duì)于存儲(chǔ)空間的維護(hù)和管理使用的是鏈表方式,當(dāng)所查詢(xún)的數(shù)據(jù)分組在存儲(chǔ)空間的不同位置時(shí),所花費(fèi)的查詢(xún)返回時(shí)延是不定的,本文選擇在1 Gbit/s存儲(chǔ)速率下,查詢(xún)分組返回時(shí)延數(shù)據(jù)的詳細(xì)說(shuō)明,具體時(shí)延分布如圖5所示。
由于查詢(xún)分組查詢(xún)的內(nèi)容在存儲(chǔ)空間中是隨機(jī)分布的,查詢(xún)方式根據(jù)索引值進(jìn)行遍歷,可以看出,查詢(xún)返回時(shí)延分布在3~11 000 ns,平均返回時(shí)延為6.9 ns。
本文對(duì)下一代互聯(lián)網(wǎng)體系結(jié)構(gòu)中的熱點(diǎn)問(wèn)題進(jìn)行了研究,創(chuàng)新性地對(duì)具有內(nèi)容存儲(chǔ)功能的網(wǎng)絡(luò)組件設(shè)計(jì)給出了實(shí)現(xiàn)方案,提高了網(wǎng)絡(luò)資源的利用率,對(duì)下一代互聯(lián)網(wǎng)研究有著非常積極的作用。
1 Arianfar S,Nikander P,Ott J.On content-centric router design and implications.Proceedings of the 6rd International Conference on Emerging Networking Experiments and Technologies(CoNEXT),Philadelphia,USA,2010
2 Luo H B,Chen Z,Cui J B,et al.ColoR:an information-centric internet architecture for innovation.IEEE Network Magazine,2014(2)
3 OpenFlow implementation on NetFPGA 10G design document.http://www.OpenFlowswitch.org
4 劉靖龍,劉穎,張思東.基于RTL8169網(wǎng)卡的零拷貝技術(shù)研究與實(shí)現(xiàn).計(jì)算機(jī)技術(shù)與發(fā)展,2011,21(8)
5 Min S H,Choi Y C,Kim N,et al.Implementation of a programmable service composition network using NetFPGA-based OpenFlow switches. Proceedings of 1st ASIA NetFPGA Developer’s Workshop,Korea,2010
6 Corbet J,Rubini A.Linux設(shè)備驅(qū)動(dòng)程序.魏永譯.北京:中國(guó)電力出版社,2006