跳到主要内容

10. 示例 (Examples)

10.1. 消息示例 (Message Examples)

   STEP

6LN 6LR

| |

1. | ---------- Router Solicitation --------> |

| [SLLAO] |

| |

2. | <-------- Router Advertisement --------- |

| [PIO + 6CO + ABRO + SLLAO] |


Figure 2: Basic Router Solicitation/Router Advertisement Exchange
between a Node and a 6LR or 6LBR


6LN 6LR

| |

1. | ------- NS with Address Registration ------> |

| [ARO + SLLAO] |

| |

2. | <----- NA with Address Registration -------- |

| [ARO with Status] |


Figure 3: Neighbor Discovery Address Registration
      6LN                           6LR                          6LBR

| | |

1. | --- NS with Address Reg --> | |

| [ARO + SLLAO] | |

| | |

2. | | ----------- DAR ----------> |

| | |

3. | | <---------- DAC ----------- |

| | |

4. | <-- NA with Address Reg --- | |

| [ARO with Status] |


Figure 4: Neighbor Discovery Address Registration with Multihop DAD

10.2. 主机自举示例 (Host Bootstrapping Example)

以下示例描述了使用本文档所规定的改进 ND 机制进行地址自举的场景. 假定 6LN 首先执行一系列操作, 以便在 LoWPAN 的链路层获得安全接入, 并取得用于链路层安全的密钥. 如何建立链路层安全不在本文档范围内. 在此示例中, 一个 IEEE 802.15.4 6LN 在不使用 DHCPv6 的情况下形成 16-bit 短 IPv6 地址 (即 RA 中未设置 M 标志).

  1. 获得链路层安全后, 6LN 为自身分配一个链路本地 IPv6 地址. 该链路本地 IPv6 地址基于 6LN 的 EUI-64 链路层地址配置, 该地址按 [RFC4944] 形成.

  2. 接下来, 6LN 向全路由器组播地址发送 RS, 其中 SLLAO 设置为其 EUI-64 链路本地地址, 从而确定网络中的一个或多个默认路由器. 如果 6LN 能够通过链路层操作获得某个路由器的链路层地址, 则 6LN 可以为该路由器形成一个链路本地目的 IPv6 地址, 并向其发送单播 RS.

    6LR 使用 RS 中的 SLLAO 向 IP 源地址回复单播 RA (它可能已经创建了 Tentative NCE). 见图 2.

  3. 为了与超过一个 IP 跳之外的节点通信, 6LN 配置一个全局 IPv6 地址. 为节省开销, 该 6LN 希望按 [RFC4944] 基于 16-bit 短地址配置其 IPv6 地址. 由于该网络为非托管网络 (RA 中未设置 M 标志), 6LN 随机选择一个 16-bit 链路层地址, 并由此形成一个 Tentative IPv6 地址.

  4. 随后, 6LN 通过发送单播 NS 消息, 将该地址注册到其一个或多个默认路由器. 该 NS 携带 ARO, ARO 中包含要注册的 Tentative 全局 IPv6 地址, Registration Lifetime 以及其 EUI-64. 消息中还包含一个 SLLAO, 其中携带与正在注册的地址对应的链路层地址. 如果收到成功 (Status 0) 的 NA 消息, 则该地址随后可以使用, 并且 6LN 假定该地址已经成功完成重复检查. 如果收到重复地址 (Status 1) 的 NA 消息, 则 6LN 删除临时 IPv6 地址和 16-bit 链路层地址, 并返回步骤 3. 如果收到 Neighbor Cache Full (Status 2) 消息, 则 6LN 尝试向另一个默认路由器注册; 如果没有其他默认路由器, 则返回步骤 2. 见图 3. 注意, 返回错误的 NA 消息会被发回 6LN 基于 EUI-64 的链路本地 IPv6 地址, 而不是 16-bit (重复) 地址.

  5. 现在, 6LN 通过在生存期到期前发送新的 NS 地址注册来执行维护.

如果使用多跳 DAD 以及多跳前缀和上下文分发, 则 6LR 和主机遵循上述自举过程的效果是形成一股从 6LBR 向外扩展的 6LR 和主机配置 "波前": 首先, 能够直接到达 6LBR 的主机和 6LR 会接收一个或多个 RA, 然后配置并注册其 IPv6 地址. 完成后, 它们会启用路由协议并开始发送 RA. 这会使另一组 6LR 和主机接收到其 RS 的响应, 形成并注册其地址, 依此类推. 该过程会重复进行, 直到所有 6LR 和主机均已完成配置.

10.2.1. 主机自举消息 (Host Bootstrapping Messages)

本节给出与上述自举过程相关的具体消息示例. 在讨论消息时, 使用以下记法:

  • LL64: 基于 EUI-64 的链路本地地址, 同时也是 802.15.4 长地址.
  • GP16: 基于 802.15.4 短地址的全局地址. 该地址可能不是唯一的.
  • GP64: 按 [RFC4944] 从 EUI-64 地址派生的全局地址.
  • MAC64: 用作链路层地址的 EUI-64 地址.
  • MAC16: IEEE 802.15.4 16-bit 短地址.

注意, 某些实现可能使用 LL64 和 GP16 风格的地址, 而不是 LL64 和 GP64. 下面展示一个消息流示例, 说明节点如何使用 LL64 注册 GP16 地址, 以进行多跳 DAD 验证.

    6LN-----RS-------->6LR
Src= LL64 (6LN)
Dst= all-router-link-scope-multicast
SLLAO= MAC64 (6LN)

6LR------RA--------->6LN
Src= LL64 (6LR)
Dst= LL64 (6LN)

Note: Source address of RA must be a link-local
address (Section 4.2 of RFC 4861).

6LN-------NS Reg------>6LR
Src= GP16 (6LN)
Dst= LL64 (6LR)
ARO
SLLAO= MAC16 (6LN)

6LR---------DAR----->6LBR
Src= GP64 or GP16 (6LR)
Dst= GP64 or GP16 (6LBR)
Registered Address= GP16 (6LN) and EUI-64 (6LN)

6LBR-------DAC--------->6LR
Src= GP64 or GP16 (6LBR)
Dst= GP64 or GP16 (6LR)
Copy of information from DAR

If Status is a success:

6LR ---------NA-Reg------->6LN
Src= LL64 (6LR)
Dst= GP16 (6LN)
ARO with Status = 0

If Status is not a success:

6LR ---------NA-Reg-------->6LN
Src= LL64 (6LR)
Dst= LL64 (6LN) --> Derived from the EUI-64 of ARO
ARO with Status > 0


Figure 5: Detailed Message Address Examples

10.3. 路由器交互示例 (Router Interaction Example)

在 route-over 拓扑中, 当路由协议跨 6LR 运行时, 自举和 Neighbor Cache 管理的处理方式略有不同. 本段描述仅为实现提供指导.

在 6LR 初始化时, 如果可替代的多跳 DAD 是通过 6LBR 执行的, 则它可以选择在父 6LR 的帮助下以主机身份进行自举. 路由器的 Neighbor Cache 管理以及相邻路由器之间的地址解析分别见第 6.5.3 节和第 6.5.5 节. 在此示例中, 假定相邻 6LoWPAN 链路是安全的.

10.3.1. 路由器自举 (Bootstrapping a Router)

在此场景中, 正在自举的 6LR "R1" 距离 6LBR 有多个跳, 并被其他相邻 6LR 环绕. 最初, R1 以主机方式运行. 它发送一个组播 RS, 并从一个或多个相邻 6LR 接收 RA. R1 选择一个 6LR 作为其临时默认路由器, 并通过该默认路由器执行地址解析. 注意, 如果不需要多跳 DAD (例如, 在托管网络中, 或使用基于 EUI-64 的地址时), 则无需选择临时默认路由器; 但是, 如果它希望使用 6LBR 分发的全局前缀自动配置其地址, 则仍可能需要发送初始 RS 消息.

根据 RA 中收到的信息, R1 使用所有相邻 6LR 的条目更新其缓存. 地址注册完成后, 正在自举的路由器删除默认路由器的临时条目, 并启动路由协议.

还需注意, R1 可以直接向 6LBR 刷新其多跳 DAD 注册 (使用路由协议为到达 6LBR 而确定的下一跳相邻 6LR).

10.3.2. 更新 Neighbor Cache (Updating the Neighbor Cache)

在此示例中, 有三个 6LR: R1, R2 和 R3. 起初, R2 启动时只能看到 R1, 因此 R2 为 R1 创建一个 NCE. 现在假定 R2 从路由器 R3 收到一个有效的路由更新. R2 没有任何面向 R3 的 NCE. 如果 R2 的实现支持从路由信息分组中检测链路层地址, 则它会使用该链路层信息直接更新其 Neighbor Cache. 如果无法这样做, 则 R2 应执行组播 NS, 并根据在路由更新分组中收到的源 IP 地址的作用域, 将源地址设置为其链路本地地址或全局地址. NS 消息的目标地址是收到的路由更新分组的源 IPv6 地址. NS 消息格式如 [RFC4861] 第 4.3 节所述.

更一般地, 任何 6LR 如果从某个相邻路由器收到有效路由更新, 但没有该路由器的任何 NCE, 都需要按上述方式更新其 Neighbor Cache.

通过 ND 学习到的路由器 (6LR 和 6LBR) IP 地址不会重新分发给路由协议.