8. 可替换特性行为 (Substitutable Feature Behavior)
通常, 在 6LoWPAN 多跳网络中, RA 消息用于在 route-over 拓扑中向所有 6LR 分发前缀和上下文信息. 如果所有路由器都配置为使用某种替代机制来分发这类信息, 则 6LoWPAN-ND 机制的任何剩余使用都由该替代规范管辖.
另一个选项是, 6LR 可以在 route-over 拓扑中使用 DAR 和 DAC 消息, 针对 6LBR 对某个 IPv6 地址 (不是从 EUI-64 派生的地址) 执行多跳 DAD. 这也是可替换的, 因为可能存在其他方式来分配唯一地址, 例如 DHCPv6 [RFC3315], 或使用未来的其他多跳 DAD 机制. 同样, 在这种情况下, 6LoWPAN-ND 机制的任何剩余使用都由该替代规范管辖.
为避免歧义: 实现 MUST 支持第 8.1 节和第 8.2 节中描述的特性, 除非该实现支持某个其他规范中的替代 ("substitute") 机制.
8.1. 多跳前缀和上下文分发 (Multihop Prefix and Context Distribution)
多跳分发依赖路由器之间发送的 RS 消息和 RA 消息, 并使用 ABRO version number 控制 RA 中发送的信息 (前缀和上下文信息) 的传播.
该多跳分发机制可以处理来自任意数量 6LBR 的任意信息. 然而, 上下文信息的语义要求所有 6LN 在发送, 转发, 或接收压缩分组时使用相同信息. 因此, 6LBR 的管理者需要以某种方式确保各 6LBR 之间的上下文信息保持同步. 这可以用不同方式处理. 一种可能的方式是将上下文和前缀信息视为源自某个逻辑或虚拟来源, 这本质上意味着这些信息看起来像是从单一来源分发的.
如果一组 6LBR 作为单个 6LBR 行为 (使用本文档范围之外的机制), 使来自所有 6LBR 的前缀, 上下文和 ABRO version number 都相同, 则这些 6LBR 可以选择一个单一 IP 地址用于 ABRO.
8.1.1. 6LBR 发送 Router Advertisement
支持多跳前缀和上下文分发的 6LBR MUST 在其每个 RA 中包含 ABRO. ABRO Version Number 字段与第 7.2 节中的指南一起, 用于在整个 LoWPAN 中保持前缀和上下文信息一致. 每当 PIO 或 6CO 集合中的任何信息发生变化时, ABRO version 增加一.
这要求 6LBR 在稳定存储中维护 PIO, 6CO 和 ABRO Version Number, 因为旧版本号会被 6LR 静默忽略.
8.1.2. 路由器发送 Router Solicitation
在 6LoWPAN 中, 除非被替代, 否则多跳分发使用 RA 消息完成. 因此, 在接口初始化时, 路由器 (6LR) MUST 按 [RFC4861] 中为主机规定的规则发送 RS 消息. 这会使路由器以 RA 消息响应, 这些 RA 消息随后可用于初始填充前缀和上下文信息.
8.1.3. 路由器处理 Router Advertisement
如果多跳分发不是使用 RA 消息完成的, 则路由器遵循 [RFC4861], 即它们只执行一些一致性检查; 在这种情况下, 第 8.1 节中的内容均不适用. 否则, 路由器将检查并记录从收到的 RA 中获得的前缀和上下文信息, 并按如下方式使用该信息.
如果收到的 RA 不包含 ABRO, 则 MUST 静默忽略该 RA.
路由器使用 ABRO 中的 6LBR Address 字段检查它是否先前已经从该 6LBR 收到过信息. 如果找不到此类信息, 则只记录 6LBR address, Version, Valid Lifetime, 以及相关前缀和上下文信息. 如果该 6LBR 先前已知, 则 MUST 将 Version Number 字段与为该 6LBR 记录的版本号进行比较. 如果分组中收到的版本号小于已存储的版本号, 则静默忽略 RA 中的信息. 否则, 更新已记录的信息和版本号.
8.1.4. 存储信息 (Storing the Information)
路由器为它看到的每个带有 ABRO 的 6LBR 保存状态. 这包括版本号, Valid Lifetime, 以及完整的 PIO 和 6CO 集合. 前缀基于 PIO 中的 Valid Lifetime 超时. Context Prefix 基于 6CO 中的 Valid Lifetime 超时.
当路由器中存储前缀和上下文信息时, 其有效 lifetime 和首选 lifetime 会随着时间流逝而递减. 这确保当路由器稍后又在自己发送的 RA 中通告该信息时, "expiry time" 不会意外地向未来移动. 例如, 如果在时间 T 收到一个 Valid Lifetime 为 10 分钟的 6CO, 而路由器在时间 T+5 分钟发送的 RA 中包含该 6CO, 则其发送的 6CO 中的 Valid Lifetime 将只剩 5 分钟.
8.1.5. 发送 Router Advertisement
当使用 RA 消息执行多跳分发时, 路由器 MUST 确保 ABRO 始终与随该 ABRO 收到的前缀和上下文信息保持在一起. 因此, 如果路由器收到前缀 P1, 其 ABRO 表明该信息来自一个 6LBR, 又收到来自另一个 6LBR 的前缀 P2, 则路由器 MUST NOT 在同一个 RA 消息中包含这两个前缀. 前缀 P1 MUST 位于包含第一个 6LBR 的 ABRO 的 RA 中, 依此类推. 注意, 多个 6LBR 可能通告相同的前缀和上下文信息, 但这些信息仍需要与通告它们的 6LBR 关联.
路由器像 [RFC4861] 中那样周期性发送 RA. 这是为了让其他路由器接收前缀和上下文信息. 路由器也会通过单播 RA 消息响应 RS. 在这两种情况下, 上述保持 ABRO 与 "its" 前缀和上下文信息在一起的约束都适用.
当路由器从 6LBR 收到新信息时, 也就是说, 它要么听到新的 6LBR (ABRO 中的新 6LBR address), 要么某个已有 6LBR 的 ABRO version number 增加, 此时发送一些触发式更新是有用的. 建议行为与 [RFC4861] 中描述的接口变为通告接口时相同, 即最多发送三条 RA 消息. 这可确保新信息快速传播到所有 6LR.
8.2. 多跳 Duplicate Address Detection
ARO 除了用于在 6LR 中注册地址外, 还可用于让 6LR 验证该地址是否未被该 6LR 已知的其他主机使用. 然而, 在 route-over 拓扑 (或具有多个 6LBR 的 LoWPAN) 中, 这并不充分, 因为附接到另一个 6LR 的某个主机可能正在使用相同地址. 未来可能有不同方式让 6LR 协调这种重复地址检测, 或者可以使用 DHCPv6 服务器分配地址, 并在分配过程中验证唯一性.
本规范提供一种可替换的简单技术, 使 6LR 和 6LBR 能够执行 DAD, 该技术在 DAR 和 DAC 消息中复用来自 ARO 的信息. 当地址中的 Interface ID 基于 EUI-64 时, 不需要该技术, 因为这些 Interface ID 假定为全局唯一. 该技术假定 6LR 要么向所有 6LBR 注册, 要么网络使用某种本文档范围之外的机制来保持各 6LBR 中的 DAD table 同步.
多跳 DAD 机制在某个地址首次向特定 6LR 注册时同步使用. 也就是说, 在针对 6LBR 完成多跳 DAD 之前, ARO 不会返回给主机. 对于 6LR 中已有的注册, 需要针对 6LBR 重复执行多跳 DAD, 以确保 6LBR 中该地址的表项不会超时, 但这可以与对主机的响应异步完成. 实现这一点的一种方法是跟踪 6LR 向 6LBR 注册的 lifetime 还剩多少, 并在该 lifetime 即将耗尽时重新向 6LBR 注册.
对于同步多跳 DAD, 6LR 会执行一些额外检查, 以确保它拥有一个 NCE, 可在收到来自 6LBR 的响应时用于响应主机. 这包括检查是否已经存在 Registered Address 的 (Tentative 或 Registered) NCE, 且其 EUI-64 不同. 如果存在这样的 Registered NCE, 则 6LR SHOULD 响应该地址重复. 如果存在这样的 Tentative NCE, 则 6LR SHOULD 静默忽略该 ARO, 从而依赖主机重传 ARO. 这用于处理多个主机同时尝试注册同一 IPv6 地址的情况. 如果不存在 NCE, 则 6LR MUST 创建一个带有 EUI-64 和 SLLAO 的 Tentative NCE. 当 6LBR 返回肯定响应时, 将使用该表项向主机发送响应.
当 6LR 收到包含非零 Registration Lifetime 的 ARO 的 NS, 且没有已有 Registered NCE 时, 通过此机制, 6LR 将调用同步多跳 DAD.
6LR 将向一个或多个 6LBR 单播 DAR 消息, 其中 DAR 在 Registered Address 字段中包含主机地址. DAR 会由 6LR 转发直到到达 6LBR; 因此, 当 6LBR 收到它时, 其 IPv6 Hop Limit 字段不会是 255. 6LBR 将用 DAC 消息响应, 该消息到达 6LR 时 hop limit 将小于 255.
当 6LR 从 6LBR 收到 DAC 时, 它将查找匹配的 (相同 IP 地址和 EUI-64) (Tentative 或 Registered) NCE. 如果找不到此类表项, 则静默忽略 DAC. 如果找到表项且 DAC 的 Status=0, 则 6LR 将 Tentative NCE 标记为 Registered. 在所有情况下, 只要找到表项, 6LR 就会用 NA 响应主机, 将 DAC 中的 Status 和 EUI-64 字段复制到 NA 中的 ARO. 如果 status 为错误, 则 NA 的目的 IP 地址从 DAC 的 EUI-64 字段派生.
Tentative NCE SHOULD 在创建后 TENTATIVE_NCE_LIFETIME 秒超时, 以允许另一个主机尝试注册该 IPv6 地址.
8.2.1. DAR 和 DAC 的消息验证 (Message Validation for DAR and DAC)
如果收到的 DAR 或 DAC 消息未满足以下至少一项有效性检查, 节点 MUST 静默丢弃该消息:
- 如果消息包含 IP Authentication Header, 则消息认证正确.
- ICMP Checksum 有效.
- ICMP Code 为 0.
- ICMP Length (从 IP length 派生) 为 32 字节或更多.
- Registered Address 不是组播地址.
- 所有包含的选项长度都大于零.
- IP 源地址既不是未指定地址, 也不是组播地址.
Reserved 字段和任何无法识别的选项的内容 MUST 被忽略. 未来向后兼容的协议变更可以规定 Reserved 字段的内容或添加新选项; 向后不兼容的变更可以使用不同的 Code 值.
注意, 由于 DAR 和 DAC 消息会在 6LR 与 6LBR 之间转发, 因此接收这些 ICMPv6 消息类型时不执行 hop-limit 检查.
8.2.2. 概念性数据结构 (Conceptual Data Structures)
实现多跳 DAD 的 6LBR 需要维护某些独立于 Neighbor Cache 的状态. 我们称这种概念性数据结构为 DAD table. 它以 IPv6 地址为索引, 即 DAR 中的 Registered Address, 并包含正在使用该地址的主机的 EUI-64 和 Registration Lifetime.
8.2.3. 6LR 发送 Duplicate Address Request
当实现多跳 DAD 的 6LR 从主机收到 NS, 并且受上述检查约束时, 6LR 构造并向至少一个 6LBR 发送 DAR. DAR 包含以下信息:
- IPv6 源地址中为 6LR 的全局地址.
- IPv6 目的地址中为 6LBR 的地址.
- IPv6 hop limit 中为 MULTIHOP_HOPLIMIT.
- Status 字段 MUST 设为零.
- EUI-64 和 Registration Lifetime 从主机收到的 ARO 中复制.
- Registered Address 设置为主机的 IPv6 地址, 即触发该 DAR 的 NS 的发送者.
当 6LR 从主机收到带有零 Registration Lifetime 的 NS 时, 除按第 6 节所述移除该主机的 NCE 外, 还按上述方式向 6LBR 发送 DAR.
路由器 MUST NOT 因收到 DAR 而修改 Neighbor Cache.
8.2.4. 6LBR 接收 Duplicate Address Request
当实现可替换多跳 DAD 的 6LBR 从 6LR 收到 DAR 时, 它执行第 8.2.1 节中规定的消息验证. 如果 DAR 有效, 6LBR 继续在 DAD table 中查找 Registration Address. 如果找到表项且记录的 EUI-64 与 DAR 中的 EUI-64 不同, 则返回 Status 设为 1 ("Duplicate Address") 的 DAC NA. 否则, 它返回 Status 设为零的 DAC 并更新 lifetime.
如果 DAD table 中没有找到表项且 Registration Lifetime 非零, 则创建一个表项, 并将 DAR 中的 EUI-64 和 Registered Address 存储到该表项中.
如果 DAD table 中找到表项, EUI-64 匹配, 且 Registration Lifetime 为零, 则从表中删除该表项.
在上述两种情况下, 6LBR 使用从 DAR 复制的信息构造 DAC, 并将 Status 字段设为零. DAC 发回 6LR, 即 DAR 的源. IPv6 hop limit 设置为 MULTIHOP_HOPLIMIT.
8.2.5. 处理 Duplicate Address Confirmation
当实现多跳 DAD 的 6LR 收到 DAC 消息时, 它首先按第 8.2.1 节验证该消息. 对于有效 DAC, 如果没有匹配 Registered Address 和 EUI-64 的 Tentative NCE, 则静默忽略该 DAC. 否则, 使用 DAC 和 Tentative NCE 中的信息形成发送给主机的 NA. Status code 从 DAC 复制到发送给主机的 ARO. 如果 DAC 指示错误 (Status 非零), 则按第 6.5.2 节所述将 NA 返回给主机, 并移除 Registered Address 的 Tentative NCE. 否则, 将其转换为 Registered NCE.
路由器 MUST NOT 因收到 DAC 而修改 Neighbor Cache, 除非存在与 IPv6 地址和 EUI-64 匹配的 Tentative NCE.
8.2.6. 从失败中恢复 (Recovering from Failures)
如果在 RETRANS_TIMER [RFC4861] 之后没有来自 6LBR 的响应, 则 6LR 会向该 6LBR 重传 DAR, 最多重传 MAX_UNICAST_SOLICIT [RFC4861] 次. 此后, 6LR SHOULD 以 ARO Status 为零响应主机.