跳到主要内容

5. 新的 RPL 控制消息和选项 (New RPL Control Messages and Options)

5.1. 新的 P-DAO Request 控制消息 (New P-DAO Request Control Message)

P-DAO-REQ 消息由主 DODAG 中的节点发送给 Root. 它是建立或刷新 Track 的请求, 其中发送 P-DAO-REQ 的节点是 Track 入口, 并且它会表示是否请求名为 PDR-ACK 的确认. 正向 PDR-ACK 表示 Track 已构建, 且 Root 承诺在协商的生命周期内维护该 Track.

主 Root 可以 (MAY) 向 Track 入口指示 Track 已提前终止. 为此, 它必须使用带负状态的异步 PDR-ACK. "Transient Failure" 状态 (见第 11.10 节) 表示可以在合理时间后重试 P-DAO-REQ, 该时间取决于部署. 其他负状态值表示永久错误. 在应用层或通过网络管理采取纠正动作之前, 必须放弃该尝试.

所请求 Track 的 Track 入口由 P-DAO-REQ 的源 IPv6 地址指示, TrackID 在消息本身中指示. 消息中必须至少存在一个 RPL Target Option. 如果存在多个 RPL Target Option, Root 将提供一个到达第一个列出 Target 以及其他 Targets 子集的 Track. 子集选择细节不在范围内. RTO 表示 Track 出口 (更多内容见第 6.2 节).

P-DAO-REQ 的 RPL Control Code 是 0x09. P-DAO-REQ Base Object 的格式如下:

  0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TrackID |K|R| Flags | ReqLifetime | PDRSequence |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option(s)...
+-+-+-+-+-+-+-+-+

Figure 13: New P-DAO Request Format

TrackID: 8-bit 字段. 在本规范语境中, TrackID 字段表示由 Track 形成的 DODAG 的 RPLInstanceID. 见第 3.4 节和第 6.3 节. 要分配新的 Track, 入口 Node 必须提供一个当前未使用的值.

K: K 标志设置后表示期望接收方发回 PDR-ACK.

R: R 标志设置后表示请求用于冗余的 Complex Track.

Flags: 保留. 发送方必须将 Flags 字段初始化为零, 接收方必须忽略该字段.

ReqLifetime: 8-bit 无符号整数. 以 Lifetime Units 表示的请求 Track 生命周期, 该单位从 DODAG Configuration option 获取. 值 255 (0xFF) 表示无限期 (永不超时).

具有更新鲜 PDRSequence 的 P-DAO-REQ 会刷新生命周期, 而 ReqLifetime 为 0 表示必须销毁该 Track, 例如请求该 Track 的应用终止时.

PDRSequence: 8-bit 回绕序列号, 遵循 [RPL] 第 7.2 节中的操作. PDRSequence 用于将 PDR-ACK 消息与触发它的 P-DAO-REQ 消息相关联. 它在每个 P-DAO-REQ 消息中递增, 并由 Root 在 PDR-ACK 中回显.

5.2. 新的 PDR-ACK 控制消息 (New PDR-ACK Control Message)

新的 PDR-ACK 作为对设置了 K 标志的 P-DAO-REQ 消息的响应发送. PDR-ACK 的 RPL Control Code 是 0x0A. 其格式如下:

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TrackID | Flags | Track Lifetime| PDRSequence |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PDR-ACK Status| Reserved |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option(s)...
+-+-+-+-+-+-+

Figure 14: New PDR-ACK Control Message Format

TrackID: 设置为该响应所对应 P-DAO-REQ 消息的 TrackID 字段中指示的 TrackID.

Flags: 保留. 发送方必须将 Flags 字段初始化为零, 接收方必须忽略该字段.

Track Lifetime: 指示 Track 的剩余生命周期, 以 Lifetime Units 表示. 值 255 (0xFF) 表示无限期. 值零 (0x00) 表示 Track 已销毁或未创建.

PDRSequence: 8-bit 回绕序列号. 它在每个 P-DAO-REQ 消息中递增, 并在 PDR-ACK 中回显.

PDR-ACK Status: 指示完成情况的 8-bit 字段. PDR-ACK Status 按图 15 所示进行子结构化:

     0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|E|R| Value |
+-+-+-+-+-+-+-+-+

Figure 15: PDR-ACK Status Format

E: 1-bit 标志. 设置后表示拒绝. 未设置时, Value 字段设置为 0 表示 Success/Unqualified Acceptance, 其他值表示 "not an outright rejection".

R: 1-bit 标志. 保留. 发送方必须将其设置为 0, 接收方必须忽略它.

Status Value: 6-bit 无符号整数. 取值取决于 E 标志的设置. 见表 28 和表 29.

Reserved: 发送方必须将 Reserved 字段初始化为零, 接收方必须忽略该字段.

5.3. Via Information Options

VIO 表示 IPv6 Via Addresses 的有序列表, 该列表构成 Track 的保护路径 (使用 Non-Storing Mode) 或段 (使用 Storing Mode) 的跳. Storing Mode P-DAO 包含一个 SM-VIO, 而 Non-Storing Mode P-DAO 包含一个 NSM-VIO.

VIO 的有效持续时间在 Segment Lifetime 字段中指示. 包含 Segment Lifetime 为 0 的 VIO 的 P-DAO 消息称为 No-Path P-DAO.

VIO 包含一个或多个 SRH-6LoRH 头部, 每个头部由一个 SRH-6LoRH head 和一组压缩 Via Addresses 组成. 但在 Non-Storing Mode No-Path P-DAO 的情况下, 不存在 SRH-6LoRH 头部.

对于 SM-VIO, 或者如果数据包中未使用 [RFC8138], 为简单起见, Root 在每个 Via Information Option 中必须只使用一个 SRH-6LoRH, 并且所有地址采用相同压缩方式, 如图 16 所示.

对于 NSM-VIO, 如果主 DODAG 中使用 [RFC8138], 并且使用不同的 SRH-6LoRH Types 会使 VIO 整体更短, Root 应当 (SHOULD) 优化 NSM-VIO 的大小. 这意味着可能存在多个 SRH-6LoRH.

VIO 的格式如下:

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option Type | Option Length | Flags | P-RouteID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Seg. Sequence | Seg. Lifetime | SRH-6LoRH head |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Via Address 1 (compressed by RFC 8138) .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .... .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Via Address n (compressed by RFC 8138) .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Additional SRH-6LoRH header(s) .
| |
. .... .

Figure 16: VIO Format

Option Type: SM-VIO 为 0x0F, NSM-VIO 为 0x10 (见表 26).

Option Length: 8-bit 无符号整数, 表示该 option 的八位字节长度, 不包括 Option Type 和 Length 字段 (见 [RPL] 第 6.7.1 节). Option Length 是可变的, 取决于 Via Addresses 的数量和所应用的压缩.

Flags: 8-bit 字段. 本规范未定义任何标志. 发送方必须将该字段设置为 0, 接收方必须忽略该字段.

P-RouteID: 8-bit 字段, 标识由 TrackID 字段指示的 Track 或主 DODAG 的一个组件. 值 0 用于表示一条 path, 即由单个 segment/protection path 构成. 在 SM-VIO 中, P-RouteID 表示 SegmentID. 在 NSM-VIO 中, 它表示被添加 (或更新) 到 Track 整体拓扑中的保护路径 ID.

Segment Sequence: 8-bit 无符号整数. Segment Sequence 遵循 [RPL] 第 7.2 节中的操作, 初始值为 255.

当 DODAG 的 Root 需要刷新或更新 Track 中的某个 segment 时, 它会为该 segment 单独递增 Segment Sequence.

VIO 中指示的 segment 信息会废弃所指示 Track 内由 P-RouteID 标识的 segment 的任何状态, 并提供该 segment 的新信息.

带有不如当前序列新鲜的 Segment Sequence 的 VIO 会被忽略.

对于给定 DODAGID, 具有相同 (TrackID, P-RouteID, Segment Sequence) 的 VIO 表示重试. 它禁止改变 segment, 并且必须像第一份副本一样被传播或应答.

Segment Lifetime: 8-bit 无符号整数. 以 Lifetime Units 表示该 segment 可用的时长, 该单位从 Configuration option 获取.

该周期从看到新的 Segment Sequence 时开始. 值 255 (0xFF) 表示无限期. 值零 (0x00) 表示可达性丢失.

SRH-6LoRH head: 第一个 SRH-6LoRH 的前 2 bytes, 如 [RFC8138] 图 6 所示. 例如, type 4 的 6LoRH 表示 Via Addresses 以完整形式提供, 不进行压缩.

Via Address: segment 沿途节点的 IPv6 ULA 或 GUA. VIO 包含一个或多个 IPv6 Via Addresses, 按数据路径从入口到出口的顺序列出. 该列表以压缩形式表达, 压缩方式由前面的 SRH-6LoRH 头部指示.

在更新或删除已存在 segment 的某一部分的 Storing Mode P-DAO 中, SM-VIO 中的列表可以只表示正在更新的 segment 部分. 在极端情况下, SM-VIO 只更新一个节点, 此时它只包含一个 IPv6 地址. 在所有其他情况下, VIO 中的列表必须是完整的.

对于 SM-VIO, 该列表表示通过直接邻居的顺序 (严格) 路径. 完整列表从入口开始并在出口结束, VIO 中列出的节点 (包括出口) 可以 (MAY) 被视为隐式 Targets.

对于 NSM-VIO, 完整列表可以是松散的并排除入口节点, 从第一个松散跳开始并在 Track 出口结束. Track 出口必须被视为隐式 Target, 因此禁止在 RPL Target Option 中表示它.

5.4. Sibling Information Option

Sibling Information Option (SIO) 提供关于 siblings 的信息, Root 可使用这些信息形成 P-Routes. 在 Non-Storing Mode 中, 可以在发送给 Root 的 DAO 消息中放置一个或多个 SIO.

要通告邻居节点, 路由器必须按照 [RFC8505] 从该 sibling 获得一个活动 Address Registration, 该注册对应一个作为节点标识符的地址 (ULA 或 GUA). 如果该路由器也向该 sibling 注册一个地址, 且链路在两个方向上具有相似属性, 则只有其注册地址中 Interface ID 最低的路由器需要报告 SIO, 并设置 B 标志, Root 将假定对称性.

SIO 携带一个标志 (B), 当预期两个方向具有相似性能时设置. 该标志向路由表示, 针对一个方向提供的信息对两个方向都有效. 如果 SIO 实际上从双方都收到, 则必须忽略 B 标志. 描述性能标准以及如何断言这些标准的策略不在范围内. 在没有外部协议断言链路质量的情况下, 不应当 (SHOULD NOT) 设置该标志.

SIO 的格式如下:

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option Type | Option Length |S|B|Flags|Comp.| Opaque |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Step in Rank | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
. .
. Sibling DODAGID (if the D flag is not set) .
. .
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
. .
. Sibling Address .
. .
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 17: Sibling Information Option Format

Option Type: SIO 为 0x11 (见表 26).

Option Length: 8-bit 无符号整数, 表示该 option 的八位字节长度, 不包括 Option Type 和 Length 字段 (见 [RPL] 第 6.7.1 节).

Reserved for Flags: 发送方必须将其设置为 0, 接收方必须忽略它.

B: 1-bit 标志, 设置后表示到 sibling 的连接是双向且大致对称的. 在这种情况下, 只有一个 sibling 需要为该跳报告 SIO. 如果未设置 B, 则 SIO 只表示从 sibling 到该节点的连接性, 不提供从该节点到 sibling 的跳的信息.

S: 1-bit 标志, 设置后表示 sibling 属于同一 DODAG. 未设置时, 会指示 Sibling DODAGID.

Flags: 保留. 发送方必须将 Flags 字段初始化为零, 接收方必须忽略该字段.

Comp.: Compression Type, 一个 3-bit 无符号整数. 这是 [RFC8138] 第 5.1 节图 7 中定义的 SRH-6LoRH Type, 对应于用于 Sibling Address 及其 DODAGID (如果存在) 的压缩. 压缩参考是主 DODAG 的 Root.

Opaque: 可以 (MAY) 用于携带节点和 Root 都理解的信息, 例如链路属性的特定表示, 如来自 sibling 的数据包的专有 Link Quality Information. 在某些场景中, 例如使用 RPL 处理特定用途/环境的 Industrial Alliances, 可以 (MAY) 重新定义该字段以适应该场景的需求.

Step in Rank: 16-bit 无符号整数. 这是 Objective Function 在该节点与 sibling 之间计算的 Step in Rank [RPL], 它反映如果 sibling 是 preferred parent, Objective Function 将计算出的抽象 Rank 增量.

Reserved: 发送方必须将 Reserved 字段初始化为零, 接收方必须忽略该字段.

Sibling DODAGID: 2 到 16 bytes. sibling 的 DODAGID, 采用 Compression Type 字段指示的压缩形式 [RFC8138]. 当且仅当 D 标志未设置时, 该字段存在.

Sibling Address: 2 到 16 bytes. sibling 的 IPv6 地址, 其作用域必须使其可从 Root 到达, 例如不能是 Link Local Address. IPv6 地址采用 Compression Type 字段指示的压缩形式 [RFC8138] 编码.

SIO 后面可以 (MAY) 紧跟 DAG Metric Container. 在这种情况下, DAG Metric Container 为从 Sibling 到该节点的跳提供额外指标.