張洪,吳欽章,杜春蕾
(中科院重慶綠色智能技術(shù)研究院重慶404100)
基于Linux虛擬網(wǎng)卡測(cè)試平臺(tái)的系統(tǒng)設(shè)計(jì)
張洪,吳欽章,杜春蕾
(中科院重慶綠色智能技術(shù)研究院重慶404100)
為了實(shí)現(xiàn)網(wǎng)絡(luò)通信算法能夠在單主機(jī)平臺(tái)獲得驗(yàn)證分析,提出基于Linux虛擬網(wǎng)卡的測(cè)試系統(tǒng)設(shè)計(jì)方案。并完成了系統(tǒng)軟件設(shè)計(jì)。分析了Linux網(wǎng)絡(luò)驅(qū)動(dòng)框架原理,完成Linux虛擬網(wǎng)卡的創(chuàng)建與注冊(cè),通過(guò)搭建虛擬路由建立多張?zhí)摂M網(wǎng)卡的通信,使用Netfilter框架對(duì)虛擬網(wǎng)卡接收和發(fā)送的數(shù)據(jù)進(jìn)行流量分析。具備了對(duì)數(shù)據(jù)可靠性的檢測(cè)和實(shí)時(shí)流量監(jiān)測(cè)。通過(guò)TCP通信算法在虛擬網(wǎng)卡中的驗(yàn)證,能夠有效的完成對(duì)算法的測(cè)試,達(dá)到設(shè)計(jì)要求。
虛擬網(wǎng)卡;測(cè)試;路由;監(jiān)測(cè)
隨著嵌入式設(shè)備對(duì)網(wǎng)絡(luò)需求的增長(zhǎng),物聯(lián)網(wǎng)技術(shù)通過(guò)傳感器獲取大量數(shù)據(jù),這些數(shù)據(jù)通過(guò)嵌入式網(wǎng)關(guān)進(jìn)行處理,這就涉及到各種網(wǎng)絡(luò)通信算法。但是通常嵌入式軟硬件開發(fā)時(shí)間是不均衡的。如果網(wǎng)絡(luò)通信算法已經(jīng)完成,而硬件仍然處于調(diào)試狀態(tài),導(dǎo)致網(wǎng)絡(luò)通信算法不能夠及時(shí)驗(yàn)證,則開發(fā)效率降低。虛擬網(wǎng)卡測(cè)試平臺(tái)提供了不需要具體硬件參與,就能完成多網(wǎng)卡設(shè)備的通信算法驗(yàn)證。降低了軟件開發(fā)周期。并且通過(guò)分析虛擬網(wǎng)卡接收和發(fā)送的數(shù)據(jù)包,進(jìn)而對(duì)算法的準(zhǔn)確性和性能進(jìn)行測(cè)試。
Linux應(yīng)用程序通過(guò)調(diào)用套接字socket建立與內(nèi)核通信的接口。當(dāng)數(shù)據(jù)通過(guò)socket交付給內(nèi)核時(shí),內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)將數(shù)據(jù)傳送到網(wǎng)卡設(shè)備中。Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)框架分為4層。結(jié)構(gòu)圖如圖一所示。分別是網(wǎng)絡(luò)協(xié)議接口層,網(wǎng)絡(luò)設(shè)備接口層,設(shè)備驅(qū)動(dòng)功能層,網(wǎng)絡(luò)設(shè)備與媒介層。
網(wǎng)絡(luò)協(xié)議接口層的主要作用在數(shù)據(jù)鏈路層通過(guò)調(diào)用dev_ queue_xmit()函數(shù)接收網(wǎng)絡(luò)層的數(shù)據(jù),通過(guò)調(diào)用netif_rx()將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)層,實(shí)現(xiàn)對(duì)上層網(wǎng)絡(luò)的抽象收發(fā)數(shù)據(jù)。要傳輸?shù)臄?shù)據(jù)是以sk_buff結(jié)構(gòu)體的形式存在的。Linux內(nèi)核驅(qū)動(dòng)模塊中通過(guò)雙鏈表的形式將獨(dú)立的sk_buff連接在一起。sk_buff提供head,tail,end,data 4個(gè)指針可以快速地定位協(xié)議頭位置;sk_buff結(jié)構(gòu)體中保留了關(guān)鍵的報(bào)文信息(如上層所使用的協(xié)議,網(wǎng)絡(luò)設(shè)備),以便協(xié)議層靈活調(diào)用應(yīng)用網(wǎng)絡(luò)設(shè)備接口層[1]。
網(wǎng)絡(luò)設(shè)備接口層主要通過(guò)net_device結(jié)構(gòu)體來(lái)抽象的具體的網(wǎng)絡(luò)接口卡,來(lái)實(shí)現(xiàn)各種類型的硬件在軟件層次上的統(tǒng)一。net_device結(jié)構(gòu)體在內(nèi)核中指代一種網(wǎng)絡(luò)設(shè)備,網(wǎng)絡(luò)驅(qū)動(dòng)程序僅僅需要填充net_device結(jié)構(gòu)體的具體成員,并注冊(cè)將net_device注冊(cè)進(jìn)內(nèi)核,就能實(shí)現(xiàn)具體網(wǎng)絡(luò)設(shè)備與內(nèi)核的掛接。net_device結(jié)構(gòu)體存儲(chǔ)網(wǎng)絡(luò)接口重要參數(shù),是網(wǎng)絡(luò)驅(qū)動(dòng)程序的核心。
設(shè)備驅(qū)動(dòng)功能層是具體對(duì)網(wǎng)絡(luò)設(shè)備操作函數(shù)的具體實(shí)現(xiàn),比如在用戶空間執(zhí)行ifconifg eth0 up命令時(shí),設(shè)備操作函數(shù)open將執(zhí)行,對(duì)發(fā)送隊(duì)列進(jìn)行初始化,并注冊(cè)中斷。
網(wǎng)絡(luò)設(shè)備與媒介層是直接對(duì)應(yīng)實(shí)際的硬件設(shè)備,接收和發(fā)送數(shù)據(jù)的物理實(shí)體,對(duì)網(wǎng)卡設(shè)備的物理配置一般定義一組宏和一組訪問(wèn)設(shè)備內(nèi)部寄存器的函數(shù),具體的宏和函數(shù)與特定的硬件緊密相關(guān)。
圖1Linux網(wǎng)絡(luò)驅(qū)動(dòng)框架圖
2.1虛擬網(wǎng)卡初始化
為了實(shí)現(xiàn)多張網(wǎng)卡并行發(fā)送和接收數(shù)據(jù)。測(cè)試系統(tǒng)將在Linux系統(tǒng)中搭建要多張?zhí)摂M網(wǎng)卡。通過(guò)alloc_netdev函數(shù)分配網(wǎng)絡(luò)設(shè)備。分配網(wǎng)絡(luò)設(shè)備后,Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序?qū)⒆詣?dòng)調(diào)用該設(shè)備的初始化函數(shù),初始化設(shè)備的私有結(jié)構(gòu),保存一些設(shè)備一些私有數(shù)據(jù)設(shè)置,并對(duì)設(shè)備的許多成員函數(shù)指針賦值。如果使用NAPI中斷方式接收數(shù)據(jù),設(shè)置接收緩沖池[2]。最后通過(guò)register_netdev將網(wǎng)絡(luò)設(shè)備注冊(cè)到Linux內(nèi)核中。register_netdev首先檢查設(shè)備名是否已確定,若沒(méi)確定則會(huì)以eth%d形式存在。此時(shí)內(nèi)核會(huì)調(diào)用函數(shù)dev_alloc_name來(lái)完成該名稱,此函數(shù)會(huì)把%d換成設(shè)備類型中頭一個(gè)未分派的數(shù)字。
2.2虛擬網(wǎng)卡數(shù)據(jù)發(fā)送
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序通過(guò)分析網(wǎng)絡(luò)層協(xié)議傳遞的sk_buff結(jié)構(gòu)體,獲得所接收的有效數(shù)據(jù)和實(shí)際長(zhǎng)度,將有效的數(shù)據(jù)存入臨時(shí)緩存區(qū)。如果是以太網(wǎng)數(shù)據(jù),則需要判斷是否小于最小量。如果小于發(fā)送最小要求數(shù)量,不足的地方則補(bǔ)0。最后將數(shù)據(jù)通過(guò)虛擬路由函數(shù)進(jìn)行發(fā)送。
2.3虛擬網(wǎng)卡數(shù)據(jù)接收
1)常規(guī)方式,網(wǎng)絡(luò)設(shè)備接收數(shù)據(jù)的主要方法是由中斷引發(fā)設(shè)備的中斷處理函數(shù),中斷處理函數(shù)判斷中斷類型,如果為接收中斷,則讀取接收到的數(shù)據(jù),分配sk_buff數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)緩沖區(qū),將接收到的數(shù)據(jù)拷入數(shù)據(jù)緩沖區(qū),并調(diào)用netif_rx()將sk_buff傳遞給上層協(xié)議[3]。
2)NAPI中斷方式,與常規(guī)接收中斷接收方式不同,NAPI以輪詢的方式接收數(shù)據(jù)包,當(dāng)發(fā)生一次中斷后,在中斷處理函數(shù)中就關(guān)閉接收中斷,直到通過(guò)輪詢方式完成接收隊(duì)列中的數(shù)據(jù)包之后,打開中斷使能。NAPI這種方式在高負(fù)載的情況可以發(fā)揮更好的性能,避免每接收一個(gè)數(shù)據(jù)包都要發(fā)生中斷。
路由器作為一種網(wǎng)絡(luò)設(shè)備,配備了多個(gè)網(wǎng)絡(luò)接口卡,能夠利用它的網(wǎng)絡(luò)配置正確轉(zhuǎn)發(fā)入口流量,決定進(jìn)入的封包應(yīng)當(dāng)是轉(zhuǎn)發(fā)所需要的信息還是送給本地主機(jī),以及在轉(zhuǎn)發(fā)時(shí)正確轉(zhuǎn)發(fā)封包所需要的信息,都存儲(chǔ)在被稱為轉(zhuǎn)發(fā)信息庫(kù)的數(shù)據(jù)庫(kù)中,它通常被簡(jiǎn)稱為路由表[4]。
通過(guò)虛擬網(wǎng)卡的搭建,在Linux系統(tǒng)中虛擬出多張?zhí)摂M網(wǎng)卡。這幾張網(wǎng)卡都具有接收和發(fā)送數(shù)據(jù)包的能力。需要通過(guò)虛擬路由將這幾張網(wǎng)卡建立連接。通過(guò)在數(shù)據(jù)包函數(shù)中的IP地址轉(zhuǎn)換和MAC地址轉(zhuǎn)換。實(shí)現(xiàn)虛擬路由表的功能。虛擬路由的功能如圖2所示。
圖2 虛擬路由實(shí)現(xiàn)原理圖
3.1IP地址的轉(zhuǎn)換
虛擬網(wǎng)卡驅(qū)動(dòng)模塊的關(guān)鍵部分對(duì)于IP地址的轉(zhuǎn)換,Linux終端虛擬多個(gè)接口,對(duì)這些接口進(jìn)行IP地址分配。數(shù)據(jù)包在這些接口中傳遞不是簡(jiǎn)單的環(huán)回,而是通過(guò)虛擬路由,將發(fā)送的數(shù)據(jù)包根據(jù)IP地址發(fā)送到指定的接口中。使得看起來(lái)是系統(tǒng)中有多個(gè)網(wǎng)卡接口卡,但實(shí)際上是計(jì)算機(jī)內(nèi)部自行處理數(shù)據(jù)包。如何僅僅是通過(guò)IP地址來(lái)實(shí)現(xiàn)接口間數(shù)據(jù)傳輸,Linux內(nèi)核會(huì)通過(guò)環(huán)回通道而不是虛擬網(wǎng)卡。對(duì)發(fā)送端的IP地址進(jìn)行轉(zhuǎn)換,是虛擬路由的主要功能。
3.2MAC地址轉(zhuǎn)換
在發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包的時(shí)候,需要進(jìn)行以太網(wǎng)頭部的封裝,因?yàn)樘摂M網(wǎng)卡不存在一個(gè)真實(shí)的MAC地址。無(wú)法使用ARP協(xié)議獲得IP地址和MAC地址的映射[5]。虛擬路由要實(shí)現(xiàn)這一功能,就必須自己建立一種映射關(guān)系,實(shí)現(xiàn)遠(yuǎn)端虛擬主機(jī)的IP地址和MAC地址的聯(lián)系。接著為虛擬網(wǎng)卡設(shè)置MAC地址,遠(yuǎn)端虛擬主機(jī)的MAC地址和本機(jī)的虛擬網(wǎng)卡MAC存在對(duì)應(yīng)關(guān)系。在封裝以太網(wǎng)頭部時(shí)對(duì)MAC地址進(jìn)行轉(zhuǎn)換。
兩張?zhí)摂M網(wǎng)卡的MAC地址轉(zhuǎn)換關(guān)鍵代碼:
實(shí)現(xiàn)虛擬網(wǎng)卡間的流量控制就要利用Linux下的Netfilter框架[6],通過(guò)提供鉤子函數(shù),實(shí)時(shí)高效地采集需要檢測(cè)的原始數(shù)據(jù)包,并通過(guò)數(shù)據(jù)包分析模塊進(jìn)行處理。利用基于Linux內(nèi)核的Netfilter框架完成流量采集工作。主要對(duì)鉤子函數(shù)從虛擬網(wǎng)卡中接收到原始數(shù)據(jù)包進(jìn)行分析,判斷數(shù)據(jù)包的類型并分析原始數(shù)據(jù)包的特征參數(shù)。并在采集中設(shè)置定時(shí)模塊,每隔一段時(shí)間調(diào)用一次流量采集模塊,從流量采集模塊中獲得相應(yīng)流量指標(biāo)信息,如單位時(shí)間虛擬網(wǎng)卡接口內(nèi)接收和發(fā)送的總字節(jié)數(shù)。通過(guò)Netfilter框架對(duì)虛擬網(wǎng)卡的流量進(jìn)行檢測(cè)和控制,判斷網(wǎng)絡(luò)通信代碼的可靠性。
該虛擬網(wǎng)卡測(cè)試系統(tǒng)通過(guò)充分的分析和實(shí)驗(yàn)驗(yàn)證,采用Linux內(nèi)核編程思想,實(shí)現(xiàn)了虛擬網(wǎng)卡之間的通信,驗(yàn)證了網(wǎng)絡(luò)系統(tǒng)的可靠性,為嵌入式平臺(tái)提供網(wǎng)絡(luò)測(cè)試工具。該系統(tǒng)已經(jīng)在66AK2H14評(píng)估版中通過(guò)測(cè)試。實(shí)驗(yàn)應(yīng)用表明,該虛擬網(wǎng)卡測(cè)試平臺(tái)具有不丟包、穩(wěn)定可靠,可通過(guò)需求進(jìn)行虛擬路由測(cè)試,多點(diǎn)網(wǎng)絡(luò)通信測(cè)試。達(dá)到設(shè)計(jì)要求。
[1]Alessandro Rubini,Jonathan corbet[J].Linux Device Drivers,2006:22-31.
[2]常鋒,孟傳良.基于ARM-Linux的網(wǎng)絡(luò)驅(qū)動(dòng)程序設(shè)計(jì)[J].通信技術(shù),2012,45(6):32-35.
[3]鮑娟基于嵌入式Linux的網(wǎng)絡(luò)流量監(jiān)測(cè)系統(tǒng)[D].武漢:武漢科技大學(xué),2009.
[4]徐鵬,蘇媛.基于Linux嵌入式系統(tǒng)以太網(wǎng)接口的設(shè)計(jì)與實(shí)現(xiàn)[J].西安郵電學(xué)院學(xué)報(bào),2008,13(5):111-115.
[5]李方軍,金煒東.嵌入式Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的研究與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2005(16)90-112.
[6]KlausWehrle,F(xiàn)rankPahlke,etc.Thelinuxnetworking Architecture:design and implementation of network Protocols in the Linux Kernel[C].2004.
System design of testing platform based on Linux virtual network
ZHANG Hong,WU Qin-zhang,DU Chun-lei
(Chongqing Institute of Green and Intelligent Technology,Chinese Academy of Sciences,Chongqing 404100,China)
In order to achieve network communication algorithm in single-host platform to obtain verification of the proposed test system based on Linux virtual network design.And complete system software design.Analysis of the Linux network driver framework in principle,complete Linux virtual NIC is created and registered,by building a virtual routing to construct multiple virtual network communication,using the Netfilter framework for the virtual network adapter to receive and send data traffic analysis.With data reliability detection and real-time traffic monitoring.Communicate via TCP algorithm and validation in virtual network adapter,can effectively complete algorithm testing and achieve the design requirements.
virtual network adapter;test;router;monitor
TP393
A
1674-6236(2016)17-0096-02
2015-07-02稿件編號(hào):201507009
張洪(1980—),男,四川富順人,博士研究生。研究方向:嵌入式操作系統(tǒng)。