跳到主要内容

6. 区域索引 (Zone Indices)

区域索引 (Zone Indices)

因为相同的非全局地址可能在同一作用域的多个区域中使用 (例如, 链路本地地址 fe80::1 在两条不同的物理链路中的使用), 并且节点可能有接口连接到同一作用域的不同区域 (例如, 路由器通常有多个接口连接到不同的链路), 节点需要一种内部手段来识别非全局地址属于哪个区域。这通过在节点内为该节点所连接的同一作用域的每个区域分配不同的 "区域索引" (zone index), 并允许对地址的所有内部使用由区域索引进行限定来实现。

下面的图示例了区域索引的分配:

    ---------------------------------------------------------------
| a node |
| |
| |
| |
| |
| |
| |
| /--link1--\ /--------link2--------\ /--link3--\ /--link4--\ |
| |
| /--intf1--\ /--intf2--\ /--intf3--\ /--intf4--\ /--intf5--\ |
---------------------------------------------------------------
: | | | |
: | | | |
: | | | |
(imaginary ================= a point- a
loopback an Ethernet to-point tunnel
link) link)

图 1: 区域索引示例

该示例节点有五个接口:

  • 一个到虚拟回环链路的回环接口 (一个虚拟链路, 不通向任何地方)。
  • 两个到同一以太网链路的接口。
  • 一个到点对点链路的接口。
  • 一个隧道接口 (例如, IPv6-over-IPv6 隧道 [8] 的抽象端点, 可能在以太网或点对点链路上建立)。

因此它连接到五个接口本地区域, 由接口索引 1 到 5 标识。

因为两个以太网接口连接到同一链路, 该节点仅连接到四个链路本地区域, 由链路索引 1 到 4 标识。同时注意, 即使隧道接口在以太网上建立, 隧道链路也获得其自己的链路索引, 该索引不同于以太网链路区域的索引。

特定作用域的每个区域索引应该包含足够的信息来指示作用域, 以便所有作用域的所有索引在节点内是唯一的, 并且区域索引本身可以用于专用目的。使用索引来标识管理信息库 (MIB) 中的条目是专用目的的一个例子。编码作用域的实际表示是实现相关的, 超出本文档的范围。在本文档中, 为了可读性, 索引简单地以 "link index 2" 这样的格式表示。

区域索引严格地是节点本地的 (local to the node)。例如, 点对点链路另一端的节点可能对该链路使用完全不同的接口和链路索引值。

一个实现应该也支持每个作用域的 "默认" 区域的概念。当受支持时, 每个作用域中的索引值零应该被保留以表示 "使用默认区域"。与其他区域索引不同, 默认索引不包含任何作用域, 作用域由默认索引所伴随的地址确定。一个实现可以另外为每个作用域定义单独的默认区域。这些默认索引也可以用作该作用域地址的区域限定符, 对于节点仅连接到一个区域的情况; 例如, 在使用全局地址时。

目前, 节点还没有办法自动确定其哪些接口属于同一区域; 例如, 相同的链路或大于接口的相同多播作用域区域。将来, 可能会开发协议来确定该信息。在没有这样的协议的情况下, 实现必须提供手动分配和/或重新分配区域索引的手段。此外, 为了在大多数情况下避免执行手动配置, 实现应该默认情况下仅如下初始分配区域索引:

  • 为每个接口分配唯一的接口索引。
  • 为每个接口分配唯一的链路索引。

然后手动配置仅对于具有多个接口到单个链路的节点或具有接口到不同 (仅多播) 作用域区域的节点的不太常见情况才是必要的。

因此, 来自图 1 的示例节点的默认区域索引分配将如下所示的图 2 中所示。然后手动配置将被要求, 例如, 为两个以太网接口分配相同的链路索引, 如图 1 所示。

    ---------------------------------------------------------------
| a node |
| |
| |
| |
| |
| |
| /--link1--\ /--link2--\ /--link3--\ /--link4--\ /--link5--\ |
| |
| /--intf1--\ /--intf2--\ /--intf3--\ /--intf4--\ /--intf5--\ |
---------------------------------------------------------------
: | | | |
: | | | |
: | | | |
(imaginary ================= a point- a
loopback an Ethernet to-point tunnel
link) link)

图 2: 默认区域索引示例

除了初始分配区域索引外 (如上所述), 实现应该自动为每个有多个选择的作用域选择一个默认区域, 用于每当指定地址时没有区域索引 (或使用零区域索引)。例如, 在图 2 所示的示例中, 实现可能自动选择 intf2 和 link2 作为这两个作用域中的每一个的默认区域。(一种可能的选择算法是选择第一个包含除回环接口外的接口的区域作为每个作用域的默认值。) 还必须提供一种手段来手动为作用域分配默认区域, 覆盖任何自动分配。

单播回环地址 ::1 不得被分配到回环接口以外的任何接口。因此, 建议每当 ::1 被指定时没有区域索引或使用默认区域索引, 它被解释为属于回环链路本地区域, 无论哪个链路本地区域被选为默认值。如果这样做, 那么对于仅具有单个非回环接口 (例如, 单个以太网接口) 的节点, 这是常见情况, 链路本地地址不需要用区域索引限定。未限定的地址 ::1 将始终指回环接口所在的链路本地区域。所有其他未限定的链路本地地址将指包含非回环接口的链路本地区域 (只要默认链路本地区域被设置为包含非回环接口的区域)。

由于要求给定作用域的区域完全落在较大作用域的区域内的要求 (见上面的第 5 节), 分配给作用域 S 的不同区域的两个接口也必须分配给所有小于 S 的作用域的不同区域。因此, 一个作用域的不同区域索引的手动分配可能需要较小作用域的不同区域索引的自动分配。例如, 假设在图 1 中手动分配不同的多播站点本地索引 1 和 2, 并且站点 1 包含链路 1、2 和 3, 但站点 2 仅包含链路 4。此配置将导致自动创建相应的管理员本地 (即, 多播 "scop" 值 4) 索引 1 和 2, 因为管理员本地作用域小于站点本地作用域。

考虑到上述因素, 来自图 1 的示例节点的完整区域索引集, 带有此处的其他配置, 如下图 3 所示。

    ---------------------------------------------------------------
| a node |
| |
| |
| |
| |
| |
| /--------------------site1--------------------\ /--site2--\ |
| |
| /-------------------admin1--------------------\ /-admin2--\ |
| |
| /--link1--\ /--------link2--------\ /--link3--\ /--link4--\ |
| |
| /--intf1--\ /--intf2--\ /--intf3--\ /--intf4--\ /--intf5--\ |
---------------------------------------------------------------
: | | | |
: | | | |
: | | | |
(imaginary ================= a point- a
loopback an Ethernet to-point tunnel
link) link)

图 3: 完整区域索引示例

虽然上面的示例显示区域被顺序分配索引值用于每个作用域 (从 1 开始), 但区域索引值是任意的。实现可以用它选择的任何值标记区域, 只要所有作用域的每个区域的索引值在节点内是唯一的。零应该被保留以代表默认区域。选择遵循推荐的基本 API [10] 的实现会希望将其索引值限制在可以由 sockaddr_in6 结构的 sin6_scope_id 字段表示的那些值。