3.7.1. 贪婪性和不稳定性 (Greediness and Instability)
如果某个节点为了扩大父节点集合或改进其他度量, 试图在 DODAG 版本中移动得更深 (增加 Rank), 则该节点是贪婪的. 一旦节点加入 DODAG 版本, RPL 就会禁止某些行为, 包括贪婪行为, 以防止 DODAG 版本中由此产生的不稳定性.
假设某个节点愿意接收并处理来自其自身子 DODAG 中节点的 DIO 消息, 通常也就是来自比它自身更深的节点的 DIO 消息. 在这种情况下, 可能会形成反馈环路, 其中两个或更多节点在尝试相互优化的同时, 持续尝试在 DODAG 版本中移动. 在某些情况下, 这会导致不稳定. 因此, RPL 将节点可处理来自更深节点的 DIO 消息的情况限制为某种形式的本地修复. 这种方法创建了一个 "event horizon", 使得某个节点不会因自身子 DODAG 中节点的行为而在超过某个限制后受到影响并进入不稳定状态.
3.7.1.1. 示例: 贪婪父节点选择和不稳定性 (Greedy Parent Selection and Instability)
(A) (A) (A)
|\ |\ |\
| `-----. | `-----. | `-----.
| \ | \ | \
(B) (C) (B) \ | (C)
\ | | /
`-----. | | .-----'
\| |/
(C) (B)
-1- -2- -3-
图 3: 贪婪 DODAG 父节点选择
图 3 描绘了一个 DODAG 的三种不同配置. 在所有三种配置中, (B) 和 (C) 之间都存在可用链路. 在图 3-1 中, 节点 (A) 是节点 (B) 和 (C) 的 DODAG 父节点. 在图 3-2 中, 节点 (A) 是节点 (B) 和 (C) 的 DODAG 父节点, 节点 (B) 也是节点 (C) 的 DODAG 父节点. 在图 3-3 中, 节点 (A) 是节点 (B) 和 (C) 的 DODAG 父节点, 节点 (C) 也是节点 (B) 的 DODAG 父节点.
如果 RPL 节点过于贪婪, 也就是试图在其最优选父节点之外再优化出更多父节点, 就可能导致不稳定. 考虑图 3-1 所示的 DODAG. 在此示例中, 节点 (B) 和 (C) 可能最偏好节点 (A) 作为 DODAG 父节点, 但我们考虑它们在贪婪条件下运行并试图优化出两个父节点的情况.
-
令图 3-1 为初始条件.
-
假设节点 (C) 首先能够离开 DODAG, 并以更低的 Rank 重新加入, 同时将节点 (A) 和 (B) 作为 DODAG 父节点, 如图 3-2 所示. 此时节点 (C) 比节点 (A) 和 (B) 都更深, 且节点 (C) 满足于拥有两个 DODAG 父节点.
-
假设节点 (B) 出于贪婪, 愿意接收并处理来自节点 (C) 的 DIO 消息 (这违反 RPL 规则), 然后节点 (B) 离开 DODAG, 并以更低的 Rank 重新加入, 同时将节点 (A) 和 (C) 作为 DODAG 父节点. 此时节点 (B) 比节点 (A) 和 (C) 都更深, 并满足于拥有两个 DAG 父节点.
-
随后, 节点 (C) 由于同样贪婪, 会离开并在更深位置重新加入, 以再次获得两个父节点, 并具有比这两个父节点更低的 Rank.
-
接下来, 节点 (B) 会再次离开并在更深位置重新加入, 以再次获得两个父节点.
-
然后, 节点 (C) 再次离开并在更深位置重新加入.
-
该过程会重复, DODAG 会在图 3-2 和图 3-3 之间振荡, 直到节点计数至无穷并再次重新开始该循环.
-
可以通过 RPL 中的机制避免该循环:
-
节点 (B) 和 (C) 保持在足以附着到其最优选父节点 (A) 的 Rank, 而不追求任何更深 (更差) 的备用父节点 (节点不贪婪).
-
节点 (B) 和 (C) 不处理来自比自身更深节点的 DIO 消息 (因为这些节点可能位于其自身的子 DODAG 中).
-
这些机制在第 8.2.2.4 节中进一步描述.