9. Downward 路由 (Downward Routes)
本节描述 RPL 如何发现和维护 Downward 路由. RPL 使用目的地通告对象 (Destination Advertisement Object, DAO) 消息构造和维护 Downward 路由. Downward 路由支持从 DODAG 根到叶节点的 P2MP 流. Downward 路由也支持 P2P 流: P2P 消息可以通过 Upward 路由流向 DODAG 根 (或共同祖先), 然后通过 Downward 路由从 DODAG 根流向目的地.
本规范描述 RPL Instance 可选择用于维护 Downward 路由的两种模式. 第一种模式称为 "Storing", 节点为其 sub-DODAG 存储 Downward 路由表. 在 storing 网络中, Downward 路由上的每一跳都会检查其路由表以决定下一跳. 第二种模式称为 "Non-Storing", 节点不存储 Downward 路由表. Downward 分组使用由 DODAG 根填充的源路由进行路由 [RFC6554].
RPL 允许 storing 和 non-storing 网络都使用一种简单的一跳 P2P 优化. 节点可以将目的地为一跳邻居的 P2P 分组直接发送给该节点.
9.1. 目的地通告父节点 (Destination Advertisement Parents)
为建立 Downward 路由, RPL 节点向 Upward 发送 DAO 消息. 这些 DAO 消息的下一跳目的地称为 "DAO parents". 节点的 DAO parents 集合称为 "DAO parent set".
-
节点 MAY 使用 all-RPL-nodes 组播地址发送 DAO 消息, 这是配置一跳路由的一种优化. 组播 DAO 发送时 'K' 位 MUST 被清零.
-
节点的 DAO parent set MUST 是其 DODAG parent set 的子集.
-
在 Storing 运行模式下, 节点 MUST NOT 将单播 DAO 消息寻址到非 DAO parent 的节点.
-
在 Storing 运行模式下, DAO 消息的 IPv6 源地址和目的地址 MUST 是链路本地地址.
-
在 Non-Storing 运行模式下, 节点 MUST NOT 将单播 DAO 消息寻址到非 DODAG 根的节点.
-
在 Non-Storing 运行模式下, DAO 消息的 IPv6 源地址和目的地址 MUST 是唯一本地地址或全局地址.
DAO parent 的选择依赖于实现和 Objective Function.
9.2. Downward 路由发现和维护 (Downward Route Discovery and Maintenance)
目的地通告可以配置为完全禁用, 也可以按 DIO 消息中 MOP 所报告的方式以 Storing 或 Non-Storing 模式运行.
-
所有加入 DODAG 的节点 MUST 遵守根给出的 MOP 设置. 无法作为路由器完整参与的节点, 例如不匹配通告 MOP 的节点, MAY 作为叶节点加入 DODAG.
-
如果 MOP 为 0, 表示没有 Downward 路由, 则节点 MUST NOT 传输 DAO 消息, 并且 MAY 忽略 DAO 消息.
-
在 Non-Storing 模式下, DODAG 根 SHOULD 为从 DAO 学到的目的地存储源路由表项. DODAG 根 MUST 能够为这些从已存储 DAO 学到的目的地生成源路由.
-
在 Storing 模式下, 所有非根, 非叶节点 MUST 为从 DAO 学到的目的地存储路由表项.
DODAG 可以具有 MOP 字段定义的若干可能运行模式之一. 它要么不支持 Downward 路由, 要么通过 DODAG 根的源路由支持 Downward 路由, 要么通过网络内路由表支持 Downward 路由.
当通过 DODAG 根的源路由支持 Downward 路由时, 通常期望 DODAG 根已经存储从 DAO 学到的源路由信息, 以便构造源路由. 如果 DODAG 根未能存储某些信息, 则某些目的地可能不可达.
当通过网络内路由表支持 Downward 路由时, 本规范定义的组播操作可能受支持, 也可能不受支持, 这也由 MOP 字段指示.
当按本规范所述通过网络内路由表支持 Downward 路由时, 期望充当路由器的节点已经得到充分配置, 能够保存所需路由表状态. 如果充当路由器的节点无法保存完整路由表状态, 则路由状态不完整, 消息可能因此被丢弃, 并且可能记录故障 (第 18.5 节). RPL 的未来扩展可以进一步说明用于管理这种情况的细化动作/行为.
截至本规范撰写时, RPL 不支持混合模式运行, 即某些节点进行源路由, 其他节点存储路由表: RPL 的未来扩展可能支持这种运行模式.
9.2.1. Path Sequence 的维护 (Maintenance of Path Sequence)
对于与某节点关联 (由该节点拥有) 的每个 Target, 该节点负责发出 DAO 消息以配置 Downward 路由. 这些 DAO 消息中包含的 Target+Transit 信息随后沿 DODAG 向 Up 传播. Transit Information 选项中的 Path Sequence 计数器用于指示新鲜性, 并按第 7 节所述更新陈旧的 Downward 路由信息.
对于与某节点关联 (由该节点拥有) 的 Target, 在以下情况下该节点 MUST 递增 Path Sequence 计数器并生成新的 DAO 消息:
-
Path Lifetime 需要更新 (例如刷新或 no-Path).
-
DODAG Parent Address 子字段列表需要更改.
对于与某节点关联 (由该节点拥有) 的 Target, 该节点 MAY 偶尔递增 Path Sequence 计数器并生成新的 DAO 消息, 以刷新 Downward 路由信息. 在 Storing 模式下, 该节点为其每个 DAO parent 生成这样的 DAO, 以支持多路径. 对同一 Target 在同一时间生成的所有 DAO MUST 在 Transit Information 中使用相同的 Path Sequence 发送.
9.2.2. DAO 消息生成 (Generation of DAO Messages)
节点可能在收到 DAO 消息时, 因 DAO parent set 变化, 或为响应其他事件 (例如相关前缀生命周期到期) 而发送 DAO 消息. 在接收 DAO 的情况下, 关键在于 DAO 消息是否为 "new" 或包含新信息. 在 Non-Storing 模式下, 节点收到的每个 DAO 消息都是 "new". 在 Storing 模式下, 如果 DAO 消息对其包含的某个 Target 满足以下任一条件, 则该 DAO 消息是 "new":
-
它具有更新的 Path Sequence 编号,
-
它具有额外的 Path Control 位, 或者
-
它是移除到某前缀最后一条 Downward 路由的 No-Path DAO 消息.
如果节点从其 sub-DODAG 收到的 DAO 消息不是新的, 则该节点 MAY 抑制 DAO 消息传输调度.
9.3. DAO 基本规则 (DAO Base Rules)
-
如果节点发送的 DAO 消息包含比先前 DAO 消息传输更新或不同的信息, 它 MUST 将 DAOSequence 字段至少递增一. 与先前 DAO 消息传输完全相同的 DAO 消息传输 MAY 递增 DAOSequence 字段.
-
DAO 消息的 RPLInstanceID 和 DODAGID 字段 MUST 与该节点父节点集合成员以及该节点传输的 DIO 中的值相同.
-
节点 MAY 在单播 DAO 消息中设置 'K' 标志, 以请求单播 DAO-ACK 作为响应, 从而确认该尝试.
-
收到设置了 'K' 标志的单播 DAO 消息的节点 SHOULD 以 DAO-ACK 响应. 收到未设置 'K' 标志的 DAO 消息的节点 MAY 以 DAO-ACK 响应, 特别是用于报告错误条件.
-
在单播 DAO 消息中设置 'K' 标志但未收到 DAO-ACK 响应的节点 MAY 重新调度该 DAO 消息传输以再次尝试, 直到达到实现特定的重试次数.
-
节点 SHOULD 忽略没有更新序列号的 DAO, 并且 MUST NOT 进一步处理它们.
不同于 DIO 的 Version 字段只由 DODAG 根递增并由其他节点原样重复, DAOSequence 值对每个节点都是唯一的. 单播和组播 DAO 消息的序列号空间可以相同, 也可以不同. RECOMMENDED 使用相同的序列号空间.
9.4. DAO 消息结构 (Structure of DAO Messages)
在 storing 和 non-storing 网络中, DAO 遵循共同结构. 在最通用的形式中, DAO 消息可以包含若干选项组, 其中每个组由一个或多个 Target 选项以及其后的一个或多个 Transit Information 选项组成.
整个 Transit Information 选项组适用于整个 Target 选项组. 后续章节描述每种运行模式的更多细节.
-
RPL 节点 MUST 在其传输的每个 DAO 消息中包含一个或多个 RPL Target 选项. 如果某节点需要 DODAG 配置到该节点的 Downward 路由, 则一个 RPL Target 选项 MUST 具有包含该节点 IPv6 地址的前缀. RPL Target 选项 MAY 紧随一个用于限定它的不透明 RPL Target Descriptor 选项.
-
当节点更新覆盖其某个地址的 Target 选项的 Transit Information 选项中的信息时, 它 MUST 递增该 Transit Information 选项中的 Path Sequence 编号. Path Sequence 编号 MAY 偶尔递增, 以导致 Downward 路由刷新.
-
单播 DAO 消息中的一个或多个 RPL Target 选项 MUST 后随一个或多个 Transit Information 选项. 所有 transit 选项适用于紧邻它们之前的所有 Target 选项.
-
组播 DAO MUST NOT 在 Transit Information 选项中包含 DODAG Parent Address 子字段.
-
收到并处理包含特定 Target 信息的 DAO 消息且已有该 Target 先前信息的节点, MUST 使用与该 Target 关联的 Transit Information 选项中的 Path Sequence 编号, 按第 7 节确定该 DAO 消息是否包含更新信息.
-
如果节点收到不遵循上述规则的 DAO 消息, 它 MUST 丢弃该 DAO 消息且不进一步处理.
在 Non-Storing 模式下, 根通过递归查找将 Target (地址或前缀) 与 transit 地址绑定在一起的一跳信息, 逐跳构建严格源路由头部. 在某些情况下, 当子地址派生自父节点拥有并通告的前缀时, 根可以为构造源路由头部而推断这种父子关系. 在所有其他情况下, 必须从可达 target 向根告知 transit-Target 关系, 以便稍后能够递归构造路由头部. 在 DAO 消息中作为 Target 通告的地址 MUST 与关联 Transit Information 中指示的地址所有者位于同一路由器中, 或可由该路由器在链路内到达. 以下额外规则适用于确保端到端源路由路径的连续性:
-
transit 选项中使用的父节点地址 MUST 取自该父节点发送的且设置了 'R' 标志的 PIO. PIO 中的 'R' 标志表示 prefix 字段实际上包含完整父节点地址, 但子节点 SHOULD NOT 假定该父节点地址在链路内.
-
设置了 'A' 标志的 PIO 表示 RPL 子节点可以使用该前缀自动配置地址. 在 PIO 中通告设置了 'A' 标志的前缀的父节点 MUST 确保该 PIO 中的地址或整个前缀可从根到达, 方法是将其作为 DAO target 通告. 如果父节点还设置了 'L' 标志, 表示该前缀在链路内, 则它 MUST 在 DAO 消息中将整个前缀作为 Target 通告. 如果 'L' 标志被清零且 'R' 标志被设置, 表示父节点在 PIO 中提供自己的地址, 则该父节点 MUST 将该地址作为 DAO target 通告.
-
在 DAO 消息中作为 Target 通告的地址 MUST 与关联 Transit Information 中指示的地址所有者位于同一路由器中, 或可由该路由器在链路内到达.
-
为了实现路由头部的最佳压缩, 父节点 SHOULD 在所有设置了 'A' 标志且清除了 'L' 标志的 PIO 中设置 'R' 标志, 并且子节点 SHOULD 优先使用用于自动配置 DAO 消息中作为 Target 通告地址的 PIO 中找到的父节点地址作为 transit.
-
路由器可能具有对某个父节点而言未知为链路内的 target, 这可能是因为它们是位于备用接口上的地址, 或者因为它们属于 RPL 外部节点, 例如连接的主机. 为了将此类 Target 注入 RPL 网络, 路由器 MUST 在该 target 的 Transit Information 选项中将自身通告为 DODAG Parent Address 子字段, 使用一个对该节点的 DAO parent 而言在链路内的地址. 如果 Target 属于外部节点, 则路由器 MUST 在 Transit Information 中设置 External 'E' 标志.
从设置了 'L' 标志的父节点 PIO 自动配置地址的子节点无需将该地址作为 DAO Target 通告, 因为父节点会确保整个前缀已经可从根到达. 但是, 如果未设置 'L' 标志, 则在 Non-Storing 模式下, 子节点必须使用父节点的可达地址向根告知父子关系, 以便能够递归构造路由头部. 这通过在 DAO 消息中将父节点地址作为 transit 与作为 Target 的子节点地址关联来完成.
9.5. DAO 传输调度 (DAO Transmission Scheduling)
因为 DAO 向 Upward 流动, 接收单播 DAO 可以触发向 DAO parent 发送单播 DAO.
-
收到带有更新信息的单播 DAO 消息时, 例如包含具有新 Path Sequence 的 Transit Information 选项, 节点 SHOULD 发送 DAO. 它 SHOULD NOT 立即发送该 DAO 消息. 它 SHOULD 延迟发送 DAO 消息, 以聚合来自其他节点的 DAO 信息, 这些节点以它作为 DAO parent.
-
节点 SHOULD 使用计时器 (DelayDAO) 延迟发送 DAO 消息. 收到 DAO 消息会启动 DelayDAO 计时器. 在 DelayDAO 计时器处于活动状态时收到的 DAO 消息不会重置该计时器. 当 DelayDAO 计时器到期时, 节点发送 DAO.
-
当节点向其 DAO parent set 添加一个节点时, 它 SHOULD 调度 DAO 消息传输.
DelayDAO 的值和计算依赖于实现. 本规范定义了默认值 DEFAULT_DAO_DELAY.
9.6. 触发 DAO 消息 (Triggering DAO Messages)
节点可以触发其 sub-DODAG 发送 DAO 消息. 每个节点维护一个 DAO Trigger Sequence Number (DTSN), 并通过 DIO 消息传达它.
-
如果节点听到其某个 DAO parent 递增了 DTSN, 则该节点 MUST 使用第 9.3 节和第 9.5 节中的规则调度 DAO 消息传输.
-
在 Non-Storing 模式下, 如果节点听到其某个 DAO parent 递增了 DTSN, 则该节点 MUST 递增自己的 DTSN.
在 Storing 运行模式下, 作为常规路由表更新和维护的一部分, storing 节点 MAY 递增 DTSN, 以可靠触发其直接子节点的一组 DAO 更新.
在 Storing 运行模式下, 不需要从整个 sub-DODAG 触发 DAO 更新, 因为该状态信息会逐跳沿 DODAG 向 Up 传播.
在 Non-Storing 运行模式下, DTSN 递增还会使某节点的直接子节点随后递增自己的 DTSN, 从而触发整个 sub-DODAG 的一组 DAO 更新. 通常在 Non-Storing 运行模式下, 只有当需要 DAO 刷新但不希望进行全局修复 (例如递增 DODAGVersionNumber) 时, 根才会独立递增 DTSN. 通常在 Non-Storing 运行模式下, 所有非根节点只会在观察到其父节点递增 DTSN 时才递增自己的 DTSN.
一般而言, 节点可以根据实现特定逻辑触发 DAO 更新, 例如基于检测到 Downward 路由不一致, 或偶尔基于内部计时器.
在 storing 网络中, 为触发的 DAO 选择合适的 DelayDAO 可以显著减少传输的 DAO 数量. 触发沿 DODAG 向 Down 流动; 在最佳情况下, DAO 沿 DODAG 向 Up 流动, 使叶节点首先发送 DAO, 每个节点只发送一次 DAO 消息. 这种调度可以通过将 DelayDAO 设置为与 Rank 成反比来近似. 注意, 该建议旨在作为一种优化以允许高效聚合 (在一般情况下, 正确运行并不需要它).
9.7. Non-Storing 模式 (Non-Storing Mode)
在 Non-Storing 模式下, RPL 使用 IP 源路由将消息向 Downward 路由. 以下规则适用于处于 Non-Storing 模式的节点. Storing 模式有一组单独规则, 在第 9.8 节中描述.
-
Transit Information 选项的 DODAG Parent Address 子字段 MUST 包含一个或多个地址. 所有这些地址 MUST 是发送方 DAO parent 的地址.
-
DAO 沿作为父节点选择一部分安装的默认路由直接发送到根.
-
当节点从其 DAO parent set 中移除某个节点时, 它 MAY 生成一个带有更新 Transit Information 选项的新 DAO 消息.
在 Non-Storing 模式下, 节点使用 DAO 向 DODAG 根报告其 DAO parent. DODAG 根可以利用路由中每个节点的 DAO parent set 拼接出到某节点的 Downward 路由. Path Sequence 信息可用于检测陈旧 DAO 信息. 这种逐跳路由计算的目的是在 DAO parent 变化时尽量减少流量. 如果节点报告完整源路由, 那么在 DAO parent 变化时, 整个 sub-DODAG 都必须向 DODAG 根发送新的 DAO. 因此, 在 Non-Storing 模式下, 节点可以发送单个 DAO, 尽管它可能选择向多个 DAO parent 中的每一个发送不止一个 DAO 消息.
节点通过发送包含多个 RPL Target 选项的单个 DAO 消息来打包 DAO. 每个 RPL Target 选项都有其自身紧随其后的 Transit Information 选项.
9.8. Storing 模式 (Storing Mode)
在 Storing 模式下, RPL 按 IPv6 目的地址将消息向 Downward 路由. 以下规则适用于处于 Storing 模式的节点:
-
Transit Information 选项的 DODAG Parent Address 子字段 MUST 为空.
-
收到单播 DAO 后, 节点 MUST 计算该 DAO 是否会改变节点自身通告的前缀集合. 该计算 SHOULD 包括查阅与 DAO 关联的 Transit Information 选项中的 Path Sequence 信息, 以确定该 DAO 消息是否包含取代节点已存储信息的新信息. 如果是, 则节点 MUST 按第 9.5 节中的规则生成并传输新的 DAO 消息. 此类变化包括收到 No-Path DAO.
-
当节点生成新的 DAO 时, 它 SHOULD 将其单播到自己的每个 DAO parent. 它 MUST NOT 将 DAO 消息单播到非 DAO parent 的节点.
-
当节点从其 DAO parent set 中移除某个节点时, 它 SHOULD 向被移除的 DAO parent 发送 No-Path DAO 消息 (第 6.4.3 节), 以使现有路由失效.
-
如果发往已通告 Downward 地址的消息遭遇转发错误, 邻居不可达检测 (Neighbor Unreachable Detection, NUD) 或类似故障, 则节点 MAY 将该地址标记为不可达并生成适当的 No-Path DAO.
DAO 通告节点具有到哪些目的地址和前缀的路由. 与 Non-Storing 模式不同, 这些 DAO 不传达关于路由本身的信息: 该信息存储在网络内, 并由 IPv6 源地址隐式表示. 当 storing 节点生成 DAO 时, 它使用已收到 DAO 的存储状态来生成一组 RPL Target 选项及其关联的 Transit Information 选项.
因为该信息存储在每个节点的路由表中, 所以在 Storing 模式下, DAO 会直接传达给存储该信息的 DAO parent.
9.9. Path Control
来自节点的 DAO 消息包含一个或多个 Target 选项. 每个 Target 选项指定节点通告的前缀, LLN 外部可达地址的前缀, 节点 sub-DODAG 中目的地的地址, 或该 sub-DODAG 中某节点正在监听的组播组. Transit Information 选项的 Path Control 字段允许节点请求或允许多条 Downward 路由. 节点按如下方式构造 Transit Information 选项的 Path Control 字段:
-
Path Control 字段的位宽 MUST 等于值 (PCS + 1), 其中 PCS 在 DODAG Configuration 选项的控制字段中指定. 大于或等于值 (PCS + 1) 的位在发送时 MUST 被清零, 接收时 MUST 被忽略. 小于该值的位被视为 "active" 位.
-
节点在填充 Path Control 字段时 MUST 逻辑构造其 DAO parent 分组, 其中每个分组由偏好相同的 DAO parent 组成. 随后这些分组 MUST 按偏好排序, 从而允许将 DAO parent 逻辑映射到 Path Control 子字段 (见图 27). 分组 MAY 重复, 以扩展覆盖 Path Control 字段的整个位宽, 但 MUST 保留顺序, 包括重复分组, 以便正确传达偏好.
-
对于描述节点自身地址或 LLN 外部前缀的 RPL Target 选项, Path Control 字段中至少一个 active 位 MUST 被设置. Path Control 字段中 MAY 设置更多 active 位.
-
如果节点收到具有相同 RPL Target 选项的多个 DAO, 它 MUST 对收到的 Path Control 字段执行按位 OR. 该聚合按位 OR 表示该前缀请求的 Downward 路由数量.
-
当节点向其某个 DAO parent 发送 DAO 消息时, 它 MUST 从聚合 Path Control 字段中映射到包含该 DAO parent 的分组的子字段里, 选择一个或多个被设置为 active 的位. 给定位只能向一个父节点呈现为 active. 它传输给父节点的 DAO 消息 MUST 设置这些 active 位, 并清除所有其他 active 位.
-
对于 RPL Target 选项和 DAOSequence 编号, 节点发送给不同 DAO parent 的 DAO MUST 具有互不相交的 active Path Control 位集合. 节点 MUST NOT 在发往两个不同 DAO parent 的 DAO 上设置同一 active 位.
-
Path Control 位 SHOULD 按 DAO parent 到 Path Control 子字段的偏好映射来分配, 使属于特定 Path Control 子字段的 active Path Control 位或位分组分配给映射到该子字段的分组内的 DAO parent.
-
在 Non-Storing 运行模式下, 节点 MAY 透传 DAO, 不对 Path Control 字段执行任何进一步处理.
-
节点 MUST NOT 单播 Path Control 字段中没有设置任何 active 位的 DAO 消息. 对给定 Target 选项而言, 节点可能没有足够的聚合 Path Control 位来向其每个 DAO parent 发送包含该 Target 的 DAO 消息, 在这种情况下, 那些最不受偏好的 DAO Parent 可能不会收到该 Target 的 DAO 消息.
Path Control 字段允许节点限定将为其生成多少条 Downward 路由. 它在 Path Control 字段中设置的位数等于它偏好的最大 Downward 路由数. 每个位最多发送给一个 DAO parent; 位簇可以发送给单个 DAO parent, 由其在自己的 DAO parent 之间分配.
为具有关联 Path Control 字段的 Target 配置 DAO 路由的节点 SHOULD 使用该 Path Control 字段的内容, 以确定该 Target 的多条备选 DAO 路由之间的偏好顺序. Path Control 字段分配源自 DAO parent 的偏好, 该偏好基于该节点对 Downward 方向 "end-to-end" 聚合度量的最佳了解并按照 Objective Function 确定. 在 Non-Storing 模式下, 根可以通过聚合每个收到的 DAO 中的信息来确定 Downward 路由, 其中包括首选 DAO parent 的 Path Control 指示.
9.9.1. Path Control 示例 (Path Control Example)
假设有一个运行在 Storing 模式下的 LLN, 其中包含节点 N, 它有四个父节点 P1, P2, P3 和 P4. 令 N 在其 sub-DODAG 中有三个子节点 C1, C2 和 C3. 令 PCS 为 7, 因而 Path Control 字段中将有 8 个 active 位: 11111111b. 考虑以下示例:
Path Control 字段被拆分为四个子字段, PC1 (11000000b), PC2 (00110000b), PC3 (00001100b) 和 PC4 (00000011b), 使这四个子字段按图 27 表示四个不同偏好级别. 在此示例中, 节点 N 上的实现将 {P1, P2} 分组为彼此偏好相同且整体最受偏好的分组. {P3} 不如 {P1, P2} 受偏好, 但比 {P4} 更受偏好. 随后令节点 N 执行 Path Control 映射如下:
{P1, P2} -> PC1 (11000000b) in the Path Control field
{P3} -> PC2 (00110000b) in the Path Control field
{P4} -> PC3 (00001100b) in the Path Control field
{P4} -> PC4 (00000011b) in the Path Control field
注意, 实现重复了 {P4}, 以完整覆盖 Path Control 字段.
-
令 C1 发送包含 Target T 且 Path Control 为 10000000b 的 DAO. 节点 N 存储一条表项, 将 10000000b 与 C1 和 Target T 的 Path Control 字段关联起来.
-
令 C2 发送包含 Target T 且 Path Control 为 00010000b 的 DAO. 节点 N 存储一条表项, 将 00010000b 与 C1 和 Target T 的 Path Control 字段关联起来.
-
令 C3 发送包含 Target T 且 Path Control 为 00001100b 的 DAO. 节点 N 存储一条表项, 将 00001100b 与 C1 和 Target T 的 Path Control 字段关联起来.
-
在稍后某个时间, 节点 N 为 Target T 生成 DAO. 节点 N 会通过对已经为 Target T 给出 DAO 的每个子节点的贡献执行 OR, 构造聚合 Path Control 字段. 因此, 聚合 Path Control 字段设置的 active 位为: 10011100b.
-
随后节点 N 在其父节点 P1, P2, P3 和 P4 之间分配聚合 Path Control 位, 以准备 DAO 消息.
-
P1 和 P2 有资格从最受偏好的子字段 (11000000b) 接收 active 位. 这些位在聚合 Path Control 字段中为 10000000b. 节点 N 必须只将该位设置给两个父节点之一. 在这种情况下, 节点 P1 被分配该位, 并在其 DAO 中获得 Path Control 字段 10000000b. 没有剩余位可分配给节点 P2; 因此, 节点 P2 将具有 00000000b 的 Path Control 字段, 且由于没有 active 位, 无法为节点 P2 生成 DAO.
-
第二受偏好的子字段 (00110000b) 具有 active 位 00010000b. 节点 N 已将 P3 映射到该子字段. 节点 N 可以将该 active 位分配给 P3, 为 P3 构造一个包含 Target T 且 Path Control 为 00010000b 的 DAO.
-
第三受偏好的子字段 (00001100b) 具有 active 位 00001100b. 节点 N 已将 P4 映射到该子字段. 节点 N 可以将这两个位都分配给 P4, 为 P4 构造一个包含 Target T 且 Path Control 为 00001100b 的 DAO.
-
最不受偏好的子字段 (00000011b) 没有 active 位. 如果其中有 active 位, 这些位将被添加到为 P4 构造的 DAO 的 Path Control 字段中.
-
将其他 target (T 以外的 target) 填充到发往 P1, P2, P3, P4 的 DAO 消息中的过程, 按为这些 target 收集的聚合 Path Control 字段进行.
9.10. 组播目的地通告消息 (Multicast Destination Advertisement Messages)
DAO 操作的一种特殊情况是组播 DAO 操作, 它不同于单播 DAO 操作, 可用于填充 '1-hop' 路由表项.
-
节点 MAY 将 DAO 消息组播到链路本地作用域 all-RPL-nodes 组播地址.
-
组播 DAO 消息 MUST 仅用于通告关于节点自身的信息, 即直接连接到该节点或由该节点拥有的前缀, 例如该节点订阅的组播组或该节点拥有的全局地址.
-
组播 DAO 消息 MUST NOT 用于中继从另一个节点学习到的连通性信息 (例如通过单播 DAO 学到的信息).
-
节点 MUST NOT 对收到的组播 DAO 消息执行任何其他 DAO 相关处理; 特别是, 节点 MUST NOT 在收到组播 DAO 时执行 DAO parent 的动作.
- 组播 DAO 可用于启用直接 P2P 通信, 不需要 DODAG 中继分组.