跳到主要内容

3. IPv6 考量 (IPv6 Considerations)

为避免混淆, 前面的讨论完全基于 IPv4。IPv6 的对应协议是组播监听者发现 (Multicast Listener Discovery) [MLD]。由于 MLD 基于 IGMP, 这里不重复完整的描述与推荐做法, 只指出 MLD 与 IGMP 不同的情况。

第 2 节中针对 IGMP 描述的控制转发规则与数据转发规则, 稍作考量即可适用于 MLD; 也就是说, 拦截 MLD 报文、构建成员关系列表与组播路由器列表这些基本功能与 IGMP 相同。

IPv6 的数据转发在某一方面比 IPv4 简单: 对于 scope 为 2(链路本地)及更大范围的地址, MLD 是强制要求的。唯一的例外是全主机链路本地地址 FF02::1, 它从不发送 MLD 报文; 目的地址为全主机链路本地地址的报文应当 (SHOULD) 在所有端口上转发。

地址位于 FF00::/15(涵盖保留的 FF00::/16 与节点本地 FF01::/16)的组不发送 MLD 报文, 因此这些地址绝不应出现在链路上的报文中。

以下 IPv4 与 IPv6 之间的差异与侦听相关:

  1. IPv6 的组播组维护协议称为组播监听者发现第 2 版 [MLDv2]。MLDv2 使用 ICMPv6 报文类型, 而不是 IGMP 报文类型。

  2. [IPV6-ETHER] 与 [IPV6-FDDI] 描述了如何用 128 位目的 IP (DIP) 地址中的 32 位构成 48 位目的 MAC (DMAC) 地址; [IPV6-TOKEN] 描述了令牌环 DMAC 地址使用三个低位比特的映射; [IPV6-1394] 使用 6 位通道号。

  3. 组播路由器发现由 [MRDISC] 定义的 MRDISC 协议完成。

与 IPv4 关于空 IP 源地址的行为对等, MLD 成员关系报告不得 (MUST NOT) 因为 IP 源地址为未指定地址 (::) 而被 MLD 侦听交换机拒绝。此外, 如果非查询器交换机伪造任何通用查询(针对生成树拓扑变化, 如上文第 2.1 节所述), 该交换机在发送这些查询时应当 (SHOULD) 使用未指定 IP 源地址 (::)。收到此类代理查询时, 不得 (MUST NOT) 将其计入查询器选举过程。

IPv6 头部不包含校验和字段。但交换机应当 (SHOULD) 尽可能检测其他报文完整性问题, 例如地址版本与载荷长度之间的一致性。一旦检测到此类错误, 不得 (MUST NOT) 把该报文中的信息纳入 MLD 转发表, 转发代码应当 (SHOULD) 丢弃该报文并采取前述的合理后续动作。

由于 MLDv2 使用 ICMPv6, 而 ICMPv6 除 MLD 之外还有多种用途, 仅凭 IP 头部的 next-header 字段为 ICMPv6 来判断报文是否与 MLD 侦听相关已不再足够。把所有 ICMPv6 报文都当作 MLD 侦听候选项的软件实现, 很容易填满接收队列、使 CPU 陷入停滞, 从而使侦听功能无法达成目的, 并丢失发往其他主机的非 MLD 报文。

有两种可能的处理方式:

  1. 要求侦听交换机更深入地查看报文内容。当提供配置选项、允许管理员指定哪些 ICMPv6 报文类型应触发 CPU 重定向时, 此方案更可取; 硬编码报文类型对将来引入新类型缺乏灵活性。

  2. 结合 ICMPv6 检测组播 DMAC 地址。此方案有把使用 ICMPv6 与组播 DMAC 地址的新协议误判为 MLD 的风险。

建议采用第一种方案。如果无法提供该配置选项, 实现者应当 (SHOULD) 认真考虑将其加入, 因为邻居发现 (Neighbor Discovery) 报文正属于会被误判的情形, 而它对 IPv6 网络的运行完整性至关重要。

如 [RFC3307] 所述, IPv6 组播地址的初始分配仅覆盖组 ID 的低 32 位。因此, IP 组播地址到组播 DMAC 地址的映射存在大量重叠。IPv6 组播地址的结构为:

   |   8    |  4 |  4 |             112 bits                  |
+--------+----+----+---------------------------------------+
|11111111|flgs|scop| group ID |
+--------+----+----+---------------------------------------+

因此在以太网与 FDDI 中, 有 2 ** (112 - 32), 即超过 1.2e24 个唯一 DIP 地址映射到同一个 DMAC 地址, 而 IPv4 只有 2**5 个。不过据 [RFC3307], IPv6 组播地址的初始分配仅覆盖组 ID 的低 32 位; 这暂时把歧义问题缩小到具有不同 flag 与 scope 值的组 ID, 但分配政策将来可能变化。鉴于这种潜在重叠, 建议优先采用基于 IPv6 地址的转发, 而非基于 MAC 地址的转发。