高 嵐
[摘要]介紹常用的網(wǎng)絡(luò)程序測試的幾種方法,并利用linux的流量控制功能搭建一個網(wǎng)絡(luò)仿真器用以對嵌入式設(shè)備的網(wǎng)絡(luò)功能進行測試,最后對該仿真器的實際仿真效果進行檢驗。
[關(guān)鍵詞]嵌入式設(shè)備 網(wǎng)絡(luò)仿真 流量控制 tc netem
中圖分類號:TP3 文獻標識碼:A 文章編號:1671-7597(2009)0120053-02
一、引言
隨著嵌入式技術(shù)發(fā)展成熟,各種嵌入式設(shè)備由于其自身擁有體積小、功耗低、可靠性好、集成度高等優(yōu)點,逐漸深入到生產(chǎn)生活中的方方面面,承擔(dān)著各種重要角色。但由于其應(yīng)用場合比較特殊,為測試帶來了許多新的挑戰(zhàn)。對于嵌入式設(shè)備,其工作時的網(wǎng)絡(luò)環(huán)境常常和開發(fā)時的實驗室網(wǎng)絡(luò)環(huán)境相差很遠,所以為了對嵌入式設(shè)備上網(wǎng)絡(luò)程序的功能性能以及可靠性等指標進行測試,我們必須采用與普通網(wǎng)絡(luò)設(shè)備測試不同方法。
二、網(wǎng)絡(luò)應(yīng)用程序測試方法概述
一般測試網(wǎng)絡(luò)應(yīng)用程序的主要過程可以概括成觀察應(yīng)用程序在網(wǎng)絡(luò)上運行時的執(zhí)行方式。通常用于測試網(wǎng)絡(luò)的方法有以下幾種:
(一)利用測試網(wǎng)絡(luò)
測試網(wǎng)絡(luò)是網(wǎng)絡(luò)應(yīng)用程序開發(fā)時最常用到的方法。開發(fā)時經(jīng)常利用實驗室中的電腦和網(wǎng)絡(luò)設(shè)備搭建一個測試環(huán)境,有時甚至直接使用實驗室的局域網(wǎng)進行一些基本功能的測試驗證。但是,通常的情況是網(wǎng)絡(luò)應(yīng)用程序能在實驗室網(wǎng)絡(luò)環(huán)境中正常的工作,一旦拿到實際的使用的生產(chǎn)網(wǎng)絡(luò)環(huán)境中就容易出錯。大多數(shù)測試網(wǎng)絡(luò)無法顧及同實際生產(chǎn)網(wǎng)絡(luò)相關(guān)的問題。
(二)利用生產(chǎn)網(wǎng)絡(luò)
生產(chǎn)網(wǎng)絡(luò)就是網(wǎng)絡(luò)應(yīng)用程序最終工作時所處的網(wǎng)絡(luò)。測試網(wǎng)絡(luò)應(yīng)用程序最精密的方法就是在生產(chǎn)網(wǎng)絡(luò)環(huán)境中實際運行程序,和實際的情況完全一樣。但是,這種方法也有其不利的一面。首先,開發(fā)人員通常無法接觸最終的使用環(huán)境,幾乎所有的商業(yè)網(wǎng)絡(luò)應(yīng)用程序都是這樣。其次,即使開發(fā)人員能夠使用最終的生產(chǎn)網(wǎng)絡(luò),直接使用生產(chǎn)網(wǎng)絡(luò)進行測試也是一種不安全的行為。被測程序一旦失控,比如耗盡了所有的帶寬影響的別的程序,破壞了其他的有用數(shù)據(jù),后果都將是災(zāi)難性的。
(三)利用網(wǎng)絡(luò)仿真
折中的方案就是網(wǎng)絡(luò)仿真器。網(wǎng)絡(luò)仿真器在一臺設(shè)備中對整個生產(chǎn)網(wǎng)絡(luò)建立模型,生產(chǎn)網(wǎng)絡(luò)中發(fā)現(xiàn)的所有問題以及網(wǎng)絡(luò)的大部分特性都將復(fù)制在網(wǎng)絡(luò)仿真器仿真出來的測試網(wǎng)絡(luò)環(huán)境中。網(wǎng)絡(luò)仿真的關(guān)鍵是可以對真實的網(wǎng)絡(luò)行為進行細致的仿真,把實際網(wǎng)絡(luò)中的問題再現(xiàn)在測試網(wǎng)絡(luò)中。
如圖1所示,網(wǎng)絡(luò)仿真器通常被安插在被測網(wǎng)絡(luò)應(yīng)用程序的客戶端與服務(wù)器之間。用以模擬實際生產(chǎn)網(wǎng)絡(luò)中處在客戶端與服務(wù)器之間的所有網(wǎng)絡(luò)對數(shù)據(jù)包產(chǎn)生的影響。例如通信一端在另一個網(wǎng)絡(luò),客戶端在本地,網(wǎng)絡(luò)仿真器模擬的就是廣域網(wǎng)對數(shù)據(jù)包的影響;又比如通信的兩端在局域網(wǎng),那么網(wǎng)絡(luò)仿真器模擬的就是本地局域網(wǎng)。當(dāng)數(shù)據(jù)包進入網(wǎng)絡(luò)仿真器之后,仿真器就會按照實際被仿真的網(wǎng)絡(luò)的模型按照一定的策略對數(shù)據(jù)包進行處理。常見的如帶寬限制、延時、錯誤、丟包、重復(fù)等等。
通過對比以上幾種網(wǎng)絡(luò)應(yīng)用程序測試的方法,可以看出用網(wǎng)絡(luò)仿真構(gòu)建的測試環(huán)境相對來說有近似度高、成本低、安全性好的優(yōu)點,非常適合對于嵌入式設(shè)備的網(wǎng)絡(luò)功能進行測試。本文將要介紹一種利用linux內(nèi)建的流量控制(Traffic Control,TC)功能搭建一個網(wǎng)絡(luò)仿真平臺的方法。
三、Linux的流量控制機制在網(wǎng)絡(luò)仿真平臺中的應(yīng)用
Linux從內(nèi)核2.1版本開始嘗試支持流量控制(Traffic Control,TC),之后發(fā)布的2.2版本內(nèi)核是第一個支持流量控制的穩(wěn)定版本。TC成為Linux下的流量控制工具,用戶可以通過TC工具包提供的接口控制內(nèi)核進行流量控制。
目前的從2.4版本的內(nèi)核開始,流量控制可以在入口(Ingress)隊列和出口(egress)隊列進行。
TC對數(shù)據(jù)包進入入口和出口隊列的控制主要由三個關(guān)鍵部分實現(xiàn):隊列規(guī)則(Queue Discipline,qdisc)、類別(Class)、過濾器(Filter)。
如圖2,數(shù)據(jù)包在進入入口隊列或出口隊列前會由過濾器按照用戶給定的篩選方法分類,每一個分類對應(yīng)一個隊列規(guī)則。在某一類中的數(shù)據(jù)包全部按照該隊列規(guī)則排隊等候處理或發(fā)送。
(一)帶寬控制的實現(xiàn)
具體的排隊規(guī)則分為可分類的和不可分類的兩種。不可分類的包括TBF(Token Bucket Filter,令牌桶過濾器)、pfifo_fast(Third Band First In First Out Queue,先進先出隊列)、SFQ(Stochastic Fairness Queuing,隨機公平隊列)。可分類的包括CBQ(Class Based Queuing,基于類別排隊)、HTB(Hierarchical Token Bucket,分層令牌桶)、PRIO。
在進行網(wǎng)絡(luò)仿真過程中,我們需要對網(wǎng)絡(luò)的帶寬進行控制。在上面介紹的排隊規(guī)則中可以選擇TBF令牌桶過濾器來進行流量整形。
令牌桶只允許不超過事先設(shè)定的速率到來的數(shù)據(jù)包通過。實際中的桶是一個緩沖器,這個“桶”不斷被恒定速率的虛擬數(shù)據(jù)“令牌”(Token)填充著,到來的數(shù)據(jù)包只有拿到令牌才可以從桶里發(fā)送出去。
(二)丟包率、時延的仿真
在2.6.7之后版本的Linux中引入了netem模塊,這個模塊是Stephen Hemminger在QOS(Quality of Service)和di_serv(Differentiated Services)的基礎(chǔ)上開發(fā)的工具。Netem是作為TC的一個排隊規(guī)則(qdisc)來使用的,通過netem的接口可以非常靈活方便地對所有離開特定網(wǎng)絡(luò)端口的數(shù)據(jù)分組進行以下幾種處理:
延遲(delay) 按照某種統(tǒng)計模型延遲每一個分組
丟棄(loss) 按照一定百分比丟棄某些分組
復(fù)制(duplication) 按照一定百分比復(fù)制一些相同的分組
重排序(reordering) 對一組分組中某一個進行延遲以打亂最終接收到的順序
綜合利用tc和netem提供的這些功能的組合可以對網(wǎng)絡(luò)的基本參數(shù)進行仿真。
四、應(yīng)用舉例
工作中需要對一個車載的移動嵌入式設(shè)備的網(wǎng)絡(luò)功能性能進行測試。實際工作中的設(shè)備工作在移動的列車上,通過無線網(wǎng)絡(luò)與地面中心通信。我們利用一臺電腦對無線網(wǎng)絡(luò)的傳輸率丟包延時等進行仿真。
實現(xiàn)如上圖,用一臺裝有雙網(wǎng)卡的運行Linux的機器作為無線網(wǎng)絡(luò)的仿真器。具體配置如下:
車載移動被測設(shè)備
IP address eth0: 10.0.1.2
Netmask: 255.255.255.0
Gateway: 10.0.1.1
地面中心
IP address eth0: 10.0.0.2
Netmask: 255.255.255.0
Gateway: 10.0.0.1
無線網(wǎng)仿真器
IP address eth0: 10.0.0.1
IP address eth1: 10.0.1.1
Netmask: 255.255.255.0
以下操作都在作為仿真器的電腦上完成,首先打開Linux的路由轉(zhuǎn)發(fā)功能:
# echo 1>/proc/sys/net/ipv4/ip_forward
再加入兩條路由:
# route add net 10.0.1.0 netmask 255.255.255.0 dev eth0
# route add net 10.0.0.0 netmask 255.255.255.0 dev eth1
下面用tc配置eth0端口的帶寬丟包率等:
# tc qdisc add dev eth0 root handle 1: netem loss 20%
# tc qdisc add dev eth0 parent 1:1 handle 10: delay 30ms
# tc qdisc add dev eth0 parent 10:1 handle 20: tbf rate 1mbit latency 200ms burst 128k
數(shù)據(jù)包先經(jīng)過TBF進行帶寬限制處理,再通過netem進行丟包率和時延的處理。這樣配置之后帶寬被限制在1Mbps,延遲為30ms,平均丟包率20%。
然后檢測一下仿真效果。用ping命令ping 10.0.0.2
--- 10.0.0.2 ping statistics ---
83 packets transmitted, 73 received, 12% packet loss, time 82006ms
rtt min/avg/max/mdev = 31.218/31.744/54.061/2.646 ms
延遲平均在31.744。
利用iperf的upd測試丟包率
0.0-30.3 sec234 KBytes63.3 Kbits/sec0.063 ms 43/206 (21%)
丟包率平均在21%。
再用iperf的tcp測試帶寬
0.0-30.2 sec2112 KBytes573 Kbits/sec
帶寬在受到丟包的影響之后為573kbps,在只使用令牌桶的情況下可以達到1Mbps。
五、結(jié)束語
本文介紹了一種利用linux的流量控制功能搭建網(wǎng)絡(luò)仿真平臺對嵌入式網(wǎng)絡(luò)設(shè)備進行測試的方法,在實際使用中發(fā)現(xiàn)tc參數(shù)只能在開始仿真之前靜態(tài)手動設(shè)置好,而不能在使用過程中動態(tài)自動調(diào)節(jié)。我們希望找到一種方法能夠在仿真過程中實時調(diào)整延遲、丟包等參數(shù),更加逼真的對如基站切換造成的周期性網(wǎng)絡(luò)性能變化進行仿真。
參考文獻:
[1]Hubert B,Gregory Maxwell,van Mook R.“Linux Advanced Routing & Traffic Control HOWTO”.http://lartc.org/lartc.pdf.2003.
[2]S.Hemminger,“Network Emulation with NetEm”in Proceedings of Linux Conf Au 2005,2005.
[3]NetEm:http://developer.osdl.org/shemminger/netem.
[4]R.Blum,Network Performance Open Source Toolkit:Using Netperf,Tcptrace,NIST Net,and SSFNet(Wiley,2003).
[5]菜文郁、金心宇、張昱,基于Linux的網(wǎng)絡(luò)流量控制機制,2006-08.
作者簡介:
高嵐,男,漢,山東泰安,同濟大學(xué),電子與信息工程學(xué)院,碩士研究生,研究方向:嵌入式系統(tǒng)及應(yīng)用。