李 棟,陳慈飛,吳佳琪,陳民華
(重慶郵電大學 通信與信息工程學院,重慶 400065)
隨著互聯網的飛速發展,規模不斷壯大,衍生出了眾多的新場景、新業務。由于傳統網絡存在運營成本大、效率低下等缺點,已經無法滿足當前網絡的發展趨勢和要求,逐漸與互聯網的發展相脫節。IBM公司于2001年首次提出自治網絡的概念[1],其基本目標是實現網絡自我管理、自我配置、自我優化、自我修復、自我保護以及可擴展性等特點。
自治功能需要穩定的基礎架構來運行,以最大程度地降低網絡復雜性。如今,大多數關鍵的控制平面協議和網絡管理協議都在使用網絡的數據平面。這通常導致一側的控制和管理平面與另一側的數據平面之間的不良依存關系。因此,ANIMA工作組定義自治控制平面 (Autonomic Control Plane,ACP)來為網絡提供獨立于數據平面的控制平面,為網絡的高效通信提供基礎,而ACP中通信需要滿足自治屬性的RPL路由協議來支撐。本文將從協議的設計、軟件開發以及軟件的測試和分析幾個方面來講述整個協議的原理與實現過程。
2007年歐盟委員會啟動了第七框架計劃,同年該計劃推出了EFIPSANS項目[2]。該項目旨在分析當前互聯網中所存在的缺陷,探討未來自治管理互聯網的體系結構、行為特征及實現方法。在IPv6基礎上探索、研究并創建新型的自治網絡。2014年IETF的ANIMA(Autonomic Network Integrated Model and Approach)工作組在GANA[3]的研究基礎上,提出了自己的自治網絡架構,本著設計基礎、可重用的組件與分布式的思想,定義了三個具體的部分:自治控制平面(Autonomic Control Plane,ACP)[4]、通用自治信令協議(Generic Autonomic Signaling Protocol,GRASP)[5]和安全自啟動機制(Bootstrap Key Infrastructure,BRSKI)[6]。
自治功能需要穩定的基礎架構來運行,并且所有自治功能都應使用相同的基礎架構,以最大程度地降低網絡的復雜性。如今,大多數關鍵的控制平面協議和網絡管理協議都在使用網絡的數據平面。這通常導致一側的控制和管理平面與另一側的數據平面之間的不良依存關系,只有正確配置數據平面的轉發和控制平面,數據平面和管理平面才能正常工作。在傳統的網絡管理方法中,可以通過帶外虛擬(Out of Band)技術[7]解決這些問題,但是其過高的成本與代價很大程度上限制了該技術的進一步推廣。因此,ANIMA工作組定義了ACP自治控制平面來為自治域中的自治節點提供通信,ACP提供了強大而安全的通信覆蓋,同時實現了控制平面和數據平面的隔離。
為了滿足無線傳感器網絡的要求,IETF(The Internet Engineering Task Force)工作組在2008年成立了ROLL小組,ROLL小組提出了基于IPv6的低功耗有損網絡路由協議RPL[8]。在實際中,ContikiOS和TinyOS是兩種最流行的操作系統,而TelosB是測試平臺上最常用的硬件平臺。在開源實現方面,兩個最廣泛使用的開源RPL實現分別是ContikiOS的Contiki RPL[9]和TinyOS中的Tiny RPL[10],并且這些實現幾乎已經用于涉及真實實驗的所有RPL研究活動中。
路由協議承載著自治節點的通信需求,影響著整個網絡的性能和存活時間。RPL協議是一個基于標準化IPv6的距離矢量路由協議,節點通過交換距離矢量構造一個有向無環圖(Destination Oriented Directed Acyclic Graph,DODAG),DODAG可以有效防止路由環路問題。由于RPL路由協議具有自我管理、自我配置的特性,龐大的規模以及拓展性強等特點,ACP在標準實現中使用RPL路由協議來實現域內數據多跳傳輸,但由于RPL路由協議本是應用在無線傳感網絡中,而自治網絡基于有線環境,所以本文以ANIMA工作組提出的自治控制平面為基礎,闡述自治控制平面中基于Linux操作系統的RPL路由協議的設計與實現。
在自治域中將有很多類似NOC的節點,但是只能選擇一個NOC節點作為當前自治域中的根節點,負責當前域中自治節點的維護和管理,以及跨自治域流量交互等。整個自治域就是一個DODAG,DODAG的構建主要包含上行路由和下行路由的構建,其中上行路由和下行路由的構建均是由DODAG Root發起,通過DIO,DAO,DAO-ACK,DIS控制消息完成DODAG的構建。DODAG的構建流程如圖1所示。

圖1 DODAG的構建過程Fig.1 DODAG construction process
上行路由是指自治域中的自治節點到根節點方向的路由,當網絡中的其他節點無法獲得某些路由時,將數據包向上默認發給根節點,同時當兩個自治域中的節點進行交互時,也需要上行路由將其數據包送至根節點,由根節點與其他域中根節點進行轉發。模塊主要包括上行路由的構建和維護兩部分。
上行路由的構建與維護主要涉及兩種消息類型,分別為DODAG信息對象信息(DODAG Information object,DIO)和DODAG信息請求消息(DODAG Information Solicitation,DIS),具體消息實現格式代碼如圖2和圖3所示。

圖2 DIO消息格式Fig.2 DIO message format

圖3 DIS消息格式Fig.3 DIS message format
RPLInstance ID表示當前DODAG所在RPL Instances中的ID號;Version Number表示當前DODAG的版本號,主要用于保證DODAG中所有節點的網絡狀態同步,且其值隨著DODAG的更新而逐漸遞增;Rank的大小可以反映出當前節點相對于根節點在DODAG中的相對位置;MOP表示節點加入DODAG中的操作模式:存儲模式和非存儲模式;DTSN表示觸發DAO控制消息的序列號,主要用于維護和更新DODAG中的下行路由;DODAG ID是由DODAG Root分配的IPv6地址,表示當前DODAG的ID號,用于標識每一個DODAG的身份,且每個DODAG ID不能重復,必須唯一。Flags和Reserved 各占據1字節,在發送端這兩個字段均默認初始化設置為0,在接收端直接忽略這兩個字段。
上行路由的構建過程由根節點廣播DIO消息請求周圍鄰居節點加入當前DODAG開始,確定加入DODAG的自治節點將發送DIO的節點添加至自己的父節點集合中,同時構造到父節點以及根節點的上行路由,上行路由的維護過程是從構建完上行路由后開始,接收DIO消息的節點會判斷DIO消息中的Rank字段是否為INFINITE,若是,則從父節點集合中刪除該節點;否則,會繼續判斷Version Number字段是否已經改變了,若是,則將節點的Rank值設為INFINITE,廣播DIO狀態變為未加入DODAG,斷開與之前節點之間的連接;否則,繼續判斷DIO消息是否來自其他的DODAG,若是,則判斷DIO中Prf字段是否大于當前根節點的Prf,當若大于當前根節點,則直接置Rank為INFINITE,廣播DIO消息斷開所有連接;否則,根據發送節點的Rank值計算自身節點的臨時Rank值;繼續判斷是否加入了新的DODAG,若是,則切換父節點更新路由信息;否則,比較Rank值,選取最優父節點更新路由。
節點通過遍歷節點的接口信息,創建與接口一一對應的RAW套接字用于廣播的DIO消息。由于節點進行廣播DIO是周期性的,所以在RPL進程中使用了單獨的線程處理DIO消息的轉發。IPv6中不再有廣播的概念,而是將其看做一種特殊的組播。在進行組播DIO消息時使用Raw套接字組播DIO消息,使用組播地址作為目的地址,其中組播地址中“FF02::1”指所有開啟了IPv6組播的主機,一般為鏈路上加入RPL多播組的所有主機。具體代碼如下:
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)
∥節點加入多播組
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); } } 下行路由是指自治域中的從根節點方向到其他自治節點方向的路由,根節點掌握所有子節點的路由信息,當數據包查找不到目的地時,會向上交付給父節點,由父節點查詢下行路由轉發數據包。模塊主要包括下行路由的構建和維護兩部分。 下行路由的構建與維護主要涉及兩種消息類型,分別為DODAG目的地通告消息(Destination Advertisement Object,DAO)和DODAG目的地通告消息確認消息(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標志位、表示DAO控制消息發送端是否需要接收端返回DAO-ACK控制消息;D字段表示DODAG ID字段是否存在;Flags字段和Reserved字段DIO控制消息中的操作一致;DAO Sequence字段被作為一個計數器,主要用于記錄節點收到其下游節點發送的DAO控制消息的數量,即節點每收到一個攜帶路由前綴的DAO控制消息,該字段的值便增加1;DODAGID字段的“*”表示DODAGID并不總是存在,該字段僅在設置D字段時才出現,即當使用本地RPLInstanceID時才存在,當使用全局RPLInstanceID時不存在。 下行路由的創建過程由節點收到DIO消息后建立完成上行路由開始,然后向選定的父節點回復DAO消息來通告自身地址前綴,協助父節點以及根節點來建立到自身的下行路由,最后如果需要則將DAO消息送至根節點,由根節點回復確認消息DAO-ACK消息,來提高下行路由的可靠性,當節點入網后,將收到DIO消息中的目標函數(Objective Function,OF)中定義的一個或多個度量和約束轉換為Rank值,然后周期廣播DIO繼續協助周圍鄰居入網。 節點通過遍歷節點的接口信息,結合poll函數實現非阻塞的RAW套接字,同時實現超時時間的設定與套接字的監聽。Poll函數可以實現非阻塞IO的套接字,它可以通過監視套接字描述符的變化來監測等待事件的發生,一旦判定收到DIO消息,就確定接口信息,單播回復DAO消息。通過對若干個套接字進行輪詢,根據發生的事件來進行相應的處理。代碼示例如下: for(int i=0;i { gif6.gifaddr6[i].ifa_name=pa->ifname[i]; fds[i].fd=pa->r_sock[i]; fds[i].events=POLLIN;∥設置監控觸發事件 } ret=poll(fds,pa->gif_count,INFTIM); if(fds[i].revents==POLLIN)∥捕獲觸發的事件類型 send_dao(r_sock,r_src,parent,relay_src,dao_seq,r_dio.instanceid,r_dio.dodagid,ip6_src_add.s6_addr,plen);∥回復DAO消息 在軟件協議的開發中,軟件功能的實現是保障協議能夠正常運行的最基本要求。為了驗證RPL路由協議能否正常運行,本文編寫了相應的測試用例對RPL協議模塊功能進行測試。 為測試RPL路由協議功能及性能,需要首先搭建自治控制平面作為測試平臺,實際搭建的測試場景網絡拓撲如圖6所示。 圖6 測試網絡拓撲結構Fig.6 Network topology used for testing 圖6中所有的節點都是在一臺臺式機上通過Vmware Workstation虛擬機軟件虛擬了多個虛擬節點,在其上運行Linux操作系統,通過對節點進行配置多個虛擬網卡來構建網絡拓撲,每個網卡分別配置了不同網段的IPv6的LLA地址和ULA地址,其中LLA地址為鏈路本地地址,是默認為網卡分配的地址,用于本地鏈路之間的通信;自治控制平面在運行路由協議前,會自動分配一個ULA地址用于當前域內路由。 在所有的節點上運行RPL路由協議軟件,節點首先會初始化接口信息,例如A節點有兩個接口eth0和eth1,然后創建Raw套接字,其中假設A是根節點,其IPv6地址為fd89::1,作為DODAGID,其他節點是普通節點,首先由A構建DODAG,A節點組播DIO消息如圖7所示,鄰居節點B和C收到DIO消息后構建上行路由如圖8所示,收到的DIO消息中的DODAGID字段為fd89::1,rank值為0表示是根節點,B,C節點根據DIO消息構建到節點A的上行路由,如圖9所示。然后向節點A回復DAO消息,其中Target Prefix字段為fd89:1::10,表示B的IPv6地址,節點A構造下行路由的測試結果如圖10所示。 當節點B,C,D,E,F加入到DODAG后,在A節點中會聚集子節點路由信息,如圖11所示,這表示當前網絡已經組網完成,如果節點是鄰居直連,則下一跳使用null表示,ifname表示數據包發送接口。 路由修復以節點B脫網為例,如圖12所示,當節點B故障時,A節點通過發送DIO消息并等待DAO消息,若在一定時間內沒有收到,則會檢測出節點B出現故障,刪除故障節點路由。 圖7 A節點組播DIO消息測試信息Fig.7 Test information for Node A multicast DIO messages 圖8 B,C節點接收DIO消息測試信息Fig.8 Test information for node B and node C receiving DIO messages 圖9 B,C節點構建上行路由測試信息Fig.9 Test information fornode B and node C to build upward routes 圖10 A節點構建下行路由測試信息Fig.10 Test information for node A to build downward routes 圖11 A節點存儲的路由測試信息Fig.11 Test information of the routes stored at node A 圖12 A節點刪除錯誤路由測試信息Fig.12 Test information of node A deleting the wrong route 自治網絡作為當前一個較為新穎的研究方向,在當前的學術界以及相關領域被關注的不多,研究成果也較少。因此,本文以ANIMA工作組提出的自治網絡基礎結架構中的自治控制平面為參考模型,重點是實現其中的路由協議來打通一個虛擬帶外網絡,在不依賴于節點的配置與全局路由表的情況下,依舊可以維持與網絡中節點的連通性,實現對于節點的管理與維護。本實現開拓性地在Linux系統下,結合網絡編程相關知識,使用C語言成功地實現了RPL路由模塊以及相應功能。實現結果表明,本文所設計的軟件系統能夠基本滿足自治控制平面中對路由的要求。2.3 下行路由模塊


3 軟件測試及分析
3.1 測試環境搭建

3.2 構建RPL路由測試






4 結束語