跳到主要内容

7. 序列计数器 (Sequence Counters)

本节描述 RPL 中序列计数器的引导和运行通用方案, 例如 DIO 消息中的 DODAGVersionNumber, DAO 消息中的 DAOSequence, 以及 Transit Information 选项中的 Path Sequence.

7.1. 序列计数器概述 (Sequence Counter Overview)

本规范使用三种不同的序列号来验证协议信息的新鲜性和同步状态:

  • DODAGVersionNumber: 该序列计数器存在于 DIO Base 中, 用于指示正在形成的 DODAG 的 Version. 每当根决定形成新的 DODAG Version 以重新验证完整性并允许全局修复发生时, 根都会单调递增 DODAGVersionNumber. 当路由器加入新的 DODAG Version 时, DODAGVersionNumber 会沿 DODAG 向 Down 传播且保持不变. DODAGVersionNumber 在一个 DODAG 中具有全局意义, 并指示路由器正在其中运行的 DODAG Version. 较旧 (较小) 的值表示发起路由器尚未迁移到新的 DODAG Version, 因而一旦接收节点已迁移到较新的 DODAG Version, 就不能再将该发起路由器用作父节点.

  • DAOSequence: 该序列计数器存在于 DAO Base 中, 用于关联 DAO 消息和 DAO ACK 消息. DAOSequence 编号对发出 DAO 消息的节点具有本地意义, 供该节点自身使用, 用于检测 DAO 消息丢失并启用重试.

  • Path Sequence: 该序列计数器存在于 DAO 消息的 Transit Information 选项中. 该计数器的用途是区分两种情况: 较新的路由取代陈旧路由的移动场景, 以及同一 target 存在多条并行路由的路由冗余场景. Path Sequence 在一个 DODAG 中具有全局意义, 并指示到关联 target 的路由新鲜性. 从发起路由器收到的较旧 (较小) 值表示该发起路由器持有陈旧的路由状态, 不应再将其视为该 target 的潜在下一跳. Path Sequence 由通告 target 的节点计算, 即 Target 自身, 或代表主机通告 Target 的路由器; 当 DAO 内容由父路由器向根传播时, Path Sequence 保持不变. 如果主机没有向其路由器传递计数器, 则由该路由器代表主机计算 Path Sequence, 并且主机只能为此目的注册到一个路由器. 如果在某个给定时间点出于路由冗余目的向多个父节点发出包含同一 Target 的 DAO 消息, 则所有面向该同一 target 的 DAO 消息中的 Path Sequence 都相同.

7.2. 序列计数器操作 (Sequence Counter Operation)

RPL 序列计数器以 "lollipop" 方式 [Perlman83] 划分: 128 及以上的值用作线性序列, 用于指示重启并引导计数器; 小于或等于 127 的值用作大小为 128 的循环序列号空间, 如 [RFC1982] 中所述. 从线性区域过渡到循环区域时会考虑运行模式. 最后, 在循环区域中运行时, 如果检测到序列号相距过远, 则它们不可比较, 详见下文.

比较窗口 SEQUENCE_WINDOW = 16 基于 2^N 的值配置, 本规范中 N 定义为 4.

对于给定序列计数器:

  1. 序列计数器在使用前 SHOULD 初始化为实现定义的值, 该值为 128 或更大. 推荐值为 240 (256 - SEQUENCE_WINDOW).

  2. 当序列计数器递增会导致其超过最大值时, 序列计数器 MUST 回绕到零. 当递增大于或等于 128 的序列计数器时, 最大值为 255. 当递增小于 128 的序列计数器时, 最大值为 127.

  3. 比较两个序列计数器时, MUST 应用以下规则:

    1. 当第一个序列计数器 A 位于区间 [128..255], 第二个序列计数器 B 位于 [0..127] 时:

      1. 如果 (256 + B - A) 小于或等于 SEQUENCE_WINDOW, 则 B 大于 A, A 小于 B, 且二者不相等.

      2. 如果 (256 + B - A) 大于 SEQUENCE_WINDOW, 则 A 大于 B, B 小于 A, 且二者不相等.

      例如, 如果 A 为 240, B 为 5, 则 (256 + 5 - 240) 为 21. 21 大于 SEQUENCE_WINDOW (16); 因此 240 大于 5. 再举一例, 如果 A 为 250 且 B 为 5, 则 (256 + 5 - 250) 为 11. 11 小于 SEQUENCE_WINDOW (16); 因此 250 小于 5.

    2. 当待比较的两个序列计数器都小于或等于 127, 或者待比较的两个序列计数器都大于或等于 128 时:

      1. 如果两个序列计数器差值的绝对大小小于或等于 SEQUENCE_WINDOW, 则使用 [RFC1982] 中描述的比较来确定大于, 小于和相等关系.

      2. 如果两个序列计数器差值的绝对大小大于 SEQUENCE_WINDOW, 则已经发生去同步, 且这两个序列号不可比较.

  4. 如果确定两个序列号不可比较, 即比较结果未定义, 则节点应将比较视为按如下方式求值得到的结果: 优先选择最近被观察到递增的序列号. 如果做不到这一点, 节点应将比较视为按如下方式求值得到的结果: 最小化对自身状态造成的结果变化.