8、Upward Routes(上行路由)

本章讲述RPL是如何发现并维护上行路由的,描述了DODAG信息对象(DIOs)的使用,DIO报文用于发现及维护路由;详述了RPL如何生成并响应DIO;还描述了DODAG信息请求报文(DIS),它用于引发DIO传送。

正如3.2.8节所述,节点决定加入DODAG前必须为相关实例提供至少一个DODAG双亲作为默认路由。此默认路由使得数据包可向上转送直到碰到公共祖先,并从此处下行到达目的地。如果目的地不在DODAG内,DODAG根可以通过到外部DODAG的联通转发数据包,如果无法向外转发,则DODAG根不得不丢弃它。
一个DIO报文也可以传输显式路由信息:
DODAGID:

DODAGID是根的全局或唯一本地IPv6地址。节点加入DODAG需提供经DODAG双亲到达由根作为DODAGID使用地址的主机路由。

RIO Prefix:

根应该在DIO报文中放置一个或多个路由信息选项。RIO用于公告一个经根可达的外部路由,并附加如6.7.5节所描述的优先权,此RIO包括[RFC4191]中的RIO。它被当成根的一种与路由公告有所不同的能力,当数据包从节点通过附着的入口路由进行RPL域时,虽然RIO Prefix会使用此路由选择DODAG,但禁止使用其它路由协议重新分发。目标函数可以在RIO中使用路由公告或这些路由的优先级,以方便在相同实例中优选一个DODAG而不是其它。

8.1  DIO Base规则
1、对于以下DIO Base字段,一个非DODAG根节点必须公告相同值作为其优先DODAG双亲(定义于8.2.1节)。这样这些值将延DODAG向下无改变传播并由每个节点公告,从而形成到DODAG根的路由。这些字段包括:
⑴Grounded(G)
⑵Mode of Operation(MOP)
⑶DAGPrerference(Prf)
⑷Version
⑸RPLInstanceID
⑹DODAGID

2、节点将在每一跳更新下列字段:

⑴Rank
⑵DTSN

3、每个节点设置的DODAGID必须在RPL实例唯一且必须为属于根的可路由IPv6地址。

8.2  上行路由的发现和维护

上行路由发现允许节点通过发现DODAG的成员而加入DODAG,并加入和标识一组双亲。选择邻居和双亲的精确策略取决于实现并由目标函数驱动。本节指定了一系列为保证互操作性所必须遵守的规则。
8.2.1  DODAG版本内的邻居和双亲
RPL的上行路由发现算法和处理涉及链路本地节点的三个逻辑集。第一个是候选邻居集,它是可通过链路本地多播到达的节点的子集。此集合的选择依赖于实现和目标函数;第二个是双亲集,它是候选邻居集的受限子集;最后是首选双亲,它是双亲集成员,它是上行路由的首选下一跳。从概念上说,首选双亲应为单个双亲,然而它也可能是多个具有相同优选级和相同Rank的多个双亲的集合。
更准确地讲:
  1. DODAG双亲集必须是候选邻居集的子集。
  2. DODAG根的DODAG双亲集的大小必须为0(其实就是说根没有双亲)。
  3. 非DODAG根节点必须拥有一个大于等于1的双亲集(其实就是说至少有一个双亲)。
  4. 一个节点的首选DODAG双亲必须为其DODAG双亲集成员。
  5. 一个节点的Rank必须大于其所有DODAG双亲集成员的Rank。
  6. 如果邻居可达性验证(NUD[RFC4861])或等效机制确定一个邻居不再可达,在计算和公告路由时,RPL节点将禁止将此节点放入候选邻居集,直到确定此节点再次可达为止。当路由通过一个不可达邻居时,必须从路由表中删除此路由。

这些规则确保了DODAG内节点有一致的局部顺序。只要节点的Rank不变,当到根的每一跳上的Rank减少时,以上规则就可确保每个节点到DODAG根的路由无环路。

8.2.2  跨DODAG版本的邻居和双亲

上述规则管理单一DODAG版本。本节定义存在多个DODAG版本时RPL是如何运行的。

8.2.2.1  DODAG版本
  1. (RPLInstanceID,DODAGID,DODAGVersionNumber)元组唯一定义了一个DODAG版本。节点DODAG双亲集中的每一个元素,由从每个DODAG双亲那最后一次侦听到DIO报文传送,必须隶属于相同的DODAG版本。节点候选邻居集中的元素则可能分属不同的DODAG版本。
  2. 如果某节点的DODAG双亲集中的每个元素都属于一个DODAG版本,或是此DODAG版本的根,则它是此DODAG版本成员。
  3. 当节点不是某DODAG版本成员时,禁止为此DODAG版本发送DIOs。
  4. DODAG根可增加它们公告的DODAGVersionNumber值,从而转移到新的DODAG版本。在DODAG根增加它的DODAGVersionNumber时,必须遵循每7章所描述的序列号算法中的协议。DODAGVersionNumber值增加所触发的事件将稍在本节及18章中描述。
  5. 在一给定DODAG内,非根节点所公告的DODAGVersionNumber不能高于之前所侦听到的最高DODAGVersionNumber。更高请参照第7章中的定义的大于运算。
  6. 一旦节点通过发送DIO公告了DODAG版本,它必须不能是同一DODAG的上一DODAG版本的成员(也就是具有相同的RPLInstanceID,相同的DODAGID,更低的DODAGVersionNumber )。更低请参照第7章中所定义的小于运算。
当一个非根节点的DODAG双亲为空时(也就是节点不再跟DODAG关联,最后一个双亲被移除),直到具体实现的本地计时器到期前,都不应该抑制DODAG信息。在抵制“旧”DODAG状态之前的间隔期间,节点能够观察到,如果DODAGVersionNumber值增加,应该出现新的双亲。如果节点是无意中在它自己先前的子DODAG中重新加入旧的DODAG Version,这将有助于防止环路的发生。

当 DODAGVersionNumber增加时,一个新的DODAG版本从DODAT根向外传播。一个公告新 DODAGVersionNumber的双亲不能属于公告旧 DODAGVersionNumber的子节点。因此,节点可以安全地添加携带新 DODAGVersionNumber的任意Rank的双亲,从而避免形成回路。

假设节点离开DODAGVersionNumber值为N的DODAG,节点有一个子DODAG,并打算通过公告一个值为INFINITE_RANK的Rank来毒化那个子DODAG,但此公告在LLN中丢失。此时,如果节点收到一个候选邻居公告之前DODAGVersionNumber值为N的DODAG的位置,而那个候选邻居有可能在节点之前的子DODAG之中,这样,在将候选邻居添加为双新的时候有可能导致回路。此例中,如果候选邻居所公告的DODAGVersionNumber值为N+1,那么它必然是安全的,因为它肯定不存在于原先节点的子DODAG之中,原因是在原先节点在离开时,候选邻居已经通过侦听来自DODAG根的消息增加了它的DODAGVersionNumber值。据以上所述,分离节点记住原始DODAG信息,包括DODAGVersionNumber N是有用的。
DODAG根何时增加DODAGVersionNumber 依赖于实现,超出本文范围。包括周期性增加DODAGVersionNumber ,在管理上介入,或在应用层面侦测连接丢失或无效DODAG。
在节点转换到一个新的DODAG版本并公告它之后,上述规则使得它一旦决定公告新DODAG版本,则再也无法公告之前的DODAG版本(之前的DODAGVersionNumber)。
8.2.2.2  DODAG根
  1. 无法满足应用定义目标的DODAG根禁止将Grounded位置1。
  2. DODAG根必须公告值为ROOT_RANK的Rank。
  3. 一个DODAG双亲集为空的节点有可能成为浮动DODAG的根。也可以将它的DAGPreference置1,以便有较低的优先权。

在那些使用非LLN链路联合数个LLN根的布署中,在非RPL链路上运行RPL并使用一个路由器作为“骨干根”(backbone root)是有可能的。骨干根是DODAG的虚拟根,并展示了骨干上的值为BASE_RANK的Rank。所有的LLN根的双亲都指向那个骨干根,包括骨干根自身(如果它也作为LLN根运行),并向LLN揭示了值为ROOT_RANK的Rank。这些虚拟根是相同DODAG的一部分,且公告相同的DODAGID。它们在骨干中通过虚拟根协调 DODAGVersionNumber  及其它DODAG参数。协调的方法超出本规范范围(将在将来的配套文档中定义)。

8.2.2.3  DODAG选择
目标函数以及DAG公告的路由度量和约束集合决定了节点是如何选择它的邻居集、双亲集以及首先双亲的。这种隐式选择也决定了DAG内的DODAG。此类选择可包括管理优先(Prf)、度量或其它考虑。
如果节点有加入更优先DODAG选项的同时仍满足其它优化目标,那么节点通常会寻求加入由OF确定的更优先DODAG。对于所有其它条件相同的情况,留给具体实现来决定哪个DODAG最优先(提示,因为对于每个RPL实例,节点必须只能加入一个DODAG)。
8.2.2.4  DODAG版本中的Rank和移动
  1. 节点所公告的Rank绝不能小于或等于其DODAG版本内双亲集任意成员的Rank。
  2. 节点所公告的Rank可以小于其之前在DODAG版本内所公告的Rank。
  3. 假设在一个DODAG版本内,一个给定节点所公告的最低Rank为L,在相同DODAG 版本内,节点所公告的有效Rank不能大过L+DAGMaxRankIncrease。INFINITE_RANK对于此规则是个例外:节点可以在DODAG版本内无限制地公告INFINITE_RANK。如果节点的Rank大于L+DAGMaxRankIncrease,当它公告Rank时,必须将其Rank公告为INFINITE_RANK。
  4. 节点可以在任何时间选择加入同一RPL实例中的不同DODAG。此种加入没有Rank上的限制,除非节点之前曾是那个不同的DODAG版本成员。在这种情况下,必须遵守上面第3条规则。直到节点发送DIO指示它的新DODAG成员关系,在此之前,节点必须按照先前的DODAG转发数据包。
  5. 在从合适的DODAG双亲那收到下一DODAGVersionNumber公告后的任何时刻,节点都可以选择迁移至DODAG内的下一DODAG版本。
从概念上讲,DODAG版本内的DODAG双亲集是由实现来维护的。节点移动必定会引起DODAG双亲集的改变。向上移动不会有形成回路的风险,但向下移动则会,所以操作会受到额外限制。
当节点迁移至下一个DODAG版本,将会为新版本重建DODAG双亲集。而实现可以将迁移推迟一段适当的时间,以查看是否有某些拥有更好度量但更高Rank的邻居宣告它自己。类似地,当一个节点跳到一个新的DODAG,它需要为这个新DODAG构造一个新的DODAG双亲集。
如果节点沿着它所附着的DODAG向下移动,则会增加它的Rank,那么在移动之前它可能会毒化它的路由并延迟一段时间,如8.2.2.5所述。
节点可以无限制地加入任意一个之前从未加入过的DODAG版本。但如果节点曾是某DODAG版本成员,那么它必须继续遵守规则,而且在此DODAG版本生命周期任一时间点不能公告大于L+DAGMaxRankIncrease的Rank。必须遵守这条规则,以便不产生漏洞,此漏洞使得节点一直快速增加其Rank直到INFINITE_RANK,这可能会对其它节点有影响,并产生资源浪费和无穷计数的情况。
8.2.2.5  毒化
  1. 节点通过公告值为INFINITE_RANK的Rank来毒化路由。
  2. 节点的双亲集中禁止存在任意Rank值为INFINITE_RANK的节点。

尽管实现可能以毒化的原因公告INFINITE_RANK,但这样做与设置Rank值为INFINITE_RANK有所不同。例如,一个节点可能在持续发送所包含Rank值不为INFINITE_RANK的数据包的同时,仍然在其DIO中公告INFINITE_RANK。

当一个旧双亲被观察到公告了值为INFINITE_RANK的Rank,此双亲已经离开DODAG,并不再作为双亲,也不存在任何Rank值大于INFINITE_RANK的节点,因此旧节点无法再成为双亲,并从双亲集中删除。

8.2.2.6  分离
节点无法在一给定DODAG版本内保持对DODAG的连接,也就是说,在没有违反本规范规则的情况下无法维持非空双亲集,此种情况下,节点可能脱离这个DODAG版本。脱离的节点成为它自己浮动DODAG的根,此时节点应立即通过一个DIO来公告这种新情况以代替毒化。
8.2.2.7  跟随双亲
如果节点从它的某个DODAG双亲收到一个DIO,这表示此双亲已经离开DODAG,如果可能,节点应当通过替代DODAG双亲留在当前DODAG内。它也可以跟随离开的双亲。
DODAG双亲可能会移动、迁移至邻接的DODAG版本,或跳至一个不同的DODAG。此时节点如果存在替代双亲,应当优先保留在当前DODAG内。如无其它选择,则应当跟随双亲。
8.2.3  DIO报文通信
当收到一个DIO报文,接收节点必须首先决定是否接收DIO报文以做进一步处理,如果合适,则在随后提交DIO报文做进一步处理。
  1. 如果DIO报文异常,则说明此报文和适合做进一步处理,必须静默丢弃(参考18章有关错误日志内容)。
  2. 如果DIO报文发送者是候选邻居成员,并且报文无异常,节点必须处理DIO。
8.2.3.1  DIO报文处理
当从候选邻居那接收到DIO报文时,邻居可能会按照DODAG发现规则被提升为DODAG双亲(如8.2节所述)。当节点在DODAG双亲集中放置一个邻居时,它将通过新的DODAG双亲节点附着于DODAG。
最优先的双亲应当用于限制那些可能变为DODAG双亲的其他节点。DODAG双亲集中的一些节点的Rank可能小于或等于最优先DODAG双亲的Rank。(这种情况有可能发生,例如一个拥有较低Rank的能量受限设备按照优化目标无法成为最优,结果就是拥有一个更高Rank的更优先双亲。)
8.3  DIO传送
RPL节点使用涓流计时器[RFC6206]发送DIO。来自发送者的DIO拥有较小的DAGRank不会改变接收者的双亲集、首选双亲或Rank,这对涓流计时器来说应该被当成“一致”。
以下数据包和事件对涓流计时器来说,必须被认定为不一致,并导致涓流计时器重启:
  • 当节点转发数据包时检测到不一致,详见11.2节。
  • 当节点收到无请求信息选项的DIS多播信息,除非DIS标志位约束了此种行为。
  • 当节点收到带请求信息选项的DIS多播信息,并匹配请求信息选项中的所有断言,除非DIS标志位约束了此种行为。
  • 当一个节点加入新的DIDAG版本(例如更新它的DODAGVersionNumber,加入新的RPL实例等等)。
注意,此清单并不完善,一个实现可能会将其它的信息或事件认定为不一致。
节点不应当在回应单播DIS信息时重启它的DIO涓流计时器。当节点收到一个不带请求信息选项的单播DIS时,作为回应,它必须单播一个DIO给发送者。此DIO必须包括一个DODAG配置选项。当节点收到一个带请求信息选项的单播DIS并匹配请求信息选项中的断言时,它必须向发送者单播一个DIO作为回应。此单播DIO必须包含DODAG配置选项。因此,节点可以向潜在DODAG双亲发送单播DIS信息以探查DODAG配置和其它参数。
8.3.1  涓流参数
涓流计时器的配置参数详述如下:
Imin:

取自DIO报文,为(2 ^ DIOIntervalMin)毫秒。默认值为DEFAULT_DIO_INTERVAL_MIN。

Imax:

取自DIO报文,为DIOIntervalDoublings。默认值为DEFAULT_DIO_INTERVAL_DOUBLINGS。

k:

取自DIO报文,为DIORedundancyConstant。默认值为DEFAULT_DIO_REDUNDANCY_CONSTANT。在RPL中,k值为0x00被当成无穷大的冗余常量,也就是涓流永远抵制信息。

8.4  DODAG选择
DODAG选择依赖于实现和目标函数。为了限制反复无常的移动和所有度量相等,节点应当保留它们之前的选择。此外,节点至少在有更可靠的选择时,应当提供一种手段以过滤掉那些被检测出可用性飘忽不定的双亲。
当不可能连接至一个接地的DODAG或需要优先考虑安全或其它原因,分散的DODAG可以尽可能地聚合成更大的DODAG以便能够在LLN中联通。
节点在考虑将某个候选邻居作为DODAG双亲前,应当验证与该邻居的双向连通性和足够的链路质量。
8.5  作为叶子节点运行
在某些情况下,RPL节点可能仅作为叶子节点附着于DODAG。一个例子就是当节点无法理解或不支持RPL实例的目标函数(策略)或公告的度量/约束时。按18.6节所指定的相关策略函数,节点即可能作为叶子节点加入DODAG,也可能不加入DODAG。正如18.5节所提及到的,此时建议将其记录为故障。
叶子节点不扩展DODAG的连通,然而某些场合,叶子节点仍有可能时而发送DIO,尤其当叶子节点有可能不总是叶子节点或检测到不一致时。
作为叶子节点运行必须遵循以下规则:
  1. 禁止发送包含DAG Metric Container的DIO。
  2. 它的DIO必须公告值为INFINITE_RANK的DAGRank。
  3. 它可以抑制DIO发送,除非在数据包转发期期间检测到不一致时DIO发送已经触发,或为了回应一个单播DIS信息,无论哪种情况DIO发送都不能被禁止。
  4. 它可以如9.2节所述的那样发送单播DAO。
  5. 它可以如9.10节所述的那样向邻居发送“一跳”多播DAO。
有一种特殊情况需要叶子节点发送DIO,当叶子节点之前是另一DODAG的成员,并且另一节点转发的信息呈现的是旧拓扑,此时触发了一个不一致,叶子节点需要发送DIO以修复这种不一致。注意,由于LLN的有损特性,即使叶子节点在成为叶子节点之前通过在旧DODAG公告一个值为INFINITE_RANK的Rank来乐观地毒化其路由,那个公告也可能会丢失,因此需要叶子节点必须能够在其后发送DIO以修复这种不一致。
一般情况下,叶子节点禁止将自己公告为路由。
8.6  Administrative Rank
有时候,当目标函数基于某些具体实施策略和属性所计算出的Rank超出范围时,调整节点的Rank公告可能会更有利。例如, 一个电池电量有限的节点更应当成为叶子节点,除非没有选择余地。然后可以增加由目标函数所指定的Rank估值,以便揭露其夸大的Rank值。

RPL(7):RFC6550翻译(7)---Upward Routes相关推荐

  1. RPL(10):RFC6550翻译(10)---分组转发和环路避免/检测

    11.分组转发和环路避免/检测 11.1  分组转发的建议 本文详述了一个路由协议.提供这些非规范建议是为了通过举例说明这样的实现如何与RPL一起工作,为转发实现设计提供帮助. 当转发数据包到目的地是 ...

  2. RPL(3):RFC6550翻译(3)---协议综述

    3.协议综述 本节目的是本着[RFC4101]的精神描述RPL.协议细节可以后面章节找到. 3.1 拓扑结构 本节介绍可形成的基本RPL拓扑结构,及构造这些拓扑结构的规则,例如,指导DODAG形成的规 ...

  3. 如何理解 Flutter 路由源码设计?| 开发者说·DTalk

    本文原作者: Nayuta,原文发布于: 进击的 Flutter   本期看点: 70 行代码实现一个丐版路由 路由源码细节解析 导语 某天在公众号看到这样一个问题 这问题我熟啊,刚好翻译 Overl ...

  4. Spatial As Deep: Spatial CNN for Traffic Scene Understanding论文翻译

    Spatial As Deep: Spatial CNN for Traffic Scene Understanding论文翻译 Abstract摘要 Convolutional neural net ...

  5. 《翻译》Intel 64 与 IA-32 架构软件开发者手册卷1翻译

    <前言> 翻译自官方的PDF版手册,可以从下述站点下载英文原版: http://www.intel.com/content/www/us/en/processors/architectur ...

  6. CPL DPL RPL的区别 一致性代码段和非一致性代码段

    概述:在谈论保护模式编程的时候,一直会有这样的困惑:为什么除了CPL和DPL还有RPL?什么时候高特权级不能访问低特权级?什么时候低特权级不能访问高特权级?一致性代码和非一致性代码有什么区别?等等这些 ...

  7. ASP.NET 4.0 的新特性(2 在WebForm中使用Routing)(翻译)

        接着上次的那个翻译,希望能对大家的学习有一点帮助! 原文:http://geekswithblogs.net/ranganh/archive/2009/08/20/whatrsquos-new ...

  8. Paper:《NÜWA: Visual Synthesis Pre-training for Neural visUal World creAtion,女娲:用于神经视觉世界创造的视觉》翻译与解读

    Paper:<NÜWA: Visual Synthesis Pre-training for Neural visUal World creAtion,女娲:用于神经视觉世界创造的视觉>翻 ...

  9. AI:Algorithmia《2020 state of enterprise machine learning—2020年企业机器学习状况》翻译与解读

    AI:Algorithmia<2020 state of enterprise machine learning-2020年企业机器学习状况>翻译与解读 目录 <2020 state ...

  10. Paper:Xavier参数初始化之《Understanding the difficulty of training deep feedforward neural networks》的翻译与解读

    Paper:Xavier参数初始化之<Understanding the difficulty of training deep feedforward neural networks>的 ...

最新文章

  1. OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks
  2. ocr 超时小票识别_【FreeOCR(文字扫描识别软件)和小票打印机测试工具哪个好用】FreeOCR(文字扫描识别软件)和小票打印机测试工具对比-ZOL下载...
  3. iphone闪退修复工具_苹果中国回应iPhone致命漏洞:不予置评
  4. [BZOJ3992]序列统计
  5. Python猜字游戏(用函数)(最新版)
  6. element ui需要引入样式吗_彻底学会element-ui按需引入和纯净主题定制
  7. vs2008调试c语言,VS2008调试Release程序-Dump文件方式_C/C++技术分享_看流星社区 www.kanliuxing.com...
  8. 数据中台不是企业的万能妙药
  9. linux内核驱动中对字符串的操作【转】
  10. ORACLE数据库测试题(一)
  11. 帆软关于排名公式、分组排名问题开窗函数
  12. X-VECTORS: ROBUST DNN EMBEDDINGS FOR SPEAKER RECOGNITION论文翻译
  13. Bypass注入(WAF绕过)
  14. ubuntu下使用vscode阅读内核源码或uboot源码使用技巧——search.excludefiles.exclude
  15. GraphSage-TF代码解读
  16. luogu1968 美元汇率
  17. Oracle数据库配置管理(一)
  18. 人工生命全景图:如何创造出超越人工智能的生命系统
  19. 如何批量生成文件夹?
  20. PG 利用FDW的水平分片

热门文章

  1. 【VOLTE】【SRVCC】 SRVCC TO 3GPP
  2. ECSHOP漏洞集:http://sebug.net/appdir/ECSHOP
  3. CET6 历年真题原词复现 核心词汇 做题技巧 听力拿分技巧汇总(这篇文章是英语四六级考试最后的版本,谢谢大家一路陪伴)
  4. Linux之Redis安装(解压版)
  5. 输入法 箭头符号大全
  6. steam无法连接至计算机,大神传授win7系统游戏无法连接至steam网络一直卡在“正在连接steam”界面的设置技巧...
  7. c语言程序设计21点扑克牌,C语言程序设计21点扑克牌游戏.doc
  8. GA-RPN:Region Proposal by Guided Anchoring
  9. C++ RQNOJ 星门龙跃
  10. 电子科技大学计算机导师李珂,导师个人信息 - 电子科大研招网