6. 6LR 和 6LBR 的路由器行为 (Router Behavior for 6LRs and 6LBRs)
6. 6LR 和 6LBR 的路由器行为 (Router Behavior for 6LRs and 6LBRs)
6LR 和 6LBR 都会基于它们从主机的 NA 消息中收到的 ARO, 来自其他节点的 ND 分组, 以及可能在 6LoWPAN 中使用的路由协议 (如第 3.5 节所述), 维护 Neighbor Cache [RFC4861].
路由器 SHOULD NOT 对 Registered NCE (见第 3.4 节) 执行垃圾回收, 因为它们需要保留这些表项直到 Registration Lifetime 过期. 类似地, 如果路由器上的 NUD 确定主机为 UNREACHABLE (基于 [RFC4861] 中的逻辑), 也 SHOULD NOT 删除该 NCE, 而应保留到 Registration Lifetime 过期. 续订的 ARO 应将缓存表项标记为 STALE. 因此, 对 6LoWPAN 路由器而言, Neighbor Cache 的行为并不像缓存. 相反, 它更像是所有附接到该路由器的主机地址的注册表.
路由器 MAY 实现 Default Router Preference (Prf) 扩展 [RFC4191], 并用它向主机指示该路由器是 6LBR 还是 6LR. 如果实现了该扩展, 则没有通往边界路由器路由的 6LR MUST 将 Prf 设为 (11), 表示低偏好; 其他 6LR MUST 将 Prf 设为 (00), 表示普通偏好; 6LBR MUST 将 Prf 设为 (01), 表示高偏好.
6.1. 禁止的动作 (Forbidden Actions)
即使 route-over 拓扑中的路由器可以同时到达某个主机和另一个目标, 由于无线电传播的原因, 它通常也无法知道该主机是否可以直接到达另一个目标. 因此, 它不能假定 Redirect 从一个主机到另一个主机实际可用. 因此, 它 SHOULD NOT 发送 Redirect 消息. 对此 "SHOULD NOT" 唯一可能的例外是, 部署或实现有办法知道主机如何到达预期目标. 因此, RECOMMENDED 的做法是实现默认不发送 Redirect 消息, 但当部署需要时可配置启用. 相比之下, 对于 mesh-under 拓扑, 与 Redirect 相关的考虑与 [RFC4861] 中相同.
路由器 MUST NOT 在 PIO 中设置 L (on-link) 标志, 因为这可能触发主机发送组播 NS.
6.2. 接口初始化 (Interface Initialization)
6LBR 路由器接口初始化行为与 [RFC4861] 中相同. 然而, 在动态配置场景 (见第 8.1 节) 中, 6LR 启动时作为非路由器, 并等待先接收用于配置自身接口地址的通告, 然后才将其接口设置为通告接口并转变为路由器.
6.3. 处理 Router Solicitation
路由器按 [RFC4861] 中的规定处理 RS 消息. 差异在于 RA 消息中包含 ABRO, 以及只使用单播 RA. 如果 6LR 已从 6LBR 收到 ABRO, 则它会在自己发送的 RA 消息中原样包含该选项. 并且, 如果 6LR 已从另一个 6LBR 收到 RA, 无论其中前缀和上下文信息相同还是不同, 它都需要分别保存这些前缀和上下文信息, 以便 6LR 发送的 RA 能够维护 ABRO 与前缀及上下文信息之间的关联. 路由器可以根据 ABRO 中的 6LBR Address 字段判断前缀和上下文信息源自哪个 6LBR. 当路由器拥有与多个 ABRO 绑定的信息时, 一个 RS 将导致发送多个 RA, 每个 RA 包含不同的 ABRO.
当与某个 6LBR 关联的 ABRO Valid Lifetime 超时时, MUST 移除与该 6LBR 相关的所有信息. 作为实现说明, 建议 RA 的发送频率应明显高于 ABRO Valid Lifetime 所要求的最低频率, 这样漏收一个 RA 不会导致移除与 6LBR 相关的全部信息.
RS 可能来自尚未向该路由器注册其地址的主机. 因此, 路由器 MUST NOT 基于 RS 中的 SLLAO 修改已有 NCE. 但是, 路由器 MAY 基于 SLLAO 创建 Tentative NCE. 除非注册将其转换为 Registered NCE, 否则这种 Tentative NCE SHOULD 在 TENTATIVE_NCE_LIFETIME 秒后超时.
6LR 或 6LBR MUST 在其发送的 RA 中包含 SLLAO; 这是必需的, 以便主机知道路由器的链路层地址. 与 [RFC4861] 不同, RA Router Lifetime 字段的最大值 MAY 达到 0xFFFF (约 18 小时).
与建议使用组播 RA 的 [RFC4861] 不同, 本规范通过始终用单播 RA 响应 RS 来改进交换过程. 这是可行的, 因为 RS 始终包含 SLLAO, 路由器用它来单播 RA.
6.4. 周期性 Router Advertisement
路由器不需要发送任何周期性 RA 消息, 因为主机会在 lifetime 过期之前发送 RS 来请求更新后的信息.
然而, 如果路由器使用 RA 在 route-over 拓扑中分发前缀和/或上下文信息, 则可能需要周期性 RA 消息. 这种 RA 按 [RFC4861] 使用可配置的 MinRtrAdvInterval 和 MaxRtrAdvInterval 发送.
6.5. 处理 Neighbor Solicitation
路由器按 [RFC4861] 中的规定处理 NS 消息, 并增加本节所述用于处理 ARO 的逻辑.
除对 NS 及其选项进行正常验证外, 还按如下方式验证 ARO (如果存在). 如果 Length 字段不是二, 或 Status 字段不是零, 则静默忽略该 NS.
如果 NS 的源地址是未指定地址, 或未包含 SLLAO, 则忽略任何包含的 ARO, 也就是说, 该 NS 按不含 ARO 的方式处理.
6.5.1. 检查重复 (Checking for Duplicates)
如果 NS 包含有效 ARO, 则路由器检查到达接口上的 Neighbor Cache, 以判断它是否为重复地址. 在以下情况下它不是重复地址: (1) 不存在该 NS 的 IPv6 源地址对应的 NCE, 或 (2) 存在这样的 NCE 且 EUI-64 相同. 否则, 它就是重复地址. 注意, 如果使用多跳 DAD (第 8.2 节), 则检查略有不同, 需要考虑 Tentative NCE. 在重复地址的情况下, 路由器按第 6.5.2 节所述, 以单播 NA 消息响应, 并将 ARO Status 字段设为一 (表示该地址重复). 在这种情况下, Neighbor Cache 不做任何修改.
6.5.2. 返回地址注册错误 (Returning Address Registration Errors)
由于可能存在 L2 地址冲突风险, 地址注册错误不会发回 NS 的源地址. 相反, NA 会发送到链路本地 IPv6 地址, 其中 Interface ID 部分按 [RFC4944] 从 ARO 的 EUI-64 字段派生. 特别地, 这意味着需要反转 universal/local bit. NA 的格式包含从 NS 复制的 ARO, 但 Status 字段设置为指示相应错误.
错误发送到其 Interface ID 从 EUI-64 派生的链路本地地址. 因此, 如果 ARO 来自短地址并用于短地址, 则携带 ARO 错误的 NA 的 L2 目的地址将是 64-bit 唯一地址.
6.5.3. 更新 Neighbor Cache
如果 ARO 未导致如上检测到重复地址, 则当 Registration Lifetime 非零时, 路由器为 NS 的 IPv6 源地址创建 (如果尚不存在) 或更新 (否则) 一个 NCE. 如果 Neighbor Cache 已满且需要创建新表项, 则路由器按第 6.5.2 节所述, 以单播 NA 响应, 并将 ARO Status 字段设为二 (表示路由器的 Neighbor Cache 已满).
Registration Lifetime 和 EUI-64 记录在 NCE 中. 随后发送单播 NA 作为对 NS 的响应. 该 NA SHOULD 包含 ARO 的副本, 且 Status 字段设为零. NA 中不需要 TLLAO (Target Link-Layer Address Option) [RFC4861], 因为主机已经通过 RA 知道路由器的链路层地址.
如果 ARO 包含零 Registration Lifetime, 则 MUST 删除 NS 的 IPv6 源地址对应的任何已有 NCE, 并按上述方式发送 NA.
如果 NCE 中的 Registration Lifetime 过期, 则路由器 MUST 删除该缓存表项.
Registered NCE 的添加和移除会导致通知路由协议.
注意: 如果使用可替换的多跳 DAD (第 8.2 节), 则由于 Tentative NCE 的存在, Neighbor Cache 的更新略有不同.
6.5.4. 下一跳确定 (Next-Hop Determination)
为了向注册到某个路由器的 6LN 交付分组, 路由器的下一跳确定与主机略有不同 (见第 5.6 节). 检查路由表以确定下一跳 IP 地址. Registered NCE 用于确定下一跳 IP 地址是否为 on-link. 路由器的路由协议负责维护其已注册邻居的 on-link 信息. Tentative NCE MUST NOT 用于确定已注册节点的 on-link 状态.
6.5.5. 路由器之间的地址解析 (Address Resolution between Routers)
需要在某处存在一种机制, 使路由器能够发现彼此的链路层地址. 如果路由器之间使用的路由协议提供此功能, 则路由器之间无需使用 ARO. 否则, 路由器 SHOULD 使用 ARO. 当路由器使用 ARO 彼此注册且正在使用多跳 DAD (第 8.2 节) 时, 必须注意确保不会在每个路由器从相邻路由器听到 ARO 时, 产生大量携带 ARO 的消息涌向 6LBR. 此场景的细节超出本文档范围.
路由器 MAY 也像 [RFC4861] 中那样使用组播 NS 来解析彼此的链路层地址. 因此, 路由器 MAY 为其他路由器组播 NS, 例如作为接收到某些路由协议更新的结果. 路由器 MUST 响应组播 NS. 这意味着路由器 MUST 按 [RFC4861] 中规定加入 solicited-node multicast address.