王真真 黃 濤 尹曉偉 宋樹麗 左 珺 陳書旺
(河北科技大學 石家莊 050018)
無線自組織網(wǎng)絡(luò)相比于其它網(wǎng)絡(luò)具有系統(tǒng)靈活,自適應(yīng),抗故障,不需要基礎(chǔ)設(shè)施的優(yōu)點,所以在上世紀70年代一些國家對無線自組網(wǎng)就進行了研究。路由協(xié)議是無線Mesh網(wǎng)絡(luò)的核心內(nèi)容之一,高效、可靠的路由協(xié)議是系統(tǒng)正常運行的保證。本文使用BATMAN adv 路由協(xié)議實現(xiàn)了多跳的自組網(wǎng)系統(tǒng)。該協(xié)議路由算法在路徑選擇上遵循最優(yōu)下一跳的原則,不需要掌握全網(wǎng)的拓撲結(jié)構(gòu),因其開源、輕量化、2.5層實現(xiàn)等特點,使其具備了提高網(wǎng)絡(luò)傳輸效率和降低能耗的優(yōu)勢,從而受到科研開發(fā)的青睞而應(yīng)用廣泛[1-2]。
無線自組織網(wǎng)中的節(jié)點具有終端和轉(zhuǎn)發(fā)器的功能,是一種多跳,無中心,臨時的自治系統(tǒng)。多跳:節(jié)點發(fā)射功率是有限制的,當遠距離通信時,源節(jié)點和目的節(jié)點不能直接發(fā)送信息,需要通過中間節(jié)點作為中繼進行轉(zhuǎn)發(fā)。無中心:每個節(jié)點都是對等的,不需要控制中心。臨時性:適用于一些緊急場合,臨時構(gòu)成網(wǎng)絡(luò)進行發(fā)送信息。常被用在商業(yè),災(zāi)害和軍事現(xiàn)場。它具有便捷和可移動的特性,是當今社會不可缺失的一種網(wǎng)絡(luò)形式[3]。
由于網(wǎng)絡(luò)系統(tǒng)經(jīng)常用在突發(fā)場合,節(jié)點依靠電池進行供電,所以能量有限,如何利用有限的能量來進行數(shù)據(jù)最大的傳輸是當今最大的挑戰(zhàn)之一,通過對各種自組網(wǎng)路由協(xié)議的比較,使用這新型的路由協(xié)議—BATMAN adv,并且對該協(xié)議進行更優(yōu)的配置,提高網(wǎng)絡(luò)的吞吐量,傳輸速率,降低了丟包率[4],使無線自組網(wǎng)的性能有了極大的提高,延長了系統(tǒng)的使用時間。
2.1.1 BATMAN adv介紹
BATMAN adv(Better Approach To Mobile Ad-Hoc Networking)是一種新型的無線路由協(xié)議。它是在BATMAN協(xié)議(工作在網(wǎng)絡(luò)層)上進行改進的一種協(xié)議,所以它仍然保存著第三層的功能[5]。BATMAN adv路由協(xié)議幀采用原始以太網(wǎng)幀進行傳輸,并且它還對數(shù)據(jù)流進行處理,封裝轉(zhuǎn)發(fā)數(shù)據(jù)報文,直接到達目的節(jié)點。如同一個虛擬的二層交換網(wǎng)絡(luò),在無線自組網(wǎng)中使用這個協(xié)議,節(jié)點不需要保存整個網(wǎng)絡(luò)的拓撲結(jié)構(gòu),只保存最優(yōu)下一跳節(jié)點的信息,使得該協(xié)議更加輕量化,收斂速度相比于其它協(xié)議更快,運行效率相比其它也更高。
BATMAN adv協(xié)議是基于減小功耗和提高鏈路連接的穩(wěn)定性而產(chǎn)生的路由協(xié)議,以LINUX內(nèi)核的方式在數(shù)據(jù)鏈路層上運行,所以當接收到數(shù)據(jù)包時,可以在內(nèi)核空間直接進行處理,實現(xiàn)數(shù)據(jù)快速轉(zhuǎn)發(fā),在很大程度上減少了CPU的內(nèi)存。它工作在鏈路層,對網(wǎng)絡(luò)層是比較透明的,所以網(wǎng)絡(luò)層可以運行各種協(xié)議,系統(tǒng)靈活性更高[6]。
2.1.2 BATMAN adv數(shù)據(jù)包格式
BATMAN adv數(shù)據(jù)包有8種不同的格式,最主要的是BATADV_IV_OGM,它通常被稱為OGM包,用于節(jié)點發(fā)現(xiàn)和路由建立,同時根據(jù)接收到的OGM包來進行鏈路檢測。通常把OGM包代指BATMAN adv數(shù)據(jù)包,OGM報文幀格式如圖1所示。
類型版本生存時間標志位序列號源節(jié)點MAC地址(前4字節(jié))源節(jié)點MAC地址后2字節(jié)上一跳MAC地址后2字節(jié)上一跳MAC地址(后4字節(jié))保留字段TQTVLV長度
圖1OGM幀格式
有關(guān)內(nèi)容說明如下:
1)類型是區(qū)分數(shù)據(jù)包的類型;
2)版本是協(xié)議的版本號;
3)序列號是為了辨別同一個OGMs是否被多處接收,區(qū)分OGM包的新舊,在路由選擇中至關(guān)重要;
4)存活時間(TTL)是生存周期,也就是最大轉(zhuǎn)發(fā)跳數(shù);
5)TQ是鏈路傳輸質(zhì)量,對于路徑的選擇起著至關(guān)重要的作用。
2.1.3 源節(jié)點數(shù)據(jù)結(jié)構(gòu)
協(xié)議運行的主要目標是要維護網(wǎng)絡(luò)中所有可達的節(jié)點列表,用作之后的路由的依據(jù)。每個節(jié)點有多個網(wǎng)絡(luò)接口,為了減少網(wǎng)絡(luò)開銷,會選擇一個主接口,作為該節(jié)點的標識,當向外廣播數(shù)據(jù)包時,主接口發(fā)出的OGM的TTL為64,而其他接口為2。這樣只有主接口會向二個節(jié)點以外的進行廣播,減少了OGM洪泛的資源消耗。每個節(jié)點都有維護著一個結(jié)構(gòu)batadv_orig_node,這個結(jié)構(gòu)體中存儲路由信息,并且會隨著接收的OGM進行更新,下面介紹該結(jié)構(gòu)體中的關(guān)鍵部分。
1)orig[ETH_ALEN]:本協(xié)議是第二層協(xié)議,所以代表源節(jié)點的MAC地址。
2) ifinfo_list:源節(jié)點網(wǎng)絡(luò)接口列表。每當從一個接口接收到OGM包,如果這個接口沒有在ifinfo_list列表中,會重新創(chuàng)建一個結(jié)構(gòu)batadv_orig_ifinfo,每一個接口都有對應(yīng)的結(jié)構(gòu)體存儲所有到該源節(jié)點的信息。
該結(jié)構(gòu)包含的主要內(nèi)容有:if_outgoing(發(fā)送接口);router(源節(jié)點的下一跳的信息,代表的是最下一跳,并且代表一個batadv_neigh_node結(jié)構(gòu)體);last_real_seqno(收到最近 OGM 的序列號); last_ttl (最近收到的OGM的TTL值,TTL代表生存時間,經(jīng)過一跳它會減一)。
3)last_seen:最近一次收到來自本源節(jié)點的 OGM數(shù)據(jù)包的時間。
4)neigh_list:所有可以到達該節(jié)點的鄰居信息列表,就是中間所有能到達的鄰居節(jié)點,router是它中的最優(yōu)的鄰居節(jié)點。每從一個新的鄰居接收該源節(jié)點的 OGM ,就會創(chuàng)建一個batadv_neigh_node 結(jié)構(gòu)體,并把它加入鏈表中:從中找出最優(yōu)的鄰居作為到達目的節(jié)點的下一跳。
5)bat_iv:里面的數(shù)據(jù)結(jié)構(gòu)batadv_neigh_ifinfo_bat_iv,tq_avg是緩沖區(qū)里TQ的平均值。real_bits和real_packet_count用來計算該鄰居節(jié)點的TQ值。
2.1.4 滑動窗口
通過統(tǒng)計節(jié)點接收到的OGM幀的數(shù)量來判斷鏈路的質(zhì)量,記錄的序列號的個數(shù)是檢測鏈路質(zhì)量的準則。在網(wǎng)絡(luò)的傳輸過程中,可能有的OGM幀會丟失或者信息失效,那么這種OGM需要丟棄,所以滑動窗口會不斷進行更新,維護一組有效的序列號[7]?;瑒哟翱诘脑砣鐖D2所示。
圖2 滑動窗口機制
滑動窗口的大小是不變的,而窗口是隨著接收到OGM的序列號的更新進行變化。當接收到的OGM的序列號在滑動窗口的范圍內(nèi),僅記錄OGM的信息,同時將統(tǒng)計計數(shù)器加1,窗口不會發(fā)生移動;當序列號比窗口中任何序列號都小時,該包將被丟棄;當序列號比窗口中的任何值都大時,滑動窗口會將它設(shè)為最新的序列號之一,窗口會向右邊移動。
2.2.1 OGM的接收轉(zhuǎn)發(fā)
1)節(jié)點會周期性的向外廣播OGM包,它的主要功能有:告知源節(jié)點的存在,找出可能的下一跳路由;計算出可能下一跳路由的鏈路質(zhì)量。
2)節(jié)點在收到來自其他節(jié)點的 OGM 數(shù)據(jù)包之后,按照一定的規(guī)則向外廣播,使得一個節(jié)點發(fā)出的 OGM 消息可以洪泛到全網(wǎng)所有節(jié)點。為了減少消息洪泛的開銷,對于同一個 OGM 數(shù)據(jù)包,每個節(jié)點只會接收一次。所以,一個 OGM 數(shù)據(jù)包的洪泛過程會在出現(xiàn)如下幾種情況中的一種后停止:全網(wǎng)的所有節(jié)點都至少接收了該OGM數(shù)據(jù)包一次;該 OGM 數(shù)據(jù)包在鏈路中全部丟失;該OGM數(shù)據(jù)包 TTL 值降到 0。
3)節(jié)點把自己的MAC地址放入到OGM的消息中,然后周期性地進行廣播。其它節(jié)點當收到OGM后,會根據(jù)里面的信息對該數(shù)據(jù)包進行處理。判斷丟棄數(shù)據(jù)包或者更新自己的節(jié)點列表,然后再把接收到的OGM包進行轉(zhuǎn)發(fā)。
2.2.2 BATMAN adv傳輸質(zhì)量的計算
OGM消息是周期性地向外發(fā)送,那么可以通過OGM數(shù)據(jù)包進行路由度量,生成一條最優(yōu)路徑。在BATMAN adv路由協(xié)議中,鏈路度量值稱為 TQ(Transmission Quality)[8]。路由度量包含本地鏈路質(zhì)量和全局鏈路質(zhì)量。一個節(jié)點會存儲到達目的節(jié)點的多條路徑的 TQ 值,當需要與其他節(jié)點進行通信時,選取擁有最大 TQ 值的傳輸路徑作為最佳路由向外發(fā)送。
1)本地鏈路質(zhì)量如圖3所示:將發(fā)射鏈路質(zhì)量除以接收鏈路質(zhì)量來計算傳輸鏈路質(zhì)量(TQ),向鄰居節(jié)點成功傳輸?shù)母怕省S嬎愎剑?/p>
TQ=EQ/RQ
(1)
圖3(a)是RQ(接收鏈路質(zhì)量):A節(jié)點參照滑動窗口記錄的從鄰居節(jié)點收到的OGM數(shù)據(jù)包的數(shù)量。
圖3(b)是EQ(發(fā)射鏈路質(zhì)量):觀察自己的滑動窗口記錄的接收到經(jīng)由相鄰節(jié)點轉(zhuǎn)發(fā)回來的自己的OGM的數(shù)量。
圖3 本地鏈路質(zhì)量
2)全局鏈路質(zhì)量如圖4:源節(jié)點廣播0GM包TQ值最大為255,接收到的OGM包的節(jié)點將自己本地的TQ(global)與接收到OGM中的TQ(received)相乘,作為轉(zhuǎn)發(fā)的TQ值,所以說節(jié)點收到的TQ就是該節(jié)點到其它節(jié)點整個鏈路的質(zhì)量,可以根據(jù)TQ值的大小判斷最優(yōu)下一跳,一次類推則可以求出整條鏈路的質(zhì)量。
圖4 全局鏈路質(zhì)量
B收到A傳來的TQ=100%,接收到的值與B處的TQ進行相成,得到的TQ(global)=100%*90%,用這個結(jié)果的TQ值進行數(shù)據(jù)的轉(zhuǎn)發(fā),以此類推得到C點要轉(zhuǎn)發(fā)的TQ(global)=90%*80%,然后進行廣播。通過全局鏈路質(zhì)量找出最優(yōu)的鏈路進行數(shù)據(jù)的傳輸提高了整個系統(tǒng)的傳輸性能[9]。
2.2.3 BATMANadv路由切換的設(shè)計
在無線自組網(wǎng)絡(luò)系統(tǒng)中,當一個節(jié)點設(shè)備發(fā)生失靈或其中一個鏈路中斷的情況時,BATMAN adv協(xié)議會根據(jù)TQ值重新計算最優(yōu)下一跳,切換路徑進行數(shù)據(jù)的傳輸,提高數(shù)據(jù)的傳輸速率。在不斷改變的路由場景中,由節(jié)點A、節(jié)點N、節(jié)點B和節(jié)點M組合成的一個自組織網(wǎng)絡(luò),如圖5所示。在該網(wǎng)格中,節(jié)點A與節(jié)點N作為兩個相鄰節(jié)點,當A在網(wǎng)格中移動時,節(jié)點A從相鄰節(jié)點N的廣播范圍內(nèi)移動到M的廣播范圍內(nèi),并且節(jié)點A作為節(jié)點M相鄰節(jié)點,在這種情況下,A和B之間的路線將盡可能快地恢復,提高數(shù)據(jù)鏈路的傳輸效率。
圖5 路由場景
選用樹莓派作為節(jié)點組成自組網(wǎng)系統(tǒng).樹莓派就是小型計算機,所以它可以燒錄系統(tǒng),并且可以運行Linux系統(tǒng)。該系統(tǒng)選用4.9Linux內(nèi)核的Debian系統(tǒng),無線網(wǎng)卡:支持2.4GHz和5GHz IEEE 802.11.b/g/n/ac無線局域網(wǎng),在2.6.38以后的Linux內(nèi)核版本中已集成BATMAN adv內(nèi)核模塊并且Linux 內(nèi)核可以實現(xiàn) Ad Hoc 功能。
系統(tǒng)采用ARM處理器內(nèi)核的Raspberrypi 3b作為自組織網(wǎng)絡(luò)的通信節(jié)點,以支持2.4GHz和5GHz信道的板載無線網(wǎng)卡配置成網(wǎng)絡(luò)模塊,選用Debian系統(tǒng)作為嵌入式系統(tǒng),4.9Linux-kernel內(nèi)核作為開發(fā)板搭配固件內(nèi)核交叉編譯,可以直接載入系統(tǒng)運行,所以只要構(gòu)建BATMAN adv協(xié)議應(yīng)用程序編譯成內(nèi)核樹模塊并運行在網(wǎng)卡芯片中,就可以實現(xiàn)自組網(wǎng)功能。運行自組織網(wǎng)絡(luò)程序開始時,先檢測是否有節(jié)點加入該自組織網(wǎng)絡(luò),若是,則增加節(jié)點并且分配路由表,直接構(gòu)建好自組織網(wǎng)絡(luò)。當每個節(jié)點都分配好路由表后,自組織網(wǎng)絡(luò)構(gòu)建成功并提供給所有節(jié)點通信。
Batctl為配置和調(diào)試batman-adv內(nèi)核模塊進行設(shè)計的工具,通過此工具可以顯示出調(diào)試信息,如源節(jié)點列表,翻譯表以及調(diào)試日志等,于是該系統(tǒng)利用它來對網(wǎng)絡(luò)進行參數(shù)設(shè)置。與其他工具不同的是此工具包能夠在數(shù)據(jù)鏈路層提供與IP標準功能相似的命令。BATMAN adv工作在數(shù)據(jù)鏈路層,所以尋址使用的是數(shù)據(jù)鏈路層的地址。通過網(wǎng)絡(luò)工具包Batctl的使用在加上ifconfig,iwconfig等linux操作指令就可以對節(jié)點進行配置。配置之前把batctl工具在linux上進行交叉編譯。
然后搭建adhoc模式,運行BATMAN adv模塊,在/home/pi中創(chuàng)建一個batsetup-rpi3.sh的文件對系統(tǒng)進行配置,里面包含對個各功能的配置:
1)配置BATMAN adv路由協(xié)議的指令為sudo modprobe batman-adv,開機自動啟動BATMAN adv內(nèi)核模塊;
2)網(wǎng)絡(luò)模式進行配置sudo iwconfig wlan0 mode ad-hoc,使網(wǎng)卡在Ad hoc模式下工作;
3)將mtu設(shè)置為1532指令為 sudo ifconfig wlan0 mtu 1532:
4)wlan0是無線網(wǎng)卡設(shè)備名,在不同的設(shè)備上,網(wǎng)卡名可能不同。my-mesh-network為無線網(wǎng)絡(luò)的服務(wù)集標識,用來區(qū)分不同的網(wǎng)絡(luò),無線設(shè)備要實現(xiàn)互相連接,需要具有相同的 essid。指令為 sudo iwconfig wlan0 essid my-mesh-network。
配置好linux系統(tǒng)和BATMAN adv協(xié)議以后重新啟動樹莓派,基于BATMAN adv協(xié)議的自組網(wǎng)系統(tǒng)就搭建完成了。
無線自組網(wǎng)系統(tǒng)的節(jié)點具有移動的特性,所以路徑切換,傳輸中選擇合適的路徑是系統(tǒng)必須研究的問題。路徑切換地快慢,受傳輸距離、環(huán)境和ogm包的發(fā)送間隔的影響,在配置中適當?shù)馗淖僌GM包周期進行測試。
實驗使用batctl工具,對路由協(xié)議進行配置,以及信息調(diào)試。可以實現(xiàn)數(shù)據(jù)鏈路層的ping,tr,tg等命令,對系統(tǒng)的傳輸質(zhì)量、丟包情況、傳輸延遲、吞吐量進行了測試。通過batctl中的traceroute命令來檢測節(jié)點的傳輸路徑。由于自組網(wǎng)是用于自然災(zāi)害等臨時場合,所以我們選擇在具有障礙物的教學樓內(nèi)進行測試。表1為節(jié)點地址,圖6為四個樹莓派的分布圖。
圖6 四臺樹莓派測試結(jié)構(gòu)圖
表1 節(jié)點地址
節(jié)點MAC地址設(shè)置的靜態(tài)IPAb8:27:eb:ba:f1:2e10.0.0.1Bb8:27:eb:74:7b:9910.0.0.2Cb8:27:eb:4f:97:f910.0.0.3Db8:27:eb:76:d1:c910.0.0.4
給B,C,D三臺樹莓派上電,在樹莓派C中通過batctl工具包輸入sudo batctl tg命令,可以發(fā)現(xiàn)周圍的節(jié)B和D,并且以打印的形式把周圍其它兩個節(jié)點MAC地址打印出來。測試結(jié)果如圖7所示。
圖7 節(jié)點發(fā)現(xiàn)
關(guān)閉A和B兩臺樹莓派,只開啟C和D并放在相鄰位置,C節(jié)點作為發(fā)送節(jié)點,使用ping命令與D進行連接,實驗結(jié)果如圖8所示,可以發(fā)現(xiàn)丟包率為0,平均時延為12s,平均時延與周圍的環(huán)境和兩臺距離相關(guān)。該節(jié)點是在有障礙物的大概12m的距離進行測試的。
圖8 單跳網(wǎng)絡(luò)
在多跳網(wǎng)絡(luò)中,發(fā)起節(jié)點到目標節(jié)點的數(shù)據(jù)吞吐量測試,可達到2.15Mbps的傳輸效率,測試結(jié)果如圖9所示。
圖9 吞吐量測試
當A和D不在傳輸范圍內(nèi)的時候,需要通過中間第二個節(jié)點作為中繼進行轉(zhuǎn)發(fā),這里把B當作中繼,對A和D進行測試的結(jié)果如圖10所示。
圖10 測試結(jié)果
根據(jù)圖10照片可以發(fā)現(xiàn),丟包率為0,最小時延為9ms,平均時延為15ms,可以發(fā)現(xiàn)比相鄰兩節(jié)點的傳輸時延變大,但是丟包率仍然都為0。
1)如圖9所示,當節(jié)點A與D通信時,由B作為中間節(jié)點,當B突然間關(guān)閉,路徑的變化情況如圖11所示。
圖11 變化情況圖
由圖11可以發(fā)現(xiàn)剛開始把B當作中間節(jié)點進行轉(zhuǎn)發(fā),當B發(fā)生損壞時,她會重新計算TQ值,尋找新的路徑,最后把C作為中間節(jié)點進行轉(zhuǎn)發(fā)。由圖可以發(fā)現(xiàn)A向D發(fā)送了57個包,但是只接收到30個,丟包率達到47%,平均時延為37ms,可見路徑的切換對路徑的傳輸效率有很大的影響。
2)添加滑動窗口保護機制的路徑切換
通過增加一種保護機制來提高路由的收斂速度。由于節(jié)點剛開始時,節(jié)點的本地鏈表信息由于沒有完成初始化,因此當接收到序列號信息并對其序列號值和本地存儲的最新序列號值做差值運算得到的值可能超出正常的窗口范圍,引起不必要的滑動窗口重置。進一步導致節(jié)點信息列表更新延時,降低路由的收斂速度。因此通過添加開關(guān)防止出現(xiàn)此情況。開關(guān)檢查節(jié)點的本地節(jié)點信息列表,如果為空則關(guān)閉滑動窗口保護機制,一旦成功接受到一個信息,并且本地節(jié)點信息表中有鄰居節(jié)點加入則開啟滑動窗口保護機制,這樣不僅防止節(jié)點的錯誤選路而且能在一定程度上提高路由的收斂速度。
圖12 切換變化圖
由圖12可知當路徑發(fā)生切換時,A向D發(fā)送了59個包,接收到了41個,相比于優(yōu)化之前的丟包率有明顯的降低,達到了30%以內(nèi),平均時延也降低達到29ms,傳輸效率有了明顯的提高。
在已有研究基礎(chǔ)上對該協(xié)議進行了更加深入的研究,并通過搭建系統(tǒng)對其性能進行了驗證,由此發(fā)現(xiàn)丟包率和傳輸質(zhì)量有很大的改善。由于BATMAN adv協(xié)議比較適合無線自組網(wǎng)拓撲結(jié)構(gòu)的改變,所以在路徑切換上很明顯的優(yōu)勢。并通過滑動窗口的保護機制,在系統(tǒng)丟包率,傳輸時延和吞吐量有了很大的改善。
本文為BATMAN adv協(xié)議的研究以及搭建基于BATMAN adv協(xié)議的自組網(wǎng)系統(tǒng)起到一定的借鑒作用。在系統(tǒng)中,降低了網(wǎng)絡(luò)的開銷,不需要掌握整個網(wǎng)絡(luò)的拓撲,就可以找出最優(yōu)路徑,尋找出好的下一跳,不僅適用小型的無線自組網(wǎng),而且適用于多節(jié)點的大型系統(tǒng),所以選擇BATMAN adv協(xié)議作為自組網(wǎng)系統(tǒng)研究的路由協(xié)議,該系統(tǒng)是通過4個樹莓派構(gòu)成的網(wǎng)絡(luò)進行的測試,下一步我們會增加系統(tǒng)的節(jié)點以模擬自然災(zāi)害場景下的無線自組網(wǎng)絡(luò)系統(tǒng),來對該路由協(xié)議進行進一步的測試研究。