RPL(3):RFC6550翻譯(3)---協議綜述

3.協議綜述
本節目的是本着[RFC4101]的精神描述RPL。協議細節可以後面章節找到。

3.1 拓撲結構
本節介紹可形成的基本RPL拓撲結構,及構造這些拓撲結構的規則,例如,指導DODAG形成的規則。

3.1.1  構造拓撲結構
LLNs,如無線網絡,通常不會象點對點導線那樣強制形成拓撲結構,所以RPL不得不發現鏈路並有節制地選擇對端。

很多情況下,由於第2層僅有部分範圍重疊,RPL形成了非傳遞/非廣播多路訪問(NBMA)網絡拓撲結構,並在它的基礎上計算路由。

RPL路由優化與一個或多個根之間的流量發送和接收,這些根作爲拓撲結構的匯聚點。因此,RPL組織如下拓撲結構:一個被劃分爲數個DODAG的DAG,每個DODAG對應一個匯聚點。如果DAG有多個根,可以預期,這些根會象中繼鏈路那樣通過公共主幹網聯合。

3.1.2 RPL標識符
RPL使用四個值來標識和維護一個拓撲結構:

  • 第一個是RPLInstanceID。RPLInstanceID標識了一組由單個或多個DODAG組成的DAG。一個網絡可能擁有多個RPLInstanceID,它們中的每一個都定義了獨立的一組DODAG,它們可針對不同的目標函數(OF)和/或應用進行優化。由一個RPLInstanceID標識的一組DODAG被稱爲RPL實例。同一RPL實例中的所有DODAG使用相同的OF。
  • 第二個是DODAGID。DODAGID的使用範圍僅限於RPL實例內。網絡中聯合使用RPLInstanceID和 DODAGID可唯一標識一個DODAG。一個RPL實例可擁有多個DODAG,它們中的每一個擁有唯一的DODAGID。
  • 第三個是DODAGVersionNumber。DODAGVersionNumber的使用範圍僅限於DODAG內。 DODAG有時通過DODAG根進行重構,並遞增其DODAGVersionNumber。聯合使用RPLInstanceID、DODAGID和 DODAGVersionNumber可以唯一標識一個DODAG版本。
  • 第四個是Rank。Rank的使用範圍僅限於DODAG版本內。Rank在DODAG版本基礎上建立一個偏序,定義單個節點相對DODAG根的位置。


3.1.3 實例,DODAGs和DODAG版本
一個RPL實例包含一個或多個DODAG根。一個RPL實例可爲給定的目的地前綴提供路由,通過DODAG根或DODAG內的替代路徑到達目的地。這些根可獨立運行,也可在網絡上協同工作,無需像LLN那樣受到限制。

RPL實例由如下東西組成:
  • 僅有一個根的單個DODAG。
例如,在智能家居應用中,爲使延遲最小化,DODAG將集中照明控制器作爲唯一的根。

  • 多個擁有獨立根(不同的DODAGID)的相互間不協調的DODAG
例如,在城市數據採集應用中的多個數據採集點間,由於沒有合適的連接而無法協調一致,或者以多DODAG結構爲手段來動態、自主地分割網絡。

  • 攜帶虛擬根的單個DODAG在主幹網絡中協調LLN匯聚點(使用相同的DODAGID)。
例如,運行於可靠的傳輸鏈路上的多個邊界路由。在一個支持IPv6低功耗無線個域網(6LoWPAN)的應用中,它們有能力作爲相同DODAG匯聚點的邏輯等價接口。

  • 上述組合可適用於某些應用場景
每個RPL包都與一個特定RPLInstanceID關聯(見11.2節),也就是與RPL實例(見第5節)關聯。RPLInstanceID和應用流量類型或服務之間映射的提供和自動發現不在本文討論範圍內(將來會在配套文檔中定義)。

圖1展示了一個RPL實例,它包含三個DODAG,根分別爲R1、R2、R3。每個DODAG根公告相同的RPLInstanceID。圖中線段表示雙親和孩子間的連接。


圖2展示了DODAGVersionNumber的遞增是如何導致新DODAG版本產生的。此圖說明了DODAVersionNumber值增加的結果是一個不同的DODAG拓撲。注意,新的DODAG版本並不一定會帶來不同的DODAG拓撲。某些特定的拓撲改變才需要新的DODAG版本,本規範稍後會對此進行討論。


需要注意,此例中的樹型結構非常簡單,然而當連接支持時,DODAG結構是允許每個節點擁有多個雙親的。

3.2 上行路由和DODAG構造
RPL提供向上到DODAG根的路由時,會根據目標函數(OF)優化DODAG形成。RPL節點通過DODAG信息對象(DIO)來構造和維護這些DODAG。

3.2.1 目標函數(OF)
OF定義了在RPL實例中RPL節點是如何選擇和優化路由的。OF在DIO配置選項中通過Objective Code Point(OCP)來進行標識。OF定義了節點是如何轉化爲一個或多個度量和約束的([RFC6551]中定義),轉化成的值叫Rank,它表示節點到DODAG根的大概距離。OF還定義了節點是如何選擇雙親的。列詳細的描述可參考14節或[RFC6551]、[RFC6552]規範文檔以及關相配套文檔。

3.2.2 DODAG修復
DODAG根通過遞增DODAGVersionNumer來發起一個全局修復操作,從而產生一個新的DODAG版本。在新DODAG版本中,那些不受舊版本Rank的限制節點可以選擇新的位置。

RPL還支持可用於DODAG版本內的本地修復機制。當通過DODAG根策略進行配置和控制時,DIO消息會指定必要的參數。

3.2.3 安全
RPL支持信息的保密和完整。當鏈路層機制可用且適合,則使用它,否則RPL使用自己的機制。RPL擁有三種基礎安全模式。

第一種叫“unsecured”(無保障)模式,RPL控制消息在發送時不附帶任何安全機制。無保障模式並不意味着RPL網絡是不安全的,它可能使用了現有的安全原語(如鏈路層安全)來滿足應用的安全需求。

第二種叫“preinstalled”(預設)模式,節點在加入RPL實例時,擁有預設的密鑰以使得它可以處理和產生安全的RPL消息。

第三種叫“authentiated”(認證)模式,在認證模式下,節點和預設模式一樣擁有預設密鑰,但預設密鑰僅能在以葉子節點形式加入RPL實例時使用。以路由的形式加入認證模式的RPL實例需要獲取一個來自認證機構的密鑰。獲取密鑰的過程超出本規範的範圍。注意,本規範僅僅沒有對RPL實現是如何安全運行於認證模式下提供足夠詳細的描述。關於這一點,有必要在將來的配套規範中對於節點如何獲取和申請認證材料(如密鑰、證書)和從哪獲取那些材料進行詳述(請參閱10.3節)。

3.2.4 接地和浮動的DODAG
DODAG可以是接地的或浮動的:DODAG根公告是哪一種情況呢?一個接地的DODAG爲那些滿足應用定義目標需求的主機提供連接。一個浮動的DODAG沒有預期要滿足目標,在大多數情況下,它僅提供DODAG內到節點的路由。例如,浮動的DODAG可用於在修復期間保持互連。

3.2.5 本地DODAG
在LLN中,當目的地爲DODAG根時,RPL節點可以通過構建本地DODAG來優化到此根的路由。不同於全局DAG,可能是由多個DODAG組成的,本地DAG有且僅有一個DODAG,因此只有一個DODAG根。本地DODAG可以在需要時再構造。

3.2.6 管理偏好
實現/佈署可以通過管理偏好來決定哪些DODAG根應當優先於其它根使用。管理偏好提供了控制流量和設計DODAG構成的途徑,從而更好地支持應用條件和需求。

3.2.7 數據通路驗證和迴路探測
LLNs的低功耗和有損性質促使RPL的按需迴路探測必須使用額外數據包。因爲數據流量的偶發性,維護路由拓撲時時隨物理拓撲而變化會導致能量的浪費。在物理連接中,LLNs通常呈現瞬間且無礙流量的變化,但從控制平面密切跟蹤這些變化代價高昂。連接的瞬間及偶發變化無需RPL處理,直到有數據被髮送。RPL在這方面的設計借鑑了現存高頻使用的LLN協議以及大量證明其功效的實驗和佈署。

RPL分組信息是跟數據包一起傳送的,它包含了發送者的Rank信息。數據包的路由決策(上行或下行)和兩節點的Rank關係的不一致預示着有可能出現迴路。如果收到這樣的數據所,節點會發起本地修復操作。

例如,如果節點收到一個標示爲上行的數據包,但包中記錄的發送者比接收者的Rank更低,此時接收者可以終止數據包的繼續上行,此時的DODAG是不一致的。

3.2.8 分佈式算法操作
以下是有關DODAG構造的分佈式算法的高層級概述:
  • 某些節點通過相關的DODAG配置,被設定爲DODAG根。
  • 節點通過發送鏈路本地多播DIO信息給所有RPL節點以公告它們的存在、與DODAG的隸屬關係、路由開銷以及相關度量。
  • 節點監聽DIO並通過它們的信息以加入一個新的DODAG(進而選擇DODAG雙親),或按照指定OF和鄰居的Rank保持當前DODAG。
  • 節點通過DODAG版本中的雙親,爲DIO消息所指定的目的地提供路由表條目。節點決定加入某個 DODAG,爲默認路由以及數個與實例關聯的其它外部路由提供一個或多個DODAG雙親作爲下一跳。

3.3 下行路由和目的地公告
RPL使用目的地公告對象(DAO)消息來建立下行路由。DIO消息對應用來說是一個可選項,它需要點對多點(P2MP)或點對點(P2P)通信的支持。RPL支持兩種下行流量模式:存儲式(完全狀態)或非存儲式(完全源路由)(見第9節)。任何給定的RPL實例不是存儲式就是非存儲式。在這兩種情況下,P2P數據包都是先上傳至DODAG根,然後下行至最終目的地(除非目的地在上行路由中)。在非存儲模式下,數據包在下行前將遍訪到根的所有路徑。而在存儲模式下,數據包在到達DODAG根之前可通過源和目的地的公共祖先直接下行至目的地。

截止撰寫本規範爲止,還沒有應用同時支持運行存儲和非存儲模式。大多應用只是希望要麼支持無下行路由的非存儲模式,要麼支持存儲模式。其它操作模式,如hybrid的混合了存儲和非存儲模式超出了本規範的範圍,也許會在其它配套文檔中描述。

本規範描述在P2P通信支持下的基礎操作模式。注意,更多優化的P2P解決方案將在配套文檔中描述。

3.4 本地DODAG路由發現
作爲可選項,一個RPL網絡可支持LLN中到指定目的地DODAG的按需發現。此類本地DODAG的行爲和全局DODAG稍有不同:它們通過聯合使用DODAGID和RPLInstanceID來唯一定義,RPLInstanceID指示了一個DODAG是否爲本地DODAG。

3.5 Rank特性
Rank是一個DODAG版本內某節點位置的標量表示。Rank用於避免和探測迴路,因而必定展現出某些特性。Rank的精確計算留目標函數(OF)完成。即便OF已經完成某些特定計算,Rand還得自己實現通用屬性。

尤其,當DODAG版本靠近DODAG目的地時,節點的Rank必須單調減少。這種情況下,可將Rank當成位置的標量表現或DODAG版本內節點的半徑。

OF如何計算Rank的細節超出本規範範圍,儘管這種計算依賴於如雙親、鏈路度量、節點度量和節點配置和策略等。請參考14節獲取更多信息。

雖然Rank值源於路徑度量並受它影響,但Rank並非路徑開銷。Rank擁有自己的不屬於上述所有度量的特性:
Type(類型):Rank是一個抽象的數值。
Fuction(功能):Rank是DODAG版本中,節點與鄰居相對位置的表達式,它不一定是到根的距離或路徑開銷的完美表示或正確表達式。
Stability(穩定性):Rank的穩定性決定了路由拓撲的穩定性。推薦使用一些抑制或過濾措施以保持拓撲的穩定,因此Rank沒有必要象鏈路或節點度量那樣快速改變。一個新的DODAG版本應成爲調和差異的好機會,這些差異可能是在DODAG版本內的度量和Rank之間,隨着時間的推移而形成的。
Properties(特性):Rank以嚴格單調的方式遞增,它可用於校驗靠近或離開根的行進。度量像帶寬或抖動一樣,不一定會呈現這些特性。
Abstrace(抽象):Rank沒有物理單位,而是每跳一定範圍的增量,每個增量的分配由OF來決定。

Rank按RPL迴路避免策略代入DODAG雙親選擇。一旦雙親被添加,就將公告DODAG內節點的Rank值,有關DODAG內節點雙親的選擇和移動的更多選項將受限制,以支持迴路避免。

3.5.1 Rank比較(DAGRank())
Rank可被當成定點值,整數部分和小數部分之間的小數點位置由MinHopRankIncrease決定。MinHopRankIncrease是一個節點和它任意雙親間的最小Rank增量。MinHopRankIncrease由DODAG提供。MinHopRankIncrease在跳數開銷精確度和網絡支持的最大跳數間進行權衡。例如,一個非常大的MinHopRankIncrease可以精確描述給定跳數對Rank的影響,但它無法支持太多的跳數。

當目標函數(OF)計算Rank時,OF將使用整個Rank值(也就是16bit)進行運算。當Rank用於對比,例如用於決定決定與雙親間的關係或迴路探測時,將使用Rank的整數部分。Rank的整數部分使用下面的DAGRank()宏計算得出,其中floor(x)函數求解小於等於x的最大整數:
DAGRank(rank) = floor(rank/MinHopRankIncrease)
舉例來說,如果16bit的Rank值是十進制的27,MinHopRankIncrease是十進制的16,那麼DAGRank(27)=floor(1.6875)=1。Rank的整數部分是1,小數部分是11/16。

以下是本文檔的約定,其中DAGRank(node)宏可被解釋爲DAGRank(node.rank)。node.rank是由節點維護的Rank值。
  • DAGRank(A) < DAGRank(B)表示節點A的Rank小於節點B的Rank。
  • DAGRank(A) = DAGRank(B)表示節點A的Rank等於節點B的Rank。
  • DAGRank(A) > DAGRank(B)表示節點A的Rank大於節點B的Rank。

3.5.2 Rank關係
Rank的計算由LLN任意兩相鄰節點M和N的以下屬性得出:
DAGRank(M) < DAGRank(N):
這種情況下,M的位置比N離DODAG根更近。此時節點M可安全地作爲節點N的雙親,不會有任何迴路的風險。進而,節點N的雙親集中的所有雙親的Rank值必須小於DAGRank(N)。也就是說節點N所呈現的Rank必須大於它的雙親所呈現出的Rank。

DAGRank(M) = DAGRank(N):
這種情況說明DODAG中,M和N相對於根的位置相近或完全相等。路由通過具有相同Rank的節點有可能導致路由迴路(即,那個節點在選擇路由的過程中通過了一個具有相同Rank值的節點)。

DAGRank(M) > DAGRank(N):
這種情況下,M的位置比N離DODAG根更遠。進而節點M可能位於節點N的子DODAG內。如果節點N選擇節點M作爲雙親,會存在迴路的風險。

例如,當OF極力減小的度量是EXT或延遲時,可通過密切跟蹤EXT的方式業計算Rank。或採用適合DODAG內正在使用的OF的更復雜的方法計算Rank。
EXT:(expected transmission count:期望傳輸次數,用於LLN中的一個非常普遍的路由度量,定義於[RFC6551]

3.6  RPL使用的路由度量和約束
路由協議通過路由度量計算最短路徑。諸如IS-IS([RFC5120])和OSPF([RFC4915])等內部網關協議(IGPs)使用的是靜態鏈路度量。這些鏈路度量可以簡單反映代寬,也可按照定義不同鏈路特徵的幾種度量的多項式函數計算而來。一些路由協議支持多種度量:在決大多數情況下,每種(子)拓撲使用一種度量。少數情況下,第二度量可在多重等價路徑(Equal Cost Multiple Path:ECMP)中用於最高仲裁。多重度量的最優化被稱作NP完全問題(NP-complete problem),被一些集中式路徑計算引擎所支持。(這裏解釋一下Equal Cost Multiple Path:到達同一目的地可以有多條等價路徑存在,我們稱之爲ECMP,但對於一個目的地只能尋找一條路徑。當存在多條滿足基本條件的路徑時,尋找出其中的一條路徑就叫“最高仲裁”)

相比之下,LLNs需要同時支持靜態和動態度量。與此同時,鏈路度量和節點度量都需要。就RPL而言,只定義一種度量乃至一種複合度量都是不夠的,它需要滿足所有使用情形。

此外,RPL支持基礎約束的路由,此種約束適用於鏈路和節點。如果鏈路或節點並不滿足所需的約束,它將從候選鄰居集中被去除,從而產生受約束的最短路徑。

一個目標函數(OF)指定了用於計算(約束)路徑的目標。進而,可通過配置節點以支持一系列度量和約束並依照DIO消息公告裏的度量和約束信息在DODAG中選擇它們的雙親。上行和下行數據流度量的單獨還是合併公告取決於OF和度量。當它們單獨公告時,可能會出現DIO雙親集與DAO雙親集不一樣的情況(單播DAO消息的發送目標是DAO的雙親節點)。然而,它們都是跟Rank計算規則有關的雙親。

OF還被RPL用於從路由度量和約束中解耦。鑑於OF制定DODAG雙親選擇、負載均衡等規則,使用度量和/或約束集合。因此DIO消息中的DAG約束選項所攜帶的信息些決定了首選路徑。

支持鏈路/節點的約束和度量集在[RFC6551]中有詳述。

例1:最短路徑:路徑提供端到端的最短延時。
例2:最短約束路徑:路徑不通過電池供電節點且路徑可靠性最優化。

3.7  迴路避免
當拓撲發生改變時,RPL努力避免形成迴路。當迴路形成時,RPL會使用基於Rank的數據路徑校檢機制來進行探測(評見第11節)。實踐中,這表示RPL既不保證路徑選擇的無迴路,也不保證嚴格的延遲收斂時間,但只要RPL被使用,就可以探測和修復迴路。RPL使用這種迴路探測機制以確保數據包在DODAG版本內前行,並在必要時觸發修復。

3.7.1 貪婪和不穩定

在DODAG版本中,當節點試圖向更深層移動(Rank變大)以增加雙親集尺寸或提高其它度量,此時節點是貪婪的。一旦節點已經加入DODAG版本,爲防止DODAG版本的不穩定,RPL將禁止某些行爲,包括貪婪。

設想某節點願意從它自己的sub-DODAG中的一個節點(一般情況下,這個節點更深)那接收和處理DIO消息。這種情況下,當兩個或更多節點持續嘗試在DODAG版本內移動以相互優化,形成反饋迴路的可能性是存在的。有時,這將導致不穩定,正是基於此原因,當節點處理來自更深層節點的DIO信息時,將被RPL限制在某種本地修復的形式。此方法創造了一個“視界線”,使得節點的行爲無法越過此界限而受影響進入到不穩定狀態,此種行爲可能來自節點的sub-DODAG內。
event horizon:視界線,天文學術語。指黑洞的邊界。在此邊界以內的光無法逃離。

3.7.1.1 用例:貪婪的雙親選擇和不穩定

上圖描述了三個不同構造的DODAG。三個DODAG中,節點A到B和C間都存在可用鏈路。
  • 在圖3-1中,節點A是節點B和C的雙親。
  • 在圖3-2中,節點A是節點B和C的雙親,節點B也是節點C的雙親。
  • 在圖3-3中,節點A是節點B和C的雙親,節點C也是節點B的雙親。

如果一個RPL節點過於貪婪,除了最優先考慮的雙親外,它還會試圖優化更多的其它雙親,從而導致不穩定。考慮圖3-1所示的DODAG,節點B和C可能最喜歡A作爲它們的雙親,但當它們運行於貪婪模式下,就會設法優化出兩個雙親。

  • 將圖3-1設爲初始狀態
  • 假設節點C首先離開DODAG,然後以更低的Rank重新加入,並將節點A和B作爲其雙親(圖3-2所示)。現在節點C比節點A和B更深,並滿足於擁有兩個雙親。
  • 假設節點B在貪婪模式下,願意接收和處理節點C的DIO消息(違反了RPL規則),於是節點B離開DODAG並以更低的Rank重新加入,並將節點A和C作爲其雙親。現在節點B比節點A和C更深,並滿足於擁有兩個雙親。
  • 接下來,節點C也是貪婪的,它將離開並重新加入成爲更深節點,以再次獲得兩個雙親並擁有比它們列低的Rank。
  • 然後,節點B再一次離開、加入以變得更深,並獲得兩個雙親。
  • 再一次,節點C離開、加入、變得更深。
  • 如此重複,DODAG將在圖3-2和圖3-3間來回震盪,直到節點計數變成無窮大並再次重啓循環。
  • 可通過RPL中的以下機制防止出現此種循環:
  1. 節點B和C保持Rank值不變,只要此Rank可以滿足於依附它們最優雙親(A),且不再尋找任何更深的(錯誤的)替代雙親(節點不貪婪)。
  2. 節點B和C不處理來自更深節點的DIO消息(因爲這樣的節點可能在它自己的sub-DODAG內)。

此機制在8.2.2.4中會作進一步描述。

3.7.2 DODAG迴路
當節點離開DODAG然後又附着到之前sub-DODAG內的設備時,可能會形成DODAG迴路。這種情形在丟失DIO消息時特別容易發生。嚴格使用DODAGVersionNumber可排除此類迴路,但此類迴路在使用某些本地修復機制時會偶爾碰到。

例如,考慮以下情況,本地修復機制允許一個節點從DODAG分離,並公告值爲INFINITE_RANK的Rank(爲了毒化它的路由/通知它的sub-DODAG),然後再次附着回DODAG。在某些情況下,節點可能會附着到它之前的sub-DODAG內,導致了一個DODAG迴路,因爲INFINITE_RANK公告在LLN環境中丟失後會導致毒化失敗。(這種情況下,基於Rank的數據路徑校驗機制會最終檢測並觸發迴路的修復)
路由中毒/路由毒化(route poisoning): 做某種設置,來表示該網絡不可達。

3.7.3  DAO迴路
當雙親存在根據從孩子那接收和處理的DAO消息設置的路由, 而孩子隨後清除了相關的DAO狀態,此時可能會產生DAO迴路。在No-Path(一種DAO消息,它會導致之前宣告的前綴無效,見6.4.3節)被遺漏,並一直持續到所有狀態被清除時,會發生此種迴路。RPL包含一種可選機制來確認DAO消息,它可以減少單個DAO消息被潰漏的機率。RPL帶有迴路探測機制,它減輕DAO迴路所帶來的影響並觸發迴路維修(見11.2.2.3節)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章