5. 组成员的协议描述
IGMP 是一个非对称协议, 为组成员 (希望接收组播数据包的主机或路由器) 和组播路由器 (侦听 IGMP 消息并协调组播转发) 指定不同的行为. 本节描述适用于组成员的 IGMPv3 部分. (请注意, 路由器也可能是组成员.)
系统在支持组播接收的每个接口上执行本节中描述的协议. 每个接口上的协议涉及对两种类型事件的即时处理:
-
接口上组播接收状态的变化, 由本地调用 IPMulticastListen 定义引起.
-
接收到成员查询消息.
5.1. 接口状态变化时的操作
根据第 3.2 节中的规则, 调用 IPMulticastListen 可能导致接口的组播接收状态发生变化. 每次此类变化都会影响单个组播组地址的每接口状态.
接口状态的变化导致系统立即从该接口传输状态变更报告 (State Change Report). 状态变更报告的类型和内容按如下方式确定:
-
如果状态变化不显著, 例如组的过滤模式从 INCLUDE 移动到 INCLUDE 或从 EXCLUDE 移动到 EXCLUDE, 且源地址集保持不变, 则不生成报告.
-
如果状态变化显著, 则生成状态变更报告. 报告包含状态已变化的组的单个组记录. 组记录的类型和内容通过比较旧状态 (变化前的状态) 与新状态 (变化后的状态) 来确定, 如下表所示:
旧状态 新状态 发送的状态变更记录 INCLUDE (A) INCLUDE (B) ALLOW (B-A), BLOCK (A-B) EXCLUDE (A) EXCLUDE (B) ALLOW (A-B), BLOCK (B-A) INCLUDE (A) EXCLUDE (B) TO_EX (B) EXCLUDE (A) INCLUDE (B) TO_IN (B) 符号 "ALLOW (B-A)" 表示状态变更记录携带一个源列表, 包含集合 B 中但不在集合 A 中的所有源地址. 符号 "BLOCK (A-B)" 表示状态变更记录携带一个源列表, 包含集合 A 中但不在集合 B 中的所有源地址.
如果为 ALLOW 或 BLOCK 记录计算的源列表为空, 则该记录将从状态变更报告中省略.
为确保状态变更报告被网络上的所有组播路由器接收, 系统以从范围 (0, [Unsolicited Report Interval]) 中选择的随机间隔重传报告 [Robustness Variable] - 1 次. [Robustness Variable] 是一个可调参数, 默认值为 2. [Unsolicited Report Interval] 也是一个可调参数, 默认值为 10 秒.
如果状态变更报告已计划传输, 并且接收到会导致生成当前状态报告 (Current State Report) 的查询 (参见第 5.2 节), 则丢弃待处理的状态变更报告, 改为发送当前状态报告. 当前状态报告必须包含状态变更报告中本应包含的所有信息.
5.2. 接收查询时的操作
当系统接收到查询时, 它首先检查查询是否有效. 要有效, 查询必须:
- 至少为 12 个字节长,
- 具有正确的 IP 校验和,
- 具有等于全系统组播地址 (224.0.0.1) 或被查询的特定组地址的目标 IP 地址.
如果查询无效, 则忽略它. 如果查询有效, 系统执行以下操作:
- 如有必要, 更新其查询者的定时器 (参见第 6 节).
- 确定是否需要响应查询.
以下小节描述响应不同类型查询的规则.
5.2.1. 接收通用查询时的操作
收到通用查询后, 系统检查每个接口以查看是否有任何组的任何组播接收状态. 对于具有状态的每个组, 系统计划发送当前状态报告.
报告包含该组的组记录. 如果该组的过滤模式为 INCLUDE, 则组记录的类型为 MODE_IS_INCLUDE; 如果过滤模式为 EXCLUDE, 则为 MODE_IS_EXCLUDE. 组记录中的源列表包含该组的源地址集.
报告计划在从范围 (0, [Max Resp Time]) 中选择的随机时间发送, 其中 [Max Resp Time] 是查询的 Max Resp Code 字段中指定的值.
5.2.2. 接收组特定查询时的操作
收到组特定查询后, 系统检查是否有查询中指定的组地址的任何组播接收状态. 如果没有, 则忽略查询.
如果该组存在状态, 系统计划发送当前状态报告. 报告包含该组的组记录, 按第 5.2.1 节所述构造.
报告计划在从范围 (0, [Max Resp Time]) 中选择的随机时间发送.
5.2.3. 接收组和源特定查询时的操作
收到组和源特定查询后, 系统检查是否有查询中指定的组地址的任何组播接收状态. 如果没有, 则忽略查询.
如果该组存在状态, 系统确定是否对查询中指定的任何源地址感兴趣. 系统对源地址感兴趣的条件是:
- 该组的过滤模式为 EXCLUDE, 或
- 该组的过滤模式为 INCLUDE 且源地址在源列表中.
如果系统对至少一个源地址感兴趣, 它计划发送当前状态报告. 报告包含该组的组记录, 按第 5.2.1 节所述构造.
报告计划在从范围 (0, [Max Resp Time]) 中选择的随机时间发送.
5.2.4. 接收设置了 "S" 标志的查询时的操作
如果接收到的查询中设置了 "S" (抑制路由器端处理) 标志, 系统不更新其查询者的定时器. 但是, 它仍按第 5.2.1 至 5.2.3 节所述响应查询.