跳到主要内容

5. 主机行为 (Host Behavior)

5. 主机行为 (Host Behavior)

LoWPAN 中的主机在其发送的 NS 消息中使用 ARO, 以维护路由器中的 Neighbor Cache, 从而消除使用组播 NS 进行地址解析的需求. 与 [RFC4861] 不同, 主机会在信息过期之前发送 RS, 主动更新从 RA 中收到的信息. 最后, 当 NUD 指示一个或所有默认路由器已不可达时, 主机会使用 RS 查找一组新的默认路由器.

5.1. 禁止的动作 (Forbidden Actions)

主机 MUST NOT 组播 NS 消息.

5.2. 接口初始化 (Interface Initialization)

当主机上的接口初始化时, 它遵循 [RFC4861] 中的规范. 根据 [RFC4944] 或适用于该链路的相应 IP-over-foo 文档, 基于分配给该接口的 EUI-64 标识符 [EUI64] 形成链路本地地址, 然后主机按 [RFC4861] 第 6.3.7 节所述发送 RS 消息.

无需加入 solicited-node multicast address, 因为在这种网络中没有节点会组播 NS. 主机 MUST 加入 all-nodes multicast address.

5.3. 发送 Router Solicitation

RS 按 [RFC4861] 中规定的格式构造, 并发送到 IPv6 all-routers multicast address (详见 [RFC4861] 第 6.3.7 节). MUST 包含 SLLAO, 以便响应时能够使用单播 RA. RS 消息中 MUST NOT 使用未指定源地址.

如果链路层支持某种方式将分组发送到某类 all-routers anycast 链路层地址, 则 MAY 使用该方式把这些分组传送给路由器.

由于主机不依赖组播 RA 来发现路由器, 因此当默认路由器列表为空, 某个默认路由器变为不可达, 或前一个 RA 中的前缀和上下文的 lifetime 即将过期时, 主机需要智能地重传 RS. RECOMMENDED 的重传速率是: 按 [RFC4861] 的规定, 最初最多发送 3 个 (MAX_RTR_SOLICITATIONS) RS 消息, 间隔至少 10 秒 (RTR_SOLICITATION_INTERVAL), 然后切换到更慢的重传. 初始重传之后, 对于后续每次重传, 主机 SHOULD 对重传定时器执行截断二进制指数退避 [ETHERNET], 并将重传定时器的增长截断在 60 秒 (MAX_RTR_SOLICITATION_INTERVAL). 在所有情况下, 一旦收到 RA, 即终止 RS 重传. 协议常量见第 9 节.

5.4. 处理 Router Advertisement

RA 的处理与 [RFC4861] 中相同, 但增加了对 6CO 的处理, 并在配置新地址后触发地址注册. 此外, RA 中 MUST 包含 SLLAO. 与 [RFC4861] 不同, RA Router Lifetime 字段的最大值 MAY 达到 0xFFFF (约 18 小时).

如果主机错误地收到设置了 L (on-link) 标志的 PIO, 则 MUST 忽略该 PIO.

5.4.1. 地址配置 (Address Configuration)

地址配置遵循 [RFC4862]. 对于不是从 EUI-64 派生的地址, RA 的 M 标志决定该地址如何配置. 如果 RA 中设置了 M 标志, 则 MUST 使用 DHCPv6 分配地址. 如果未设置 M 标志, 则可以通过任何其他方式配置地址 (重复检测作为注册过程的一部分执行).

地址配置完成后, 将通过向一个或多个路由器单播携带 ARO 的 NS 来注册该地址.

5.4.2. 存储上下文 (Storing Contexts)

主机会为从路由器收到的上下文信息维护一个概念性数据结构. 该结构称为上下文表 (context table). 它包含 CID, 前缀 (来自 6CO 中的 Context Prefix 字段), Compression bit, 以及 Valid Lifetime. 清除了 Compression bit 的上下文表项在接收分组时用于解压缩, 但在发送分组时 MUST NOT 用于压缩.

当在 RA 中收到 6CO 时, 该 6CO 用于向上下文表添加信息或更新信息. 如果 6CO 中的 CID 字段匹配已有的上下文表项, 则使用该 6CO 中的信息更新该表项. 如果 6CO 中的 Valid Lifetime 字段为零, 则立即删除该表项.

如果上下文表中没有匹配表项, 且 Valid Lifetime 字段非零, 则向上下文表添加一个新的上下文. 该 6CO 用于更新新创建的表项.

当 6LBR 更改上下文信息时, 主机可能不会立即察觉. 在最坏情况下, 主机可能持有过期的上下文信息. 因此, 6LBR 会使用第 7.2 节中的建议来谨慎管理上下文生命周期. 节点在包含 6CO 的 RA 消息中使用头部压缩时应格外谨慎.

5.4.3. 维护前缀和上下文信息 (Maintaining Prefix and Context Information)

前缀信息按 [RFC4861] 中的规定超时. 当上下文表项的 Valid Lifetime 过期时, 该表项进入仅接收模式, 这等价于收到一个针对该上下文且 C=0 的 6CO. 该表项会在仅接收模式中保留两倍默认 Router Lifetime 的时间, 此后被移除.

主机应检查各种 lifetime, 以确定下一次应在何时主动发送 RS 请求信息更新. 相关的 lifetime 包括默认 Router Lifetime, PIO 中的 Valid Lifetime, 以及 6CO 中的 Valid Lifetime. 主机 SHOULD 在这些 lifetime 中最短者 (跨所有前缀和所有上下文计算) 过期之前很早, 向路由器单播一个或多个 RS, 如果单播没有响应, 再切换到组播 RS 消息. RS 的重传行为见第 5.3 节.

5.5. 注册和 Neighbor Unreachability Detection

主机发送单播 NS 消息来注册其 IPv6 地址, 也用于执行 NUD, 以验证其默认路由器是否仍可达. 注册由主机在其发送的 NS 中包含 ARO 来完成. 即使主机没有数据要发送, 但预期其他节点会尝试向该主机发送分组, 主机也需要维护路由器中的 NCE. 这是通过在 Registration Lifetime 过期之前很早向路由器发送携带 ARO 的 NS 消息来完成的. NS 消息使用 RETRANS_TIMER 作为最小超时时间, 最多重传 MAX_UNICAST_SOLICIT 次, 直到主机收到携带 ARO 的 NA 消息.

从多个默认路由器收到 RA 消息的主机 SHOULD 尝试向其中多个路由器注册, 以提高网络健壮性.

注意, 按 [RFC4861] 的规定, 来自传输协议或应用的可达性确认可以抑制 NUD 探测.

当主机知道自己将不再使用某个已注册的路由器时, SHOULD 通过发送一个携带 lifetime 为 0 的 ARO 的 NS 来向该路由器注销. 为处理主机非自愿失去与默认路由器连接的情况, 主机 SHOULD 使用适当较低的 Registration Lifetime.

5.5.1. 发送 Neighbor Solicitation

当配置了新地址, 发现新的默认路由器, 或 Registration Lifetime 即将过期时, 主机会触发发送包含 ARO 的 NS 消息. 这种 NS MUST 包含 SLLAO, 因为路由器需要记录主机的链路层地址. NS 消息中 MUST NOT 使用未指定源地址.

5.5.2. 处理 Neighbor Advertisement

主机按 [RFC4861] 中的规定处理 NA 消息, 并增加本节所述用于处理 ARO 的逻辑.

除对 NA 及其选项进行正常验证外, 还按如下方式验证 ARO (如果存在). 如果 Length 字段不是二, 则静默忽略该选项. 如果 EUI-64 字段与接口的 EUI-64 不匹配, 则静默忽略该选项.

如果 Status 字段为零, 则地址注册成功. 主机保存 ARO 中的 Registration Lifetime, 用于在 lifetime 过期之前很早触发新的 NS. 如果 Status 字段不等于零, 则地址注册失败.

5.5.3. 从失败中恢复 (Recovering from Failures)

维护邻居可达性信息的过程与 [RFC4861] 第 7.3 节相同, 但不执行地址解析.

地址注册过程可能因两种原因失败: 没有收到对 NS 的响应 (NUD 失败), 或收到带有失败 Status (Status > 0) 的 ARO. 在 NUD 失败的情况下, 将移除该路由器的表项, 因此地址注册不再重要. 当收到 Status 字段非零的 ARO 时, 这表明该地址的注册失败. 失败 Status 为一表示检测到重复地址, 并遵循 [RFC4862] 第 5.4.5 节所述过程. 主机 MUST NOT 使用它尝试注册的地址. 如果主机与其他路由器有有效注册, 则 MUST 通过向每个路由器使用零 ARO lifetime 进行注册来移除这些注册.

Status 代码为二表示该路由器的 Neighbor Cache 已满. 在这种情况下, 主机 SHOULD 从其默认路由器列表中移除该路由器, 并尝试向另一个路由器注册. 如果主机的默认路由器列表为空, 则需要回退到按第 5.3 节规定发送 RS.

其他失败代码可在未来文档中定义.

5.6. 下一跳确定 (Next-Hop Determination)

到某个目的地的下一跳 IP 地址按如下方式确定. 发往链路本地前缀 (fe80::) 的目的地始终在链路上发送到该目的地. 假定链路本地地址按第 5.2 节所述从 EUI-64 形成, 且不执行地址解析. 分组通过反向执行 [RFC4291] 附录 A 中的过程发送到链路本地目的地.

组播地址被视为 on-link, 并按 [RFC4944] 或相应 IP-over-foo 文档中的规定解析. 注意, [RFC4944] 只定义了如何在 LoWPAN 头部中表示组播目的地址. 对大于链路本地范围的组播 scope 的支持需要适当的组播路由算法.

所有其他前缀都假定为 off-link [RFC5889]. 任播地址始终视为 off-link. 因此, 它们会被发送到默认路由器列表中的某个路由器.

LoWPAN 节点不需要按 [RFC4861] 的规定为每个邻居至少维护一个缓冲区, 因为分组绝不会在等待地址解析时排队.

5.7. 地址解析 (Address Resolution)

地址注册机制和 RA 消息中的 SLLAO 为路由器和主机提供了足够的先验状态, 可将 IPv6 地址解析到其关联的链路层地址. 由于除链路本地前缀和组播地址外, 所有前缀都始终假定为 off-link, 因此不需要邻居之间基于组播的地址解析.

邻居的链路层地址存储在 NCE [RFC4861] 中. 为实现 LoWPAN 压缩, 大多数全局地址使用链路层地址形成. 因此, 主机可以针对这种情况优化以减少内存使用: 仅在链路层地址信息不同于 IPv6 地址的 Interface ID 所对应的链路层地址时才存储该信息 (即差异不只是 on-link/global bit 被反转).

5.8. 睡眠 (Sleeping)

对于 LoWPAN 中由电池供电的主机, 保持低占空比通常是有利的. 本文档中描述的优化使主机能够睡眠, 本节进一步说明这一点. 路由器可能希望缓存发往正在睡眠的主机的流量, 但此类功能超出本文档范围.

5.8.1. 选择适当的 Registration Lifetime

由于所有 ND 消息都由主机发起, 这允许主机在 NS/NA 消息交换之间睡眠或以其他方式不可达. 附加到 NS 消息的 ARO 指示路由器在 Registration Lifetime 字段指定的时段内保持该地址的 NCE 有效. 主机应选择适合其能耗特性的睡眠时间, 并设置大于睡眠时间的 Registration Lifetime, 以确保注册能够成功续订 (例如, 考虑时钟漂移以及可能重传重新注册所需的额外时间). 主机的外部配置在选择睡眠时间 (因此也包括 Registration Lifetime) 时, 还应考虑网络的稳定性 (拓扑变化有多快). 动态网络需要更短的睡眠时间, 以免路由器为节点保留无效 NCE 的时间超过必要长度.

5.8.2. 唤醒时的行为 (Behavior on Wakeup)

当主机从睡眠周期唤醒时, SHOULD 刷新将在下一次唤醒之前超时的当前地址注册. 这是通过按第 5.5.1 节所述发送携带 ARO 的 NS 消息完成的. 主机也可能需要通过发送新的单播 RS 来刷新其前缀和上下文信息 (最大 Router Lifetime 约为 18 小时, 而最大 Registration Lifetime 约为 45.5 天). 如果唤醒后主机 (使用 NUD) 确定部分或全部先前默认路由器已不可达, 则主机会发送组播 RS 来发现新的默认路由器, 并重新启动地址注册过程.