6. ICMPv6 RPL 控制消息 (ICMPv6 RPL Control Message)
本文档定义 RPL 控制消息, 这是一种新的 ICMPv6 [RFC4443] 消息. RPL 控制消息由 code 标识, 并由取决于 code 的基本部分 (以及一系列选项) 组成.
大多数 RPL 控制消息的作用域是单条链路. 唯一的例外是 Non-Storing 模式下的 DAO / DAO-ACK 消息, 它们使用单播地址跨多跳交换, 因此源地址和目的地址都使用全局地址或唯一本地地址. 对于所有其他 RPL 控制消息, 源地址是链路本地地址, 目的地址则是 all-RPL-nodes 组播地址或目的地的链路本地单播地址. all-RPL-nodes 组播地址是一个新地址, 值为 ff02::1a.
按照 [RFC4443], RPL Control Message 由 ICMPv6 头部和其后的消息体组成. 消息体由消息基本部分以及可能存在的若干选项组成, 如图 6 所示.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Base .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Option(s) .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 6: RPL 控制消息
RPL 控制消息是 Type 为 155 的 ICMPv6 信息消息.
Code 字段标识 RPL 控制消息的类型. 本文档为以下 RPL 控制消息类型定义 code (见第 20.2 节):
- 0x00: DODAG 信息请求 (DODAG Information Solicitation, 第 6.2 节)
- 0x01: DODAG 信息对象 (DODAG Information Object, 第 6.3 节)
- 0x02: 目的地通告对象 (Destination Advertisement Object, 第 6.4 节)
- 0x03: 目的地通告对象确认 (Destination Advertisement Object Acknowledgment, 第 6.5 节)
- 0x80: 安全 DODAG 信息请求 (Secure DODAG Information Solicitation, 第 6.2.2 节)
- 0x81: 安全 DODAG 信息对象 (Secure DODAG Information Object, 第 6.3.2 节)
- 0x82: 安全目的地通告对象 (Secure Destination Advertisement Object, 第 6.4.2 节)
- 0x83: 安全目的地通告对象确认 (Secure Destination Advertisement Object Acknowledgment, 第 6.5.2 节)
- 0x8A: 一致性检查 (Consistency Check, 第 6.6 节)
如果节点收到 Code 字段未知的 RPL 控制消息, 该节点 MUST 丢弃该消息且不做任何进一步处理, MAY 产生管理告警, 并且 MUST NOT 发送任何响应消息.
校验和按 [RFC4443] 中的规定计算. 对于下文规定的 RPL 安全操作, 它先被设置为零, 并在 RPL 消息其余内容 (包括安全字段) 全部设置完成后再计算.
code 的最高位 (0x80) 表示 RPL 消息是否启用安全. 安全 RPL 消息具有支持机密性和完整性的格式, 如图 7 所示.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Security .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Base .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Option(s) .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 7: 安全 RPL 控制消息
本节余下部分先描述当前定义的 RPL 控制消息 Base 格式, 随后描述当前定义的 RPL Control Message 选项.
6.1. RPL 安全字段 (RPL Security Fields)
每个 RPL 消息都有一个安全变体. 安全变体提供完整性和重放保护, 以及可选的机密性和延迟保护. 由于安全机制覆盖基本消息和选项, 在安全消息中, 安全信息位于校验和与基本部分之间, 如图 7 所示.
使用的安全级别和算法在协议消息中按如下方式指示:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|T| Reserved | Algorithm |KIM|Resvd| LVL | Flags |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Counter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Key Identifier .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 8: 安全部分
消息认证码 (Message Authentication Codes, MACs) 和签名对整个未安全保护的 ICMPv6 RPL 控制消息提供认证, 认证范围包括所有字段已定义的 Security 部分, 但 ICMPv6 校验和会临时设置为零. 加密为安全 RPL ICMPv6 消息提供机密性, 范围从 Security 部分之后的第一个字节开始, 一直到分组的最后一个字节. 安全变换会生成一个安全 ICMPv6 RPL 消息, 其中包含密码学字段 (MAC, 签名等). 换言之, 安全变换本身, 例如正在使用的签名和/或算法, 将详细说明如何把密码学字段并入安全分组. Security 部分本身不显式携带这些密码学字段. Security 部分的使用在第 19 节和第 10 节中进一步详细说明.
- Counter is Time (T): 如果计数器的 Time 标志被设置, 则 Counter 字段是时间戳. 如果该标志被清零, 则计数器是递增计数器. 第 10.5 节描述 'T' 标志和 Counter 字段的细节.
- Reserved: 7 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Security Algorithm (Algorithm): Security Algorithm 字段指定网络使用的加密, MAC 和签名方案. 该字段支持的值如下:
| Algorithm | 加密/MAC | 签名 |
|---|---|---|
| 0 | CCM with AES-128 | RSA with SHA-256 |
| 1-255 | 未分配 | 未分配 |
图 9: Security Algorithm (Algorithm) 编码
第 10.9 节更详细地描述这些算法.
- Key Identifier Mode (KIM): Key Identifier Mode 是一个 2 位字段, 指示用于分组保护的密钥是隐式确定还是显式确定, 并指示 Key Identifier 字段的具体表示形式. Key Identifier Mode 设置为下表中的值之一:
| Mode | KIM | 含义 | Key Identifier 长度 (octets) |
|---|---|---|---|
| 0 | 00 | 使用组密钥. 密钥由 Key Index 字段确定. Key Source 不存在. Key Index 存在. | 1 |
| 1 | 01 | 使用成对密钥. 密钥由分组的源和目的地确定. Key Source 不存在. Key Index 不存在. | 0 |
| 2 | 10 | 使用组密钥. 密钥由 Key Index 和 Key Source Identifier 确定. Key Source 存在. Key Index 存在. | 9 |
| 3 | 11 | 使用节点的签名密钥. 如果分组被加密, 则使用组密钥, Key Index 和 Key Source 指定密钥. Key Source 可以存在. Key Index 可以存在. | 0/9 |
图 10: Key Identifier Mode (KIM) 编码
在模式 3 (KIM=11) 中, Key Source 和 Key Identifier 是否存在取决于下文描述的安全级别 (Security Level, LVL). 如果 Security Level 指示存在加密, 则这些字段存在. 如果它指示没有加密, 则这些字段不存在.
-
Resvd: 3 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
Security Level (LVL): Security Level 是一个 3 位字段, 指示所提供的分组保护. 该值可以按每个分组进行调整, 并允许不同级别的数据真实性, 以及可选的数据机密性. KIM 字段指示是否使用签名以及 Level 字段的含义. 注意, Security Level 的已分配值不一定有序, 更高的 LVL 值不一定等同于更高安全性. Security Level 设置为下表中的值之一:
KIM=0,1,2
| LVL | 属性 | MAC 长度 |
|---|---|---|
| 0 | MAC-32 | 4 |
| 1 | ENC-MAC-32 | 4 |
| 2 | MAC-64 | 8 |
| 3 | ENC-MAC-64 | 8 |
| 4-7 | 未分配 | N/A |
KIM=3
| LVL | 属性 | 签名长度 |
|---|---|---|
| 0 | Sign-3072 | 384 |
| 1 | ENC-Sign-3072 | 384 |
| 2 | Sign-2048 | 256 |
| 3 | ENC-Sign-2048 | 256 |
| 4-7 | 未分配 | N/A |
图 11: Security Level (LVL) 编码
MAC 属性指示该消息具有指定长度的 MAC. ENC 属性指示该消息已加密. Sign 属性指示该消息具有指定长度的签名.
-
Flags: 8 位未使用字段, 保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
Counter: Counter 字段指示一个不重复的 4 octet 值, 该值用于构造实现分组保护并允许提供语义安全的密码学机制. 见第 10.9.1 节.
-
Key Identifier: Key Identifier 字段指示使用哪个密钥保护该分组. 该字段提供不同粒度级别的分组保护, 包括点对点密钥, 组密钥和签名密钥. 该字段按 Key Identifier Mode 字段指示的方式表示, 格式如下:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Key Source .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Key Index .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 12: Key Identifier
-
Key Source: Key Source 字段存在时, 指示组密钥发起者的逻辑标识符. 当存在时, 该字段长度为 8 字节.
-
Key Index: Key Index 字段存在时, 允许唯一标识具有相同发起者的不同密钥. 每个密钥发起者负责确保其发布并正在使用的密钥具有不同的密钥索引, 且所有密钥索引的值均不等于 0x00. 值 0x00 保留给预安装的共享密钥. 当存在时, 该字段长度为 1 字节.
-
Security 部分的 未分配位 为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.2. DODAG 信息请求 (DODAG Information Solicitation, DIS)
DODAG 信息请求 (DODAG Information Solicitation, DIS) 消息可用于向 RPL 节点请求 DODAG 信息对象 (DODAG Information Object). 它的用法类似于 IPv6 邻居发现中规定的路由器请求 (Router Solicitation). 节点可以使用 DIS 探测其邻域内附近的 DODAG. 第 8.3 节描述节点如何响应 DIS.
6.2.1. DIS 基本对象格式 (Format of the DIS Base Object)
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flags | Reserved | Option(s)...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 13: DIS 基本对象
- Flags: 8 位未使用字段, 保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Reserved: 8 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- DIS Base 的 未分配位 为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.2.2. 安全 DIS (Secure DIS)
安全 DIS 消息遵循图 7 中的格式, 其中基本格式是图 13 所示的 DIS 消息.
6.2.3. DIS 选项 (DIS Options)
DIS 消息 MAY 携带有效选项.
本规范允许 DIS 消息携带以下选项:
- 0x00 Pad1
- 0x01 PadN
- 0x07 Solicited Information
6.3. DODAG 信息对象 (DODAG Information Object, DIO)
DODAG 信息对象 (DODAG Information Object, DIO) 携带允许节点发现 RPL 实例, 学习其配置参数, 选择 DODAG 父节点集合, 并维护 DODAG 的信息.
6.3.1. DIO 基本对象格式 (Format of the DIO 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RPLInstanceID |Version Number | Rank |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|G|0| MOP | Prf | DTSN | Flags | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ DODAGID +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option(s)...
+-+-+-+-+-+-+-+-+
图 14: DIO 基本对象
-
Grounded (G): Grounded 'G' 标志指示所通告的 DODAG 是否能够满足应用定义的目标. 如果该标志被设置, 则 DODAG 为 grounded. 如果该标志被清零, 则 DODAG 为 floating.
-
Mode of Operation (MOP): Mode of Operation (MOP) 字段标识 RPL 实例的运行模式, 该模式由 DODAG 根以管理方式配置并分发. 所有加入 DODAG 的节点必须能够遵守 MOP, 才能作为路由器完整参与. 否则, 它们只能作为叶节点加入. MOP 按下图编码:
| MOP | 描述 |
|---|---|
| 0 | RPL 不维护 Downward 路由 |
| 1 | Non-Storing 运行模式 |
| 2 | 无组播支持的 Storing 运行模式 |
| 3 | 支持组播的 Storing 运行模式 |
| 所有其他值均未分配 |
值 0 表示目的地通告消息被禁用, 且 DODAG 仅维护 Upward 路由.
图 15: Mode of Operation (MOP) 编码
-
DODAGPreference (Prf): 一个 3 位无符号整数, 定义该 DODAG 的根相对于同一实例内其他 DODAG 根的优先程度. DAGPreference 范围从 0x00 (最低优先级) 到 0x07 (最高优先级). 默认值为 0 (最低优先级). 第 8.2 节描述 DAGPreference 如何影响 DIO 处理.
-
Version Number: 8 位无符号整数, 由 DODAG 根设置为 DODAGVersionNumber. 第 8.2 节描述 DODAGVersionNumber 的规则以及它们如何影响 DIO 处理.
-
Rank: 16 位无符号整数, 指示发送 DIO 消息的节点的 DODAG Rank. 第 8.2 节描述如何设置 Rank 以及它如何影响 DIO 处理.
-
RPLInstanceID: 8 位字段, 由 DODAG 根设置, 指示该 DODAG 属于哪个 RPL 实例.
-
Destination Advertisement Trigger Sequence Number (DTSN): 8 位无符号整数, 由发出 DIO 消息的节点设置. 目的地通告触发序列号 (Destination Advertisement Trigger Sequence Number, DTSN) 标志作为维护 Downward 路由过程的一部分使用. 该过程的细节见第 9 节.
-
Flags: 8 位未使用字段, 保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
Reserved: 8 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
DODAGID: 128 位 IPv6 地址, 由 DODAG 根设置, 用于唯一标识 DODAG. DODAGID MUST 是属于该 DODAG 根的可路由 IPv6 地址.
-
DIO Base 的 未分配位 为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.3.2. 安全 DIO (Secure DIO)
安全 DIO 消息遵循图 7 中的格式, 其中基本格式是图 14 所示的 DIO 消息.
6.3.3. DIO 选项 (DIO Options)
DIO 消息 MAY 携带有效选项.
本规范允许 DIO 消息携带以下选项:
- 0x00 Pad1
- 0x01 PadN
- 0x02 DAG Metric Container
- 0x03 Routing Information
- 0x04 DODAG Configuration
- 0x08 Prefix Information
6.4. 目的地通告对象 (Destination Advertisement Object, DAO)
目的地通告对象 (Destination Advertisement Object, DAO) 用于沿 DODAG 向 Upward 传播目的地信息. 在 Storing 模式下, DAO 消息由子节点单播到所选父节点. 在 Non-Storing 模式下, DAO 消息被单播到 DODAG 根. 在显式请求或发生错误时, DAO 消息的目的地可以选择通过向 DAO 发送方返回目的地通告确认 (Destination Advertisement Acknowledgement, DAO-ACK) 消息来确认该 DAO 消息.
6.4.1. DAO 基本对象格式 (Format of the DAO 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RPLInstanceID |K|D| Flags | Reserved | DAOSequence |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ DODAGID* +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option(s)...
+-+-+-+-+-+-+-+-+
'*' 表示 DODAGID 并不总是存在, 如下文所述.
图 16: DAO 基本对象
-
RPLInstanceID: 8 位字段, 指示从 DIO 获知的与 DODAG 关联的拓扑实例.
-
K: 'K' 标志指示预期接收方返回 DAO-ACK. 见第 9.3 节.
-
D: 'D' 标志指示 DODAGID 字段存在. 使用本地 RPLInstanceID 时, 该标志 MUST 被设置.
-
Flags: Flags 字段中剩余的 6 个未使用位保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
Reserved: 8 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
DAOSequence: 节点发出的每个唯一 DAO 消息都会递增该字段, 并在 DAO-ACK 消息中回显.
-
DODAGID (optional): 128 位无符号整数, 由 DODAG 根设置, 用于唯一标识 DODAG. 仅当 'D' 标志被设置时, 该字段才存在. 通常只有在使用本地 RPLInstanceID 时才存在该字段, 以标识与 RPLInstanceID 关联的 DODAGID. 使用全局 RPLInstanceID 时, 该字段无需存在.
-
DAO Base 的 未分配位 为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.4.2. 安全 DAO (Secure DAO)
安全 DAO 消息遵循图 7 中的格式, 其中基本格式是图 16 所示的 DAO 消息.
6.4.3. DAO 选项 (DAO Options)
DAO 消息 MAY 携带有效选项.
本规范允许 DAO 消息携带以下选项:
- 0x00 Pad1
- 0x01 PadN
- 0x05 RPL Target
- 0x06 Transit Information
- 0x09 RPL Target Descriptor
DAO 消息的一种特殊情况称为 No-Path, 在 Storing 模式下用于清除通过 DAO 操作配置的 Downward 路由状态. No-Path 携带 Target 选项以及关联的 Transit Information 选项, 生命周期为 0x00000000, 用于指示到该 Target 的可达性丢失.
6.5. 目的地通告对象确认 (Destination Advertisement Object Acknowledgement, DAO-ACK)
DAO-ACK 消息由 DAO 接收方 (DAO 父节点或 DODAG 根) 作为单播分组发送, 用于响应单播 DAO 消息.
6.5.1. DAO-ACK 基本对象格式 (Format of the DAO-ACK 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RPLInstanceID |D| Reserved | DAOSequence | Status |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ DODAGID* +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option(s)...
+-+-+-+-+-+-+-+-+
'*' 表示 DODAGID 并不总是存在, 如下文所述.
图 17: DAO ACK 基本对象
-
RPLInstanceID: 8 位字段, 指示从 DIO 获知的与 DODAG 关联的拓扑实例.
-
D: 'D' 标志指示 DODAGID 字段存在. 通常只有在使用本地 RPLInstanceID 时才设置该标志.
-
Reserved: 7 位字段, 保留供标志使用.
-
DAOSequence: 节点发出的每个 DAO 消息都会递增该字段, 并由接收方在 DAO-ACK 中回显. DAOSequence 用于关联 DAO 消息和 DAO ACK 消息, 不应与 Transit Information 选项中的 Path Sequence 混淆, 后者与 DODAG 下方的给定 Target 相关联.
-
Status: 指示完成情况. 本规范将状态 0 定义为无条件接受. 其余状态值保留为拒绝代码. 本规范未定义拒绝状态代码, 但未来规范中的状态代码 SHOULD 按以下指南分配:
- 0: 无条件接受, 即接收 DAO-ACK 的节点未被拒绝.
- 1-127: 并非直接拒绝. 发送 DAO-ACK 的节点愿意充当父节点, 但建议接收节点改为查找并使用备用父节点.
- 127-255: 拒绝. 发送 DAO-ACK 的节点不愿充当父节点.
-
DODAGID (optional): 128 位无符号整数, 由 DODAG 根设置, 用于唯一标识 DODAG. 仅当 'D' 标志被设置时, 该字段才存在. 通常只有在使用本地 RPLInstanceID 时才存在该字段, 以标识与 RPLInstanceID 关联的 DODAGID. 使用全局 RPLInstanceID 时, 该字段无需存在.
-
DAO-ACK Base 的 未分配位 为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.5.2. 安全 DAO-ACK (Secure DAO-ACK)
安全 DAO-ACK 消息遵循图 7 中的格式, 其中基本格式是图 17 所示的 DAO-ACK 消息.
6.5.3. DAO-ACK 选项 (DAO-ACK Options)
本规范未定义任何由 DAO-ACK 消息携带的选项.
6.6. 一致性检查 (Consistency Check, CC)
CC 消息用于检查安全消息计数器并发出质询-响应 (challenge-response). CC 消息 MUST 作为安全 RPL 消息发送.
6.6.1. CC 基本对象格式 (Format of the CC 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RPLInstanceID |R| Flags | CC Nonce |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ DODAGID +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Counter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option(s)...
+-+-+-+-+-+-+-+-+
图 18: CC 基本对象
-
RPLInstanceID: 8 位字段, 指示从 DIO 获知的与 DODAG 关联的拓扑实例.
-
R: 'R' 标志指示 CC 消息是否为响应. 'R' 标志被清零的消息是请求. 'R' 标志被设置的消息是响应.
-
Flags: Flags 字段中剩余的 7 个未使用位保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
CC Nonce: 16 位无符号整数, 由 CC 请求设置. 对应的 CC 响应包含与请求相同的 CC nonce 值.
-
DODAGID: 128 位字段, 包含 DODAG 根的标识符.
-
Destination Counter: 32 位无符号整数值, 指示发送方对目的地当前安全计数器值的估计. 如果发送方没有估计值, 则 SHOULD 将 Destination Counter 字段设置为零.
-
CC Base 的 未分配位 为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
Destination Counter 值允许新节点或已恢复节点通过 CC 消息交换重新同步. 这很重要, 因为即使设备从导致 Counter 状态丢失的故障中恢复, 也要确保给定安全密钥的 Counter 值不会重复. 例如, 当接收到 CC 请求或其他 RPL 消息, 且该消息的 Security 部分中带有已初始化的计数器时, CC 响应消息中提供的 Incoming Counter 允许请求节点将其 Outgoing Counter 重置为大于响应节点最后接收值的值. Incoming Counter 也会根据收到的 CC 响应进行更新.
6.6.2. CC 选项 (CC Options)
本规范允许 CC 消息携带以下选项:
- 0x00 Pad1
- 0x01 PadN
6.7. RPL 控制消息选项 (RPL Control Message Options)
6.7.1. RPL 控制消息选项通用格式 (RPL Control Message Option Generic Format)
RPL 控制消息选项均遵循以下格式:
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - -
| Option Type | Option Length | Option Data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - -
图 19: RPL 选项通用格式
- Option Type: 8 位选项类型标识符. Option Type 值由 IANA 分配 (见第 20.4 节).
- Option Length: 8 位无符号整数, 表示该选项以八位字节为单位的长度, 不包括 Option Type 和 Length 字段.
- Option Data: 可变长度字段, 包含该选项特有的数据.
处理包含接收方无法识别的 Option Type 值的 RPL 消息时, 接收方 MUST 静默忽略该未识别选项, 并继续处理后续选项, 正确处理消息中剩余的所有选项.
RPL 消息选项可能有对齐要求. 按照 IPv6 中的惯例, 对于有对齐要求的选项, 在数据包中对齐时需要让每个选项的 Option Data 字段内的多八位字节值落在自然边界上 (即宽度为 n 个八位字节的字段放置在距头部起点 n 个八位字节整数倍的位置, 其中 n = 1, 2, 4 或 8).
6.7.2. Pad1
Pad1 选项 MAY 出现在 DIS, DIO, DAO, DAO-ACK 和 CC 消息中, 其格式如下:
0
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
| Type = 0x00 |
+-+-+-+-+-+-+-+-+
图 20: Pad1 选项格式
Pad1 选项用于向消息中插入单个八位字节的填充, 以支持选项对齐. 如果需要超过一个八位字节的填充, 则应使用 PadN 选项, 而不是多个 Pad1 选项.
注意! Pad1 选项格式是一个特殊情况 -- 它既没有 Option Length 字段, 也没有 Option Data 字段.
6.7.3. PadN
PadN 选项 MAY 出现在 DIS, DIO, DAO, DAO-ACK 和 CC 消息中, 其格式如下:
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - -
| Type = 0x01 | Option Length | 0x00 Padding...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - -
图 21: PadN 选项格式
PadN 选项用于向消息中插入两个或更多八位字节的填充, 以支持选项对齐. 接收方 MUST 忽略 PadN 选项数据.
- Option Type: 0x01
- Option Length: 对于 N 个八位字节的填充, 其中 2 <= N <= 7, Option Length 字段包含值 N-2. Option Length 为 0 表示总填充为 2 个八位字节. Option Length 为 5 表示总填充为 7 个八位字节, 这是 PadN 选项允许的最大填充大小.
- Option Data: 对于 N (N > 1) 个八位字节的填充, Option Data 由 N-2 个值为零的八位字节组成.
6.7.4. DAG 度量容器 (DAG Metric Container)
DAG Metric Container 选项 MAY 出现在 DIO 或 DAO 消息中, 其格式如下:
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - -
| Type = 0x02 | Option Length | Metric Data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - -
图 22: DAG Metric Container 选项格式
DAG Metric Container 用于沿 DODAG 报告度量. DAG Metric Container 可以包含实现者按需选择的若干离散节点, 链路和聚合路径度量与约束, 这些度量和约束在 [RFC6551] 中规定.
DAG Metric Container MAY 在同一 RPL 控制消息中出现多次, 例如用于支持 Metric Data 长度超过 256 字节的用例. 更多信息见 [RFC6551].
DAG Metric Container 的处理和传播由实现特定的策略函数控制.
- Option Type: 0x02
- Option Length: Option Length 字段包含 Metric Data 以八位字节为单位的长度.
- Metric Data: DAG Metric Container 数据的顺序, 内容和编码按 [RFC6551] 中的规定.
6.7.5. 路由信息 (Route Information)
路由信息选项 (Route Information Option, RIO) MAY 出现在 DIO 消息中, 它携带的信息与 [RFC4191] 中定义的 IPv6 邻居发现 (Neighbor Discovery, ND) RIO 相同. DODAG 根对设置该信息具有权威性, 并且该信息沿 DODAG 向下传播时保持不变. RPL 路由器可以很容易地将其转换回 ND 选项, 并在自己的路由器通告 (Router Advertisement, RA) 中通告, 因而附接到该 RPL 路由器的节点最终会针对某个数据包的目的地使用根具有最佳偏好的 DODAG. 除了现有的 ND 语义之外, Objective Function 还可以使用该信息来偏向根对某个特定目的地最受偏好的 DODAG. 为了作为 RPL 选项携带, 该选项的格式略作修改 (Type, Length, Prefix), 如下所示:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x03 | Option Length | Prefix Length |Resvd|Prf|Resvd|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Route Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Prefix (Variable Length) .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 23: Route Information Option 格式
RIO 用于指示可以从 DODAG 根到达指定目的地前缀.
如果 RPL 控制消息需要指定到多个目的地的连通性, RIO 可以重复出现.
关于 RIO, 应以 [RFC4191] 作为权威参考. 为方便起见, 此处转录字段说明:
- Option Type: 0x03
- Option Length: 可变, 选项以八位字节为单位的长度, 不包括 Type 和 Length 字段. 注意, 与 IPv6 ND 不同, 此长度以单个八位字节为单位表示.
- Prefix Length: 8 位无符号整数. 前缀中有效前导位的数量. 取值范围为 0 到 128. Prefix 字段的字节数由 Option Length 字段推导得出, 且必须至少能够容纳 Prefix Length 所指示的位数. 注意, 在 RPL 中, 这意味着 Prefix 字段的长度可以不是 0, 8 或 16.
- Prf: 2 位有符号整数. 当接收到多个相同前缀 (对应不同路由器) 时, Route Preference 指示是否优先选择与该前缀关联的路由器. 如果收到 Reserved (10) 值, 则 MUST 忽略该 RIO. 根据 [RFC4191], Reserved (10) 值 MUST NOT 被发送. ([RFC4191] 将 Preference 限制为仅三个值, 以强调它不是度量.)
- Resvd: 两个 3 位未使用字段. 发送方 MUST 将它们初始化为零, 接收方 MUST 忽略它们.
- Route Lifetime: 32 位无符号整数. 前缀用于路由确定时保持有效的时间长度, 以秒为单位 (相对于数据包发送时间). 全 1 位值 (0xFFFFFFFF) 表示无限.
- Prefix: 可变长度字段, 包含一个 IP 地址或 IPv6 地址前缀. Prefix Length 字段包含前缀中有效前导位的数量. 前缀长度之后的前缀位 (如果有) 为保留位, 发送方 MUST 将其初始化为零, 接收方 MUST 忽略. 注意, 在 RPL 中, 该字段的长度可以不是 0, 8 或 16.
RIO 的未分配位为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.7.6. DODAG 配置 (DODAG Configuration)
DODAG Configuration 选项 MAY 出现在 DIO 消息中, 其格式如下:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x04 |Opt Length = 14| Flags |A| PCS | DIOIntDoubl. |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DIOIntMin. | DIORedun. | MaxRankIncrease |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MinHopRankIncrease | OCP |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Def. Lifetime | Lifetime Unit |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 24: DODAG Configuration 选项格式
DODAG Configuration 选项用于通过 DODAG 分发 DODAG Operation 的配置信息.
该选项传达的信息在 DODAG 内通常是静态且不变的, 因此不必包含在每个 DIO 中. 该信息在 DODAG 根处配置, 并通过 DODAG Configuration 选项分发到整个 DODAG. DODAG 根以外的节点在传播 DODAG Configuration 选项时 MUST NOT 修改该信息. DODAG 根 MAY 偶尔包含该选项 (由 DODAG 根决定), 并且在响应单播请求时 MUST 包含该选项, 例如单播 DODAG 信息请求 (DODAG Information Solicitation, DIS) 消息.
- Option Type: 0x04
- Option Length: 14
- Flags: Flags 字段中剩余的 4 个未使用位保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Authentication Enabled (A): 1 位标志, 描述网络的安全模式. 该位描述节点在作为路由器加入网络之前是否必须向密钥授权方认证. 如果 DIO 不是安全 DIO, 则 'A' 位 MUST 为零.
- Path Control Size (PCS): 3 位无符号整数, 用于配置可分配给 Path Control 字段的位数 (见第 9.9 节). 注意, 当使用 PCS 来确定 Path Control 字段宽度时, 会加上 1, 即 PCS 值为 0 时会导致 Path Control 字段中有 1 个活动位. PCS 的默认值为 DEFAULT_PATH_CONTROL_SIZE.
- DIOIntervalDoublings: 8 位无符号整数, 用于配置 DIO Trickle 计时器的 Imax (见第 8.3.1 节). DIOIntervalDoublings 的默认值为 DEFAULT_DIO_INTERVAL_DOUBLINGS.
- DIOIntervalMin: 8 位无符号整数, 用于配置 DIO Trickle 计时器的 Imin (见第 8.3.1 节). DIOIntervalMin 的默认值为 DEFAULT_DIO_INTERVAL_MIN.
- DIORedundancyConstant: 8 位无符号整数, 用于配置 DIO Trickle 计时器的 k (见第 8.3.1 节). DIORedundancyConstant 的默认值为 DEFAULT_DIO_REDUNDANCY_CONSTANT.
- MaxRankIncrease: 16 位无符号整数, 用于配置 DAGMaxRankIncrease, 即支持本地修复时 Rank 允许增加的幅度. 如果 DAGMaxRankIncrease 为 0, 则该机制被禁用.
- MinHopRankIncrease: 16 位无符号整数, 用于配置第 3.5.1 节所述的 MinHopRankIncrease. MinHopRankInc 的默认值为 DEFAULT_MIN_HOP_RANK_INCREASE.
- Objective Code Point (OCP): 16 位无符号整数. OCP 字段标识 OF, 并由 IANA 管理.
- Reserved: 7 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Default Lifetime: 8 位无符号整数. 这是所有 RPL 路由默认使用的生命周期. 它以 Lifetime Unit 为单位表示, 例如以秒为单位的默认生命周期为 (Default Lifetime) * (Lifetime Unit).
- Lifetime Unit: 16 位无符号整数. 提供 RPL 中用于表示路由生命周期的单位, 以秒为单位. 对于非常稳定的网络, 它可以是数小时到数天.
6.7.7. RPL Target
RPL Target 选项 MAY 出现在 DAO 消息中, 其格式如下:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x05 | Option Length | Flags | Prefix Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| Target Prefix (Variable Length) |
. .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 25: RPL Target 选项格式
RPL Target 选项用于指示沿 DODAG 可达或被查询的 Target IPv6 地址, 前缀或组播组. 在 DAO 中, RPL Target 选项指示可达性.
RPL Target 选项 MAY 可选地与 RPL Target Descriptor 选项 (图 30) 配对, 后者用于限定该 target.
在 DAO 消息中, 一个或多个 Transit Information 选项 (第 6.7.8 节) MAY 直接跟在一个或多个 Target 选项组成的集合之后 (其中每个 Target 选项 MAY 如上所述与 RPL Target Descriptor 选项配对). DAO 消息的结构, 包括 Target 选项如何与 Transit Information 选项结合使用, 在第 9.4 节中进一步描述.
RPL Target 选项可以按需重复, 以指示多个 target.
- Option Type: 0x05
- Option Length: 可变, 选项以八位字节为单位的长度, 不包括 Type 和 Length 字段.
- Flags: 8 位未使用字段, 保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Prefix Length: 8 位无符号整数. IPv6 Prefix 中有效前导位的数量.
- Target Prefix: 可变长度字段, 标识一个 IPv6 目的地址, 前缀或组播组. Prefix Length 字段包含前缀中有效前导位的数量. 前缀长度之后的前缀位 (如果有) 为保留位, 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.7.8. 传输信息 (Transit Information)
Transit Information 选项 MAY 出现在 DAO 消息中, 其格式如下:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x06 | Option Length |E| Flags | Path Control |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Path Sequence | Path Lifetime | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
+ +
| |
+ Parent Address* +
| |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
'*' 表示 DODAG Parent Address 子字段并不总是存在, 如下文所述.
图 26: Transit Information 选项格式
Transit Information 选项用于让节点指示到一个或多个目的地的路径属性. 目的地由紧邻 Transit Information 选项之前的一个或多个 Target 选项指示.
Transit Information 选项可用于让节点向正在收集 DODAG 路由信息的祖先节点指示自己的 DODAG 父节点, 通常用于构建源路由. 在 Non-Storing 运行模式下, 该祖先节点将是 DODAG 根, 并且该选项由 DAO 消息携带. 在 Storing 运行模式下, 不需要 DODAG Parent Address 子字段, 因为 DAO 消息会直接发送到父节点. 选项长度用于确定 DODAG Parent Address 子字段是否存在.
如果一个 non-storing 节点有多个 DAO 父节点, 则它 MAY 在 non-storing 目的地通告操作中为每个 DAO 父节点包含一个 Transit Information 选项. 该节点可以在不同 DAO 父节点组之间分配 Path Control 字段中的位, 以便在父节点之间传达偏好. 当 DODAG 根在备选父节点/路径之间进行选择以构造 Downward 路由时, 该偏好可能影响其决策.
一个或多个 Transit Information 选项 MUST 由一个或多个 RPL Target 选项引导. 以这种方式, RPL Target 选项指示子节点, 而 Transit Information 选项枚举 DODAG 父节点. DAO 消息的结构, 包括 Target 选项如何与 Transit Information 选项结合使用, 在第 9.4 节中进一步描述.
典型的 non-storing 节点会使用多个 Transit Information 选项, 并将由此形成的 DAO 消息直接发送到根. 典型的 storing 节点会使用一个不带父字段的 Transit Information 选项, 并将由此形成的 DAO 消息发送给一个或多个父节点, 同时按后文说明对 Path Control 进行额外调整.
例如, 在 Non-Storing 运行模式下, 令 Tgt(T) 表示 Target T 的 Target 选项. 令 Trnst(P) 表示包含父地址 P 的 Transit Information 选项. 考虑一个 non-storing 节点 N 的情况, 它通告自己拥有的 target N1 和 N2, 并且有父节点 P1, P2 和 P3. 在这种情况下, DAO 消息预期包含序列 ((Tgt(N1), Tgt(N2)), (Trnst(P1), Trnst(P2), Trnst(P3))), 使 Target 选项组 {N1, N2} 由 Transit Information 选项描述为具有父节点 {P1, P2, P3}. 随后, 该 non-storing 节点会将该 DAO 消息直接发往 DODAG 根, 并通过 DODAG 父节点 P1, P2 或 P3 之一转发该 DAO 消息.
- Option Type: 0x06
- Option Length: 可变, 取决于 DODAG Parent Address 子字段是否存在.
- External (E): 1 位标志. 设置 'E' 标志表示父路由器将外部 target 重新分发到 RPL 网络中. 外部 Target 是通过替代协议学习到的 Target. 外部 target 列在紧邻 Transit Information 选项之前的 Target 选项中. 外部 Target 不预期支持 RPL 消息和选项.
- Flags: Flags 字段中剩余的 7 个未使用位保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Path Control: 8 位位字段. Path Control 字段限制可以向多少个 DAO 父节点发送通告到特定目的地连通性的 DAO 消息, 同时也提供某种相对偏好指示. 该限制为 LLN 中总体 DAO 消息扇出提供一定界限. Path Control 中各位的分配和排序也用于传达偏好. 并非所有这些位都可以启用, 这取决于 DODAG Configuration 中的 PCS. 如图 27 所示, Path Control 字段被划分为四个子字段, 每个子字段包含两个位: PC1, PC2, PC3 和 PC4. 子字段按偏好排序, PC1 最受偏好, PC4 最不受偏好. 在一个子字段内部, 没有偏好顺序. 通过像 ECMP 一样对父节点分组并排序, 可以将父节点与 Path Control 字段中的特定位关联起来, 从而传达偏好.
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|PC1|PC2|PC3|PC4|
+-+-+-+-+-+-+-+-+
图 27: Path Control 偏好子字段编码
- Path Sequence: 8 位无符号整数. 当拥有 Target 前缀的节点发出 RPL Target 选项时 (即在 DAO 消息中), 该节点会设置 Path Sequence, 并在每次发出带有更新信息的 RPL Target 选项时递增 Path Sequence.
- Path Lifetime: 8 位无符号整数. 前缀用于路由确定时保持有效的时间长度, 单位为 Lifetime Unit (从 Configuration 选项获得). 该周期从看到新的 Path Sequence 时开始. 全 1 位值 (0xFF) 表示无限. 全 0 位值 (0x00) 指示可达性丢失. 在本文档中, 对某个 Target 而言, 包含 Path Lifetime 为 0x00 的 Transit Information 选项的 DAO 消息称为 No-Path (针对该 Target).
- Parent Address (optional): 最初发出 Transit Information 选项的节点的 DODAG 父节点 IPv6 地址. 根据 DODAG Mode of Operation (Storing 或 Non-Storing), 并由 Transit Information 选项长度指示, 该字段可以不存在.
Transit Information 选项的未分配位为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.7.9. 请求信息 (Solicited Information)
Solicited Information 选项 MAY 出现在 DIS 消息中, 其格式如下:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x07 |Opt Length = 19| RPLInstanceID |V|I|D| Flags |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ DODAGID +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version Number |
+-+-+-+-+-+-+-+-+
图 28: Solicited Information 选项格式
Solicited Information 选项用于让节点从相邻节点的一个子集请求 DIO 消息. Solicited Information 选项可以指定接收节点需要匹配的若干谓词条件. 请求方使用它来限制来自"不感兴趣"节点的回复数量. 这些谓词会影响节点是否重置其 DIO Trickle 计时器, 如第 8.3 节所述.
Solicited Information 选项包含一些标志, 指示节点在决定是否重置其 Trickle 计时器时应检查哪些谓词. 当所有谓词均为真时, 节点重置其 Trickle 计时器. 如果设置了某个标志, 则 RPL 节点 MUST 检查相关谓词. 如果清除了某个标志, 则 RPL 节点 MUST NOT 检查相关谓词. (如果清除了某个标志, RPL 节点假定相关谓词为真.)
- Option Type: 0x07
- Option Length: 19
- V: 'V' 标志是 Version 谓词. 如果接收方的 DODAGVersionNumber 与请求的 Version Number 匹配, 则 Version 谓词为真. 如果清除了 'V' 标志, 则 Version 字段无效, 发送时 Version 字段 MUST 设置为零, 接收时 MUST 忽略.
- I: 'I' 标志是 InstanceID 谓词. 当 RPL 节点当前的 RPLInstanceID 与请求的 RPLInstanceID 匹配时, InstanceID 谓词为真. 如果清除了 'I' 标志, 则 RPLInstanceID 字段无效, 发送时 RPLInstanceID 字段 MUST 设置为零, 接收时 MUST 忽略.
- D: 'D' 标志是 DODAGID 谓词. 如果 RPL 节点的父节点集合具有与 DODAGID 字段相同的 DODAGID, 则 DODAGID 谓词为真. 如果清除了 'D' 标志, 则 DODAGID 字段无效, 发送时 DODAGID 字段 MUST 设置为零, 接收时 MUST 忽略.
- Flags: Flags 字段中剩余的 5 个未使用位保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Version Number: 8 位无符号整数, 包含有效时被请求的 DODAGVersionNumber 值.
- RPLInstanceID: 8 位无符号整数, 包含有效时被请求的 RPLInstanceID.
- DODAGID: 128 位无符号整数, 包含有效时被请求的 DODAGID.
Solicited Information 选项的未分配位为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.7.10. 前缀信息 (Prefix Information)
前缀信息选项 (Prefix Information Option, PIO) MAY 出现在 DIO 消息中, 并携带 IPv6 ND Prefix Information 选项中规定的信息, 这些信息在 [RFC4861], [RFC4862] 和 [RFC6275] 中定义, 供 RPL 节点和 IPv6 主机使用. 特别是, RPL 节点可以使用该选项, 基于父节点按 [RFC4862] 通告的前缀进行无状态地址自动配置 (Stateless Address Autoconfiguration, SLAAC), 并按 [RFC6275] 通告自己的地址. DODAG 根对设置该信息具有权威性. 除非 RPL 路由器在设置 'R' 标志时可以覆盖 Interface ID 以便在 PIO 中指示其完整地址, 否则该信息沿 DODAG 向下传播时保持不变. 为了作为 RPL 选项携带, 该选项的格式经过修改 (Type, Length, Prefix), 如下所示:
如果在 DIO 中收到的 PIO 唯一期望效果是向接收节点提供父节点的全局地址, 则发送方会清除 'A' 和 'L' 位并设置 'R' 位. 接收后, RPL 不会根据该前缀自动配置地址或连接路由 [RFC4862]. 与所有情况一样, 当未设置 'L' 位时, RPL 节点 MAY 在发送给其子节点的 PIO 中包含该前缀.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x08 |Opt Length = 30| Prefix Length |L|A|R|Reserved1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Valid Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Preferred Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Prefix +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 29: Prefix Information 选项格式
PIO 可用于分发 DODAG 内使用的前缀, 例如用于地址自动配置.
关于 PIO, 应以 [RFC4861] 和 [RFC6275] 作为权威参考. 为方便起见, 此处转录字段说明:
- Option Type: 0x08
- Option Length: 30. 注意, 与 IPv6 ND 不同, 此长度以单个八位字节为单位表示.
- Prefix Length: 8 位无符号整数. Prefix 字段中有效前导位的数量. 取值范围为 0 到 128. Prefix Length 字段为链路内判定提供必要信息 (与 PIO 中的 'L' 标志结合使用时). 它也有助于 [RFC4862] 中规定的地址自动配置, 对该用途可能存在更多前缀长度限制.
- L: 1 位 on-link 标志. 设置时, 表示该前缀可用于链路内判定. 未设置时, 该通告不声明该前缀的 on-link 或 off-link 属性. 换言之, 如果未设置 'L' 标志, RPL 节点 MUST NOT 得出从该前缀派生的地址为 off-link 的结论. 也就是说, 它 MUST NOT 更新先前关于该地址为 on-link 的指示. 作为路由器运行的 RPL 节点 MUST NOT 传播设置了 'L' 标志的 PIO. 作为路由器运行的 RPL 节点 MAY 传播未设置 'L' 标志的 PIO.
- A: 1 位自主地址配置标志. 设置时, 表示该前缀可按 [RFC4862] 中的规定用于无状态地址配置. 当两个协议 (ND RA 和 RPL DIO) 用于在同一链路上携带 PIO 时, RPL 节点可以使用其中任一协议进行 SLAAC. 也可以通过强制该协议中携带的 PIO 的 'A' 标志为 0, 使任一协议不适用于 SLAAC 操作.
- R: 1 位路由器地址标志. 设置时, 表示 Prefix 字段包含分配给发送路由器的完整 IPv6 地址, 该地址可作为 target 选项中的父节点使用. 所指示的前缀是 Prefix 字段的前 prefix length 位. 路由器 IPv6 地址与通告的前缀具有相同作用域, 并遵循相同的生命周期值. Prefix 字段的这种用法与其通告前缀本身的用法兼容, 因为 Prefix Advertisement 只使用前导位. 因此, 对该标志位的解释独立于 on-link (L) 和自主地址配置 (A) 标志位所需的处理.
- Reserved1: 5 位未使用字段. 发送方 MUST 将其初始化为零, 接收方 MUST 忽略.
- Valid Lifetime: 32 位无符号整数. 前缀用于链路内判定时保持有效的时间长度, 以秒为单位 (相对于数据包发送时间). 全 1 位值 (0xFFFFFFFF) 表示无限. Valid Lifetime 也由 [RFC4862] 使用.
- Preferred Lifetime: 32 位无符号整数. 通过无状态地址自动配置从该前缀生成的地址保持 preferred 状态的时间长度, 以秒为单位 (相对于数据包发送时间) [RFC4862]. 全 1 位值 (0xFFFFFFFF) 表示无限. 见 [RFC4862]. 注意, 为避免偏好已不再有效的地址, 该字段的值 MUST NOT 超过 Valid Lifetime 字段.
- Reserved2: 该字段未使用. 发送方 MUST 将其初始化为零, 接收方 MUST 忽略.
- Prefix: 一个 IPv6 地址或 IPv6 地址前缀. Prefix Length 字段包含前缀中有效前导位的数量. 前缀长度之后的前缀位为保留位, 发送方 MUST 将其初始化为零, 接收方 MUST 忽略. 路由器 SHOULD NOT 为链路本地前缀发送 prefix 选项, 主机 SHOULD 忽略此类 prefix 选项. non-storing 节点在拥有该前缀中的地址之前 SHOULD 避免通告该前缀, 随后它 SHOULD 在该字段中通告其完整地址, 并设置 'R' 标志. 如此通告带有 'R' 标志的完整地址的节点, 其子节点随后可以使用该地址来确定 Transit Information 选项中 DODAG Parent Address 子字段的内容.
PIO 的未分配位为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.
6.7.11. RPL Target Descriptor
RPL Target 选项 MAY 紧随一个不透明描述符, 用于限定该特定 target.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x09 |Opt Length = 4 | Descriptor
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Descriptor (cont.) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 30: RPL Target Descriptor 选项格式
RPL Target Descriptor 选项用于限定一个 target, 这有时称为 "tagging".
每个 target 最多可以有一个 descriptor. descriptor 由将 Target 注入 RPL 网络的节点设置. 在 DAO 消息中沿 DODAG 向 Upward 传播该 Target 的路由器 MUST 复制该 descriptor, 但不得修改它.
- Option Type: 0x09
- Option Length: 4
- Descriptor: 32 位无符号整数. 不透明.