李 棟,陳慈飛,吳佳琪,陳民華
(重慶郵電大學(xué) 通信與信息工程學(xué)院,重慶 400065)
隨著互聯(lián)網(wǎng)的飛速發(fā)展,規(guī)模不斷壯大,衍生出了眾多的新場(chǎng)景、新業(yè)務(wù)。由于傳統(tǒng)網(wǎng)絡(luò)存在運(yùn)營(yíng)成本大、效率低下等缺點(diǎn),已經(jīng)無法滿足當(dāng)前網(wǎng)絡(luò)的發(fā)展趨勢(shì)和要求,逐漸與互聯(lián)網(wǎng)的發(fā)展相脫節(jié)。IBM公司于2001年首次提出自治網(wǎng)絡(luò)的概念[1],其基本目標(biāo)是實(shí)現(xiàn)網(wǎng)絡(luò)自我管理、自我配置、自我優(yōu)化、自我修復(fù)、自我保護(hù)以及可擴(kuò)展性等特點(diǎn)。
自治功能需要穩(wěn)定的基礎(chǔ)架構(gòu)來運(yùn)行,以最大程度地降低網(wǎng)絡(luò)復(fù)雜性。如今,大多數(shù)關(guān)鍵的控制平面協(xié)議和網(wǎng)絡(luò)管理協(xié)議都在使用網(wǎng)絡(luò)的數(shù)據(jù)平面。這通常導(dǎo)致一側(cè)的控制和管理平面與另一側(cè)的數(shù)據(jù)平面之間的不良依存關(guān)系。因此,ANIMA工作組定義自治控制平面 (Autonomic Control Plane,ACP)來為網(wǎng)絡(luò)提供獨(dú)立于數(shù)據(jù)平面的控制平面,為網(wǎng)絡(luò)的高效通信提供基礎(chǔ),而ACP中通信需要滿足自治屬性的RPL路由協(xié)議來支撐。本文將從協(xié)議的設(shè)計(jì)、軟件開發(fā)以及軟件的測(cè)試和分析幾個(gè)方面來講述整個(gè)協(xié)議的原理與實(shí)現(xiàn)過程。
2007年歐盟委員會(huì)啟動(dòng)了第七框架計(jì)劃,同年該計(jì)劃推出了EFIPSANS項(xiàng)目[2]。該項(xiàng)目旨在分析當(dāng)前互聯(lián)網(wǎng)中所存在的缺陷,探討未來自治管理互聯(lián)網(wǎng)的體系結(jié)構(gòu)、行為特征及實(shí)現(xiàn)方法。在IPv6基礎(chǔ)上探索、研究并創(chuàng)建新型的自治網(wǎng)絡(luò)。2014年IETF的ANIMA(Autonomic Network Integrated Model and Approach)工作組在GANA[3]的研究基礎(chǔ)上,提出了自己的自治網(wǎng)絡(luò)架構(gòu),本著設(shè)計(jì)基礎(chǔ)、可重用的組件與分布式的思想,定義了三個(gè)具體的部分:自治控制平面(Autonomic Control Plane,ACP)[4]、通用自治信令協(xié)議(Generic Autonomic Signaling Protocol,GRASP)[5]和安全自啟動(dòng)機(jī)制(Bootstrap Key Infrastructure,BRSKI)[6]。
自治功能需要穩(wěn)定的基礎(chǔ)架構(gòu)來運(yùn)行,并且所有自治功能都應(yīng)使用相同的基礎(chǔ)架構(gòu),以最大程度地降低網(wǎng)絡(luò)的復(fù)雜性。如今,大多數(shù)關(guān)鍵的控制平面協(xié)議和網(wǎng)絡(luò)管理協(xié)議都在使用網(wǎng)絡(luò)的數(shù)據(jù)平面。這通常導(dǎo)致一側(cè)的控制和管理平面與另一側(cè)的數(shù)據(jù)平面之間的不良依存關(guān)系,只有正確配置數(shù)據(jù)平面的轉(zhuǎn)發(fā)和控制平面,數(shù)據(jù)平面和管理平面才能正常工作。在傳統(tǒng)的網(wǎng)絡(luò)管理方法中,可以通過帶外虛擬(Out of Band)技術(shù)[7]解決這些問題,但是其過高的成本與代價(jià)很大程度上限制了該技術(shù)的進(jìn)一步推廣。因此,ANIMA工作組定義了ACP自治控制平面來為自治域中的自治節(jié)點(diǎn)提供通信,ACP提供了強(qiáng)大而安全的通信覆蓋,同時(shí)實(shí)現(xiàn)了控制平面和數(shù)據(jù)平面的隔離。
為了滿足無線傳感器網(wǎng)絡(luò)的要求,IETF(The Internet Engineering Task Force)工作組在2008年成立了ROLL小組,ROLL小組提出了基于IPv6的低功耗有損網(wǎng)絡(luò)路由協(xié)議RPL[8]。在實(shí)際中,ContikiOS和TinyOS是兩種最流行的操作系統(tǒng),而TelosB是測(cè)試平臺(tái)上最常用的硬件平臺(tái)。在開源實(shí)現(xiàn)方面,兩個(gè)最廣泛使用的開源RPL實(shí)現(xiàn)分別是ContikiOS的Contiki RPL[9]和TinyOS中的Tiny RPL[10],并且這些實(shí)現(xiàn)幾乎已經(jīng)用于涉及真實(shí)實(shí)驗(yàn)的所有RPL研究活動(dòng)中。
路由協(xié)議承載著自治節(jié)點(diǎn)的通信需求,影響著整個(gè)網(wǎng)絡(luò)的性能和存活時(shí)間。RPL協(xié)議是一個(gè)基于標(biāo)準(zhǔn)化IPv6的距離矢量路由協(xié)議,節(jié)點(diǎn)通過交換距離矢量構(gòu)造一個(gè)有向無環(huán)圖(Destination Oriented Directed Acyclic Graph,DODAG),DODAG可以有效防止路由環(huán)路問題。由于RPL路由協(xié)議具有自我管理、自我配置的特性,龐大的規(guī)模以及拓展性強(qiáng)等特點(diǎn),ACP在標(biāo)準(zhǔn)實(shí)現(xiàn)中使用RPL路由協(xié)議來實(shí)現(xiàn)域內(nèi)數(shù)據(jù)多跳傳輸,但由于RPL路由協(xié)議本是應(yīng)用在無線傳感網(wǎng)絡(luò)中,而自治網(wǎng)絡(luò)基于有線環(huán)境,所以本文以ANIMA工作組提出的自治控制平面為基礎(chǔ),闡述自治控制平面中基于Linux操作系統(tǒng)的RPL路由協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)。
在自治域中將有很多類似NOC的節(jié)點(diǎn),但是只能選擇一個(gè)NOC節(jié)點(diǎn)作為當(dāng)前自治域中的根節(jié)點(diǎn),負(fù)責(zé)當(dāng)前域中自治節(jié)點(diǎn)的維護(hù)和管理,以及跨自治域流量交互等。整個(gè)自治域就是一個(gè)DODAG,DODAG的構(gòu)建主要包含上行路由和下行路由的構(gòu)建,其中上行路由和下行路由的構(gòu)建均是由DODAG Root發(fā)起,通過DIO,DAO,DAO-ACK,DIS控制消息完成DODAG的構(gòu)建。DODAG的構(gòu)建流程如圖1所示。
圖1 DODAG的構(gòu)建過程Fig.1 DODAG construction process
上行路由是指自治域中的自治節(jié)點(diǎn)到根節(jié)點(diǎn)方向的路由,當(dāng)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)無法獲得某些路由時(shí),將數(shù)據(jù)包向上默認(rèn)發(fā)給根節(jié)點(diǎn),同時(shí)當(dāng)兩個(gè)自治域中的節(jié)點(diǎn)進(jìn)行交互時(shí),也需要上行路由將其數(shù)據(jù)包送至根節(jié)點(diǎn),由根節(jié)點(diǎn)與其他域中根節(jié)點(diǎn)進(jìn)行轉(zhuǎn)發(fā)。模塊主要包括上行路由的構(gòu)建和維護(hù)兩部分。
上行路由的構(gòu)建與維護(hù)主要涉及兩種消息類型,分別為DODAG信息對(duì)象信息(DODAG Information object,DIO)和DODAG信息請(qǐng)求消息(DODAG Information Solicitation,DIS),具體消息實(shí)現(xiàn)格式代碼如圖2和圖3所示。
圖2 DIO消息格式Fig.2 DIO message format
圖3 DIS消息格式Fig.3 DIS message format
RPLInstance ID表示當(dāng)前DODAG所在RPL Instances中的ID號(hào);Version Number表示當(dāng)前DODAG的版本號(hào),主要用于保證DODAG中所有節(jié)點(diǎn)的網(wǎng)絡(luò)狀態(tài)同步,且其值隨著DODAG的更新而逐漸遞增;Rank的大小可以反映出當(dāng)前節(jié)點(diǎn)相對(duì)于根節(jié)點(diǎn)在DODAG中的相對(duì)位置;MOP表示節(jié)點(diǎn)加入DODAG中的操作模式:存儲(chǔ)模式和非存儲(chǔ)模式;DTSN表示觸發(fā)DAO控制消息的序列號(hào),主要用于維護(hù)和更新DODAG中的下行路由;DODAG ID是由DODAG Root分配的IPv6地址,表示當(dāng)前DODAG的ID號(hào),用于標(biāo)識(shí)每一個(gè)DODAG的身份,且每個(gè)DODAG ID不能重復(fù),必須唯一。Flags和Reserved 各占據(jù)1字節(jié),在發(fā)送端這兩個(gè)字段均默認(rèn)初始化設(shè)置為0,在接收端直接忽略這兩個(gè)字段。
上行路由的構(gòu)建過程由根節(jié)點(diǎn)廣播DIO消息請(qǐng)求周圍鄰居節(jié)點(diǎn)加入當(dāng)前DODAG開始,確定加入DODAG的自治節(jié)點(diǎn)將發(fā)送DIO的節(jié)點(diǎn)添加至自己的父節(jié)點(diǎn)集合中,同時(shí)構(gòu)造到父節(jié)點(diǎn)以及根節(jié)點(diǎn)的上行路由,上行路由的維護(hù)過程是從構(gòu)建完上行路由后開始,接收DIO消息的節(jié)點(diǎn)會(huì)判斷DIO消息中的Rank字段是否為INFINITE,若是,則從父節(jié)點(diǎn)集合中刪除該節(jié)點(diǎn);否則,會(huì)繼續(xù)判斷Version Number字段是否已經(jīng)改變了,若是,則將節(jié)點(diǎn)的Rank值設(shè)為INFINITE,廣播DIO狀態(tài)變?yōu)槲醇尤隓ODAG,斷開與之前節(jié)點(diǎn)之間的連接;否則,繼續(xù)判斷DIO消息是否來自其他的DODAG,若是,則判斷DIO中Prf字段是否大于當(dāng)前根節(jié)點(diǎn)的Prf,當(dāng)若大于當(dāng)前根節(jié)點(diǎn),則直接置Rank為INFINITE,廣播DIO消息斷開所有連接;否則,根據(jù)發(fā)送節(jié)點(diǎn)的Rank值計(jì)算自身節(jié)點(diǎn)的臨時(shí)Rank值;繼續(xù)判斷是否加入了新的DODAG,若是,則切換父節(jié)點(diǎn)更新路由信息;否則,比較Rank值,選取最優(yōu)父節(jié)點(diǎn)更新路由。
節(jié)點(diǎn)通過遍歷節(jié)點(diǎn)的接口信息,創(chuàng)建與接口一一對(duì)應(yīng)的RAW套接字用于廣播的DIO消息。由于節(jié)點(diǎn)進(jìn)行廣播DIO是周期性的,所以在RPL進(jìn)程中使用了單獨(dú)的線程處理DIO消息的轉(zhuǎn)發(fā)。IPv6中不再有廣播的概念,而是將其看做一種特殊的組播。在進(jìn)行組播DIO消息時(shí)使用Raw套接字組播DIO消息,使用組播地址作為目的地址,其中組播地址中“FF02::1”指所有開啟了IPv6組播的主機(jī),一般為鏈路上加入RPL多播組的所有主機(jī)。具體代碼如下:
const uint8_t all_rpl_addr[]= {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1a};
memcpy(&mreq.ipv6mr_multiaddr.s6_addr[0],all_rpl_addr,sizeof(mreq.ipv6mr_multiaddr));
if (setsockopt(sock,SOL_IPV6,IPV6_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)
∥節(jié)點(diǎn)加入多播組
for(int i=0;i { pa->ifname[i]=ifname[i]; } for(int i=0;i { if(pa->r_sock!=*(pa->s_sock+i))∥遍歷接口中繼,剔除收到消息接口 { s_bytes=sendmsg(*(pa->s_sock+i),&mhdr,0); } } 下行路由是指自治域中的從根節(jié)點(diǎn)方向到其他自治節(jié)點(diǎn)方向的路由,根節(jié)點(diǎn)掌握所有子節(jié)點(diǎn)的路由信息,當(dāng)數(shù)據(jù)包查找不到目的地時(shí),會(huì)向上交付給父節(jié)點(diǎn),由父節(jié)點(diǎn)查詢下行路由轉(zhuǎn)發(fā)數(shù)據(jù)包。模塊主要包括下行路由的構(gòu)建和維護(hù)兩部分。 下行路由的構(gòu)建與維護(hù)主要涉及兩種消息類型,分別為DODAG目的地通告消息(Destination Advertisement Object,DAO)和DODAG目的地通告消息確認(rèn)消息(Destination Advertisement Object Acknowledgement,DAO-ACK),具體消息格式如圖4和圖5所示。 圖4 DAO消息格式Fig.4 DAO message format 圖5 DAO-ACK消息格式Fig.5 DAO-ACK message format DAO控制消息中RPLInstanceID是從接收到的DIO控制消息中獲??;K標(biāo)志位、表示DAO控制消息發(fā)送端是否需要接收端返回DAO-ACK控制消息;D字段表示DODAG ID字段是否存在;Flags字段和Reserved字段DIO控制消息中的操作一致;DAO Sequence字段被作為一個(gè)計(jì)數(shù)器,主要用于記錄節(jié)點(diǎn)收到其下游節(jié)點(diǎn)發(fā)送的DAO控制消息的數(shù)量,即節(jié)點(diǎn)每收到一個(gè)攜帶路由前綴的DAO控制消息,該字段的值便增加1;DODAGID字段的“*”表示DODAGID并不總是存在,該字段僅在設(shè)置D字段時(shí)才出現(xiàn),即當(dāng)使用本地RPLInstanceID時(shí)才存在,當(dāng)使用全局RPLInstanceID時(shí)不存在。 下行路由的創(chuàng)建過程由節(jié)點(diǎn)收到DIO消息后建立完成上行路由開始,然后向選定的父節(jié)點(diǎn)回復(fù)DAO消息來通告自身地址前綴,協(xié)助父節(jié)點(diǎn)以及根節(jié)點(diǎn)來建立到自身的下行路由,最后如果需要?jiǎng)t將DAO消息送至根節(jié)點(diǎn),由根節(jié)點(diǎn)回復(fù)確認(rèn)消息DAO-ACK消息,來提高下行路由的可靠性,當(dāng)節(jié)點(diǎn)入網(wǎng)后,將收到DIO消息中的目標(biāo)函數(shù)(Objective Function,OF)中定義的一個(gè)或多個(gè)度量和約束轉(zhuǎn)換為Rank值,然后周期廣播DIO繼續(xù)協(xié)助周圍鄰居入網(wǎng)。 節(jié)點(diǎn)通過遍歷節(jié)點(diǎn)的接口信息,結(jié)合poll函數(shù)實(shí)現(xiàn)非阻塞的RAW套接字,同時(shí)實(shí)現(xiàn)超時(shí)時(shí)間的設(shè)定與套接字的監(jiān)聽。Poll函數(shù)可以實(shí)現(xiàn)非阻塞IO的套接字,它可以通過監(jiān)視套接字描述符的變化來監(jiān)測(cè)等待事件的發(fā)生,一旦判定收到DIO消息,就確定接口信息,單播回復(fù)DAO消息。通過對(duì)若干個(gè)套接字進(jìn)行輪詢,根據(jù)發(fā)生的事件來進(jìn)行相應(yīng)的處理。代碼示例如下: for(int i=0;i { gif6.gifaddr6[i].ifa_name=pa->ifname[i]; fds[i].fd=pa->r_sock[i]; fds[i].events=POLLIN;∥設(shè)置監(jiān)控觸發(fā)事件 } ret=poll(fds,pa->gif_count,INFTIM); if(fds[i].revents==POLLIN)∥捕獲觸發(fā)的事件類型 send_dao(r_sock,r_src,parent,relay_src,dao_seq,r_dio.instanceid,r_dio.dodagid,ip6_src_add.s6_addr,plen);∥回復(fù)DAO消息 在軟件協(xié)議的開發(fā)中,軟件功能的實(shí)現(xiàn)是保障協(xié)議能夠正常運(yùn)行的最基本要求。為了驗(yàn)證RPL路由協(xié)議能否正常運(yùn)行,本文編寫了相應(yīng)的測(cè)試用例對(duì)RPL協(xié)議模塊功能進(jìn)行測(cè)試。 為測(cè)試RPL路由協(xié)議功能及性能,需要首先搭建自治控制平面作為測(cè)試平臺(tái),實(shí)際搭建的測(cè)試場(chǎng)景網(wǎng)絡(luò)拓?fù)淙鐖D6所示。 圖6 測(cè)試網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)Fig.6 Network topology used for testing 圖6中所有的節(jié)點(diǎn)都是在一臺(tái)臺(tái)式機(jī)上通過Vmware Workstation虛擬機(jī)軟件虛擬了多個(gè)虛擬節(jié)點(diǎn),在其上運(yùn)行Linux操作系統(tǒng),通過對(duì)節(jié)點(diǎn)進(jìn)行配置多個(gè)虛擬網(wǎng)卡來構(gòu)建網(wǎng)絡(luò)拓?fù)洌總€(gè)網(wǎng)卡分別配置了不同網(wǎng)段的IPv6的LLA地址和ULA地址,其中LLA地址為鏈路本地地址,是默認(rèn)為網(wǎng)卡分配的地址,用于本地鏈路之間的通信;自治控制平面在運(yùn)行路由協(xié)議前,會(huì)自動(dòng)分配一個(gè)ULA地址用于當(dāng)前域內(nèi)路由。 在所有的節(jié)點(diǎn)上運(yùn)行RPL路由協(xié)議軟件,節(jié)點(diǎn)首先會(huì)初始化接口信息,例如A節(jié)點(diǎn)有兩個(gè)接口eth0和eth1,然后創(chuàng)建Raw套接字,其中假設(shè)A是根節(jié)點(diǎn),其IPv6地址為fd89::1,作為DODAGID,其他節(jié)點(diǎn)是普通節(jié)點(diǎn),首先由A構(gòu)建DODAG,A節(jié)點(diǎn)組播DIO消息如圖7所示,鄰居節(jié)點(diǎn)B和C收到DIO消息后構(gòu)建上行路由如圖8所示,收到的DIO消息中的DODAGID字段為fd89::1,rank值為0表示是根節(jié)點(diǎn),B,C節(jié)點(diǎn)根據(jù)DIO消息構(gòu)建到節(jié)點(diǎn)A的上行路由,如圖9所示。然后向節(jié)點(diǎn)A回復(fù)DAO消息,其中Target Prefix字段為fd89:1::10,表示B的IPv6地址,節(jié)點(diǎn)A構(gòu)造下行路由的測(cè)試結(jié)果如圖10所示。 當(dāng)節(jié)點(diǎn)B,C,D,E,F加入到DODAG后,在A節(jié)點(diǎn)中會(huì)聚集子節(jié)點(diǎn)路由信息,如圖11所示,這表示當(dāng)前網(wǎng)絡(luò)已經(jīng)組網(wǎng)完成,如果節(jié)點(diǎn)是鄰居直連,則下一跳使用null表示,ifname表示數(shù)據(jù)包發(fā)送接口。 路由修復(fù)以節(jié)點(diǎn)B脫網(wǎng)為例,如圖12所示,當(dāng)節(jié)點(diǎn)B故障時(shí),A節(jié)點(diǎn)通過發(fā)送DIO消息并等待DAO消息,若在一定時(shí)間內(nèi)沒有收到,則會(huì)檢測(cè)出節(jié)點(diǎn)B出現(xiàn)故障,刪除故障節(jié)點(diǎn)路由。 圖7 A節(jié)點(diǎn)組播DIO消息測(cè)試信息Fig.7 Test information for Node A multicast DIO messages 圖8 B,C節(jié)點(diǎn)接收DIO消息測(cè)試信息Fig.8 Test information for node B and node C receiving DIO messages 圖9 B,C節(jié)點(diǎn)構(gòu)建上行路由測(cè)試信息Fig.9 Test information fornode B and node C to build upward routes 圖10 A節(jié)點(diǎn)構(gòu)建下行路由測(cè)試信息Fig.10 Test information for node A to build downward routes 圖11 A節(jié)點(diǎn)存儲(chǔ)的路由測(cè)試信息Fig.11 Test information of the routes stored at node A 圖12 A節(jié)點(diǎn)刪除錯(cuò)誤路由測(cè)試信息Fig.12 Test information of node A deleting the wrong route 自治網(wǎng)絡(luò)作為當(dāng)前一個(gè)較為新穎的研究方向,在當(dāng)前的學(xué)術(shù)界以及相關(guān)領(lǐng)域被關(guān)注的不多,研究成果也較少。因此,本文以ANIMA工作組提出的自治網(wǎng)絡(luò)基礎(chǔ)結(jié)架構(gòu)中的自治控制平面為參考模型,重點(diǎn)是實(shí)現(xiàn)其中的路由協(xié)議來打通一個(gè)虛擬帶外網(wǎng)絡(luò),在不依賴于節(jié)點(diǎn)的配置與全局路由表的情況下,依舊可以維持與網(wǎng)絡(luò)中節(jié)點(diǎn)的連通性,實(shí)現(xiàn)對(duì)于節(jié)點(diǎn)的管理與維護(hù)。本實(shí)現(xiàn)開拓性地在Linux系統(tǒng)下,結(jié)合網(wǎng)絡(luò)編程相關(guān)知識(shí),使用C語言成功地實(shí)現(xiàn)了RPL路由模塊以及相應(yīng)功能。實(shí)現(xiàn)結(jié)果表明,本文所設(shè)計(jì)的軟件系統(tǒng)能夠基本滿足自治控制平面中對(duì)路由的要求。2.3 下行路由模塊
3 軟件測(cè)試及分析
3.1 測(cè)試環(huán)境搭建
3.2 構(gòu)建RPL路由測(cè)試
4 結(jié)束語