2. 特定源组播的主机要求 (Host Requirements for Source-Specific Multicast)
本节定义 "SSM-aware" host 的概念, 随后描述 SSM-aware host 的 API 要求和 SFGMP 协议要求. 需要注意的是, 任何支持源过滤 API, 且其操作系统支持相应 SFGMP 的主机都可以使用 SSM. 本节描述的 SFGMP 修改会使 SSM 在 SSM-aware host 上更好地工作, 但它们并不是使用 SSM 的严格前提条件.
232/8 IPv4 地址范围目前由 IANA 分配给 SSM [IANA-ALLOCATION]. 在 IPv6 中, FF3x::/32 范围 (其中 'x' 是有效的 IPv6 组播作用域值) 保留用于 SSM 语义 [RFC3306], 尽管目前 SSM 分配被限制在 FF3x::/96. ([SSM] 对此主题有更完整的讨论.) 知道 SSM 地址范围并能够对其应用 SSM 语义的主机称为 "SSM-aware" host.
可以配置主机或路由器, 使其对 IANA 分配范围之外的地址应用 SSM 语义. 主机或路由器上的 GMP 模块应当提供一个配置选项, 用于设置 SSM 地址范围. 如果存在此配置选项, 其默认值必须是 IANA 分配的 SSM 范围. 设置此配置选项的机制必须至少允许手动配置. 未来可能会定义用于设置此选项的协议机制.
2.1. API 要求 (API Requirements)
如果 SSM-aware host 的主机 IP 模块收到一个非特定源请求, 要求接收发送到 SSM 目标地址的组播流量, 则它应当按照 [MSFAPI] 的规定向应用程序返回错误 (MODIFICATION). 在非 SSM-aware host 上, 如果应用程序使用错误的 API (例如 "join(G)", IGMPv3 中的 "IPMulticastListen(G,EXCLUDE(S1))", 或 MLDv2 中的 "IPv6MulticastListen(G,EXCLUDE(S2))") 请求投递发送到 SSM 地址的数据包, 它将得不到所请求的服务, 因为 SSM-aware router (遵循本文档规则) 会拒绝处理该请求, 而应用程序除了收不到所请求的流量之外不会收到任何指示.
2.2. GMP 要求 (GMP Requirements)
本节定义 SSM-aware host 上 SFGMP 协议模块的行为, 包括对 [IGMPv3, MLDv2] 所述协议的两项修改. 本节还包含若干协议操作方面的澄清. 据此, 本节记录 SSM-aware host 在发送和接收以下 GMP 消息类型时的行为:
- IGMPv1/v2 和 MLDv1 报告 (IGMPv1/v2 and MLDv1 Reports) (2.2.1)
- IGMPv3 和 MLDv2 报告 (IGMPv3 and MLDv2 Reports) (2.2.2)
- IGMPv1 查询, IGMPv2 和 MLDv1 通用查询 (IGMPv1 Queries, IGMPv2 and MLDv1 General Queries) (2.2.3)
- IGMPv2 Leave 和 MLDv1 Done (IGMPv2 Leave and MLDv1 Done) (2.2.4)
- IGMPv2 和 MLDv1 组特定查询 (IGMPv2 and MLDv1 Group Specific Query) (2.2.5)
- IGMPv3 和 MLDv2 组特定查询 (IGMPv3 and MLDv2 Group Specific Query) (2.2.6)
- IGMPv3 和 MLDv2 组和源特定查询 (IGMPv3 and MLDv2 Group-and-Source Specific Query) (2.2.7)
2.2.1. IGMPv1/v2 和 MLDv1 报告 (IGMPv1/v2 and MLDv1 Reports)
按照 [IGMPv3, MLDv2] 运行的 SSM-aware host 在 "older-version compatibility mode" 下运行时, 可能会针对某个 SSM 地址发送 IGMPv1, IGMPv2, 或 MLDv1 报告. 这是一种异常 (错误) 条件, 表明路由器无法提供 SSM 所需的 SFGMP 支持. 如下所述, 当主机针对 SSM 地址进入兼容模式时会记录错误. 在这种情况下, 发送到通道 (S,G) 的流量很可能不会被投递到已请求接收通道 (S,G) 的接收主机.
[IGMPv3] 和 [MLDv2] 规定, 主机可以允许较旧版本的报告抑制自身的 IGMPv3 或 MLDv2 Membership Record. 但是, 在这种情况下, SSM-aware host 禁止允许其报告被抑制 (MODIFICATION). 在此场景中抑制报告会为攻击者提供一种途径, 使其能够拒绝链路上其他主机的 SSM 服务.
2.2.2. IGMPv3 和 MLDv2 报告 (IGMPv3 and MLDv2 Reports)
主机实现可以在单个报告中报告多个 SSM 通道, 方法是在一个 group record 中包含多个源, 或包含多个 group record.
特定源目标地址的 Group Record 在正常操作下可以是以下任一类型:
-
MODE_IS_INCLUDE, 作为 Current-State Record 的一部分
-
ALLOW_NEW_SOURCES, 作为 State-Change Record 的一部分
-
BLOCK_OLD_SOURCES, 作为 State-Change Record 的一部分
同一个消息中的报告可以同时包含 SSM 目标地址和非特定源目标地址, 即任意源组播 (Any-Source Multicast, ASM) 目标地址.
此外, 在某些情况下主机可能会发送 CHANGE_TO_INCLUDE_MODE record, 例如通过配置更改 SSM 地址范围时. 路由器应按照正常的 SFGMP 规则处理此类记录.
SSM-aware host 不应针对 SSM 地址发送以下任何记录类型.
-
MODE_IS_EXCLUDE, 作为 Current-State Record 的一部分
-
CHANGE_TO_EXCLUDE_MODE, 作为 Filter-Mode-Change Record 的一部分
这是对 [IGMPv3, MLDv2] 的 MODIFICATION, 对其用于 SSM 目标地址的方式施加限制. 其理由是 EXCLUDE mode 不适用于 SSM 地址, 并且如下所述, SSM-aware router 会忽略 SSM 范围内的 MODE_IS_EXCLUDE 和 CHANGE_TO_EXCLUDE_MODE 请求.
2.2.3. IGMPv1 查询, IGMPv2 和 MLDv1 通用查询 (IGMPv1 Queries, IGMPv2 and MLDv1 General Queries)
如果收到 IGMPv1 Query, 或 IGMPv2 或 MLDv1 General Query, SFGMP 协议规范要求主机在该接口上回退到较旧的 (IGMPv1, IGMPv2, 或 MLDv1) 操作模式. 如果发生这种情况, 主机将停止在该接口上报告特定源订阅, 并开始使用 IGMPv1, IGMPv2, 或 MLDv1 报告对所有 SSM 目标地址的兴趣, 且不带源地址限定. 因此, 路由器将不再对该组播组地址应用 SSM 语义.
符合本文档的路由器绝不会针对 SSM 范围内的地址生成 IGMPv1, IGMPv2, 或 MLDv1 查询. 因此, 只有在路由器不是 SSM-aware, 或主机与路由器对 SSM 地址范围的认识不一致时 (例如手动配置不一致), 才会出现这种情况.
如果主机收到针对 SSM 地址的 IGMPv1, IGMPv2, 或 MLDv1 查询, 应当记录错误 (MODIFICATION).
为缓解此问题, 必须通过管理方式确保给定共享介质网络上的所有路由器均符合本文档, 并且对 SSM 地址范围保持一致.
2.2.4. IGMPv2 Leave 和 MLDv1 Done (IGMPv2 Leave and MLDv1 Done)
主机不处理 IGMP Leave 和 MLD Done 消息. 不应针对 SSM 地址发送 IGMPv2 Leave 和 MLDv1 Done 消息, 除非发送主机已回退到较旧版本兼容模式, 并承担上述所有注意事项.
2.2.5. IGMPv2 和 MLDv1 组特定查询 (IGMPv2 and MLDv1 Group Specific Query)
如果主机收到针对任何已配置特定源范围内地址的 IGMPv2 或 MLDv1 Group Specific Query, 即使被查询的组是特定源目标地址, 它也应按照 [IGMPv3, MLDv2] 正常处理该查询. 发送这种查询很可能表明发送路由器不符合本文档, 或者它配置的 SSM 地址范围与接收主机不同. 在这种情况下, 主机应当记录错误 (MODIFICATION).
2.2.6. IGMPv3 和 MLDv2 组特定查询 (IGMPv3 and MLDv2 Group-Specific Query)
如果 SSM-aware host 收到针对 SSM 地址的 SFGMP Group-Specific Query, 且该组匹配其已订阅的任何特定源通道的特定源目标地址, 则它必须按照 [IGMPv3, MLDv2] 以报告响应.
其理由是, 尽管在当前 SFGMP 协议规范中路由器没有理由发送这种查询, 但这种查询在该范围内的语义已有明确定义, 未来实现可能有理由发送此类查询. 对接收的内容应保持宽容.
2.2.7. IGMPv3 和 MLDv2 组和源特定查询 (IGMPv3 and MLDv2 Group-and-Source-Specific Query)
SFGMP 路由器通常使用 Group-and-Source-Specific Query 来查询主机已通过 BLOCK_OLD_SOURCES record 请求离开的 SSM 通道. 对于查询中的组和源与主机订阅的任何通道相匹配的 Group-and-Source-Specific Query, 主机必须按照 [IGMPv3, MLDv2] 的要求作出响应. 使用 SSM 地址不会改变此行为.
主机必须能够处理每个组列出多个源的查询, 这同样是 [IGMPv3, MLDv2] 的要求. 使用 SSM 地址不会在这方面修改 SFGMP 的行为.