高 嵐
[摘要]介紹常用的網(wǎng)絡(luò)程序測試的幾種方法,并利用linux的流量控制功能搭建一個(gè)網(wǎng)絡(luò)仿真器用以對嵌入式設(shè)備的網(wǎng)絡(luò)功能進(jìn)行測試,最后對該仿真器的實(shí)際仿真效果進(jìn)行檢驗(yàn)。
[關(guān)鍵詞]嵌入式設(shè)備 網(wǎng)絡(luò)仿真 流量控制 tc netem
中圖分類號:TP3 文獻(xiàn)標(biāo)識碼:A 文章編號:1671-7597(2009)0120053-02
一、引言
隨著嵌入式技術(shù)發(fā)展成熟,各種嵌入式設(shè)備由于其自身擁有體積小、功耗低、可靠性好、集成度高等優(yōu)點(diǎn),逐漸深入到生產(chǎn)生活中的方方面面,承擔(dān)著各種重要角色。但由于其應(yīng)用場合比較特殊,為測試帶來了許多新的挑戰(zhàn)。對于嵌入式設(shè)備,其工作時(shí)的網(wǎng)絡(luò)環(huán)境常常和開發(fā)時(shí)的實(shí)驗(yàn)室網(wǎng)絡(luò)環(huán)境相差很遠(yuǎn),所以為了對嵌入式設(shè)備上網(wǎng)絡(luò)程序的功能性能以及可靠性等指標(biāo)進(jìn)行測試,我們必須采用與普通網(wǎng)絡(luò)設(shè)備測試不同方法。
二、網(wǎng)絡(luò)應(yīng)用程序測試方法概述
一般測試網(wǎng)絡(luò)應(yīng)用程序的主要過程可以概括成觀察應(yīng)用程序在網(wǎng)絡(luò)上運(yùn)行時(shí)的執(zhí)行方式。通常用于測試網(wǎng)絡(luò)的方法有以下幾種:
(一)利用測試網(wǎng)絡(luò)
測試網(wǎng)絡(luò)是網(wǎng)絡(luò)應(yīng)用程序開發(fā)時(shí)最常用到的方法。開發(fā)時(shí)經(jīng)常利用實(shí)驗(yàn)室中的電腦和網(wǎng)絡(luò)設(shè)備搭建一個(gè)測試環(huán)境,有時(shí)甚至直接使用實(shí)驗(yàn)室的局域網(wǎng)進(jìn)行一些基本功能的測試驗(yàn)證。但是,通常的情況是網(wǎng)絡(luò)應(yīng)用程序能在實(shí)驗(yàn)室網(wǎng)絡(luò)環(huán)境中正常的工作,一旦拿到實(shí)際的使用的生產(chǎn)網(wǎng)絡(luò)環(huán)境中就容易出錯(cuò)。大多數(shù)測試網(wǎng)絡(luò)無法顧及同實(shí)際生產(chǎn)網(wǎng)絡(luò)相關(guān)的問題。
(二)利用生產(chǎn)網(wǎng)絡(luò)
生產(chǎn)網(wǎng)絡(luò)就是網(wǎng)絡(luò)應(yīng)用程序最終工作時(shí)所處的網(wǎng)絡(luò)。測試網(wǎng)絡(luò)應(yīng)用程序最精密的方法就是在生產(chǎn)網(wǎng)絡(luò)環(huán)境中實(shí)際運(yùn)行程序,和實(shí)際的情況完全一樣。但是,這種方法也有其不利的一面。首先,開發(fā)人員通常無法接觸最終的使用環(huán)境,幾乎所有的商業(yè)網(wǎng)絡(luò)應(yīng)用程序都是這樣。其次,即使開發(fā)人員能夠使用最終的生產(chǎn)網(wǎng)絡(luò),直接使用生產(chǎn)網(wǎng)絡(luò)進(jìn)行測試也是一種不安全的行為。被測程序一旦失控,比如耗盡了所有的帶寬影響的別的程序,破壞了其他的有用數(shù)據(jù),后果都將是災(zāi)難性的。
(三)利用網(wǎng)絡(luò)仿真
折中的方案就是網(wǎng)絡(luò)仿真器。網(wǎng)絡(luò)仿真器在一臺(tái)設(shè)備中對整個(gè)生產(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)鍵是可以對真實(shí)的網(wǎng)絡(luò)行為進(jìn)行細(xì)致的仿真,把實(shí)際網(wǎng)絡(luò)中的問題再現(xiàn)在測試網(wǎng)絡(luò)中。
如圖1所示,網(wǎng)絡(luò)仿真器通常被安插在被測網(wǎng)絡(luò)應(yīng)用程序的客戶端與服務(wù)器之間。用以模擬實(shí)際生產(chǎn)網(wǎng)絡(luò)中處在客戶端與服務(wù)器之間的所有網(wǎng)絡(luò)對數(shù)據(jù)包產(chǎn)生的影響。例如通信一端在另一個(gè)網(wǎng)絡(luò),客戶端在本地,網(wǎng)絡(luò)仿真器模擬的就是廣域網(wǎng)對數(shù)據(jù)包的影響;又比如通信的兩端在局域網(wǎng),那么網(wǎng)絡(luò)仿真器模擬的就是本地局域網(wǎng)。當(dāng)數(shù)據(jù)包進(jìn)入網(wǎng)絡(luò)仿真器之后,仿真器就會(huì)按照實(shí)際被仿真的網(wǎng)絡(luò)的模型按照一定的策略對數(shù)據(jù)包進(jìn)行處理。常見的如帶寬限制、延時(shí)、錯(cuò)誤、丟包、重復(fù)等等。
通過對比以上幾種網(wǎng)絡(luò)應(yīng)用程序測試的方法,可以看出用網(wǎng)絡(luò)仿真構(gòu)建的測試環(huán)境相對來說有近似度高、成本低、安全性好的優(yōu)點(diǎn),非常適合對于嵌入式設(shè)備的網(wǎng)絡(luò)功能進(jìn)行測試。本文將要介紹一種利用linux內(nèi)建的流量控制(Traffic Control,TC)功能搭建一個(gè)網(wǎng)絡(luò)仿真平臺(tái)的方法。
三、Linux的流量控制機(jī)制在網(wǎng)絡(luò)仿真平臺(tái)中的應(yīng)用
Linux從內(nèi)核2.1版本開始嘗試支持流量控制(Traffic Control,TC),之后發(fā)布的2.2版本內(nèi)核是第一個(gè)支持流量控制的穩(wěn)定版本。TC成為Linux下的流量控制工具,用戶可以通過TC工具包提供的接口控制內(nèi)核進(jìn)行流量控制。
目前的從2.4版本的內(nèi)核開始,流量控制可以在入口(Ingress)隊(duì)列和出口(egress)隊(duì)列進(jìn)行。
TC對數(shù)據(jù)包進(jìn)入入口和出口隊(duì)列的控制主要由三個(gè)關(guān)鍵部分實(shí)現(xiàn):隊(duì)列規(guī)則(Queue Discipline,qdisc)、類別(Class)、過濾器(Filter)。
如圖2,數(shù)據(jù)包在進(jìn)入入口隊(duì)列或出口隊(duì)列前會(huì)由過濾器按照用戶給定的篩選方法分類,每一個(gè)分類對應(yīng)一個(gè)隊(duì)列規(guī)則。在某一類中的數(shù)據(jù)包全部按照該隊(duì)列規(guī)則排隊(duì)等候處理或發(fā)送。
(一)帶寬控制的實(shí)現(xiàn)
具體的排隊(duì)規(guī)則分為可分類的和不可分類的兩種。不可分類的包括TBF(Token Bucket Filter,令牌桶過濾器)、pfifo_fast(Third Band First In First Out Queue,先進(jìn)先出隊(duì)列)、SFQ(Stochastic Fairness Queuing,隨機(jī)公平隊(duì)列)。可分類的包括CBQ(Class Based Queuing,基于類別排隊(duì))、HTB(Hierarchical Token Bucket,分層令牌桶)、PRIO。
在進(jìn)行網(wǎng)絡(luò)仿真過程中,我們需要對網(wǎng)絡(luò)的帶寬進(jìn)行控制。在上面介紹的排隊(duì)規(guī)則中可以選擇TBF令牌桶過濾器來進(jìn)行流量整形。
令牌桶只允許不超過事先設(shè)定的速率到來的數(shù)據(jù)包通過。實(shí)際中的桶是一個(gè)緩沖器,這個(gè)“桶”不斷被恒定速率的虛擬數(shù)據(jù)“令牌”(Token)填充著,到來的數(shù)據(jù)包只有拿到令牌才可以從桶里發(fā)送出去。
(二)丟包率、時(shí)延的仿真
在2.6.7之后版本的Linux中引入了netem模塊,這個(gè)模塊是Stephen Hemminger在QOS(Quality of Service)和di_serv(Differentiated Services)的基礎(chǔ)上開發(fā)的工具。Netem是作為TC的一個(gè)排隊(duì)規(guī)則(qdisc)來使用的,通過netem的接口可以非常靈活方便地對所有離開特定網(wǎng)絡(luò)端口的數(shù)據(jù)分組進(jìn)行以下幾種處理:
延遲(delay) 按照某種統(tǒng)計(jì)模型延遲每一個(gè)分組
丟棄(loss) 按照一定百分比丟棄某些分組
復(fù)制(duplication) 按照一定百分比復(fù)制一些相同的分組
重排序(reordering) 對一組分組中某一個(gè)進(jìn)行延遲以打亂最終接收到的順序
綜合利用tc和netem提供的這些功能的組合可以對網(wǎng)絡(luò)的基本參數(shù)進(jìn)行仿真。
四、應(yīng)用舉例
工作中需要對一個(gè)車載的移動(dòng)嵌入式設(shè)備的網(wǎng)絡(luò)功能性能進(jìn)行測試。實(shí)際工作中的設(shè)備工作在移動(dòng)的列車上,通過無線網(wǎng)絡(luò)與地面中心通信。我們利用一臺(tái)電腦對無線網(wǎng)絡(luò)的傳輸率丟包延時(shí)等進(jìn)行仿真。
實(shí)現(xiàn)如上圖,用一臺(tái)裝有雙網(wǎng)卡的運(yùn)行Linux的機(jī)器作為無線網(wǎng)絡(luò)的仿真器。具體配置如下:
車載移動(dòng)被測設(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進(jìn)行帶寬限制處理,再通過netem進(jìn)行丟包率和時(shí)延的處理。這樣配置之后帶寬被限制在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,在只使用令牌桶的情況下可以達(dá)到1Mbps。
五、結(jié)束語
本文介紹了一種利用linux的流量控制功能搭建網(wǎng)絡(luò)仿真平臺(tái)對嵌入式網(wǎng)絡(luò)設(shè)備進(jìn)行測試的方法,在實(shí)際使用中發(fā)現(xiàn)tc參數(shù)只能在開始仿真之前靜態(tài)手動(dòng)設(shè)置好,而不能在使用過程中動(dòng)態(tài)自動(dòng)調(diào)節(jié)。我們希望找到一種方法能夠在仿真過程中實(shí)時(shí)調(diào)整延遲、丟包等參數(shù),更加逼真的對如基站切換造成的周期性網(wǎng)絡(luò)性能變化進(jìn)行仿真。
參考文獻(xiàn):
[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ò)流量控制機(jī)制,2006-08.
作者簡介:
高嵐,男,漢,山東泰安,同濟(jì)大學(xué),電子與信息工程學(xué)院,碩士研究生,研究方向:嵌入式系統(tǒng)及應(yīng)用。