3. Protocol Description (协议描述)
3. 协议描述 (Protocol Description)
注意, 计时器值的默认值在本文档后面描述. 计时器和计数器名称出现在方括号中.
本文档有时使用 "interface" 一词表示 "连接网络上的主接口"; 如果路由器在单个网络上有多个物理接口, 本协议只需要在其中一个接口上运行. 另一方面, 主机需要在所有具有关联成员资格的接口上执行其操作.
组播路由器使用 IGMP 了解每个连接的物理网络上哪些组有成员. 组播路由器为每个连接网络维护一份组播组成员资格列表, 并为每个成员资格维护一个计时器. "组播组成员资格" 是指给定连接网络上至少存在一个组播组成员, 而不是所有成员的列表. 对于每个连接网络, 组播路由器可以承担两种角色之一: Querier 或 Non-Querier. 每个物理网络通常只有一个 Querier. 所有组播路由器在每个连接网络上都以 Querier 身份启动. 如果组播路由器听到来自 IP 地址更低的路由器的 Query 消息, 它 MUST 在该网络上成为 Non-Querier. 如果路由器在 [Other Querier Present Interval] 内没有听到来自另一台路由器的 Query 消息, 它将恢复 Querier 角色. 路由器会在其作为 Querier 的每个连接网络上定期 [Query Interval] 发送 General Query, 以请求成员资格信息. 启动时, 路由器 SHOULD 发送 [Startup Query Count] 个间隔较短 [Startup Query Interval] 的 General Query, 以便快速且可靠地确定成员资格信息. General Query 发送到 all-systems 组播组 (224.0.0.1), Group Address 字段为 0, Max Response Time 为 [Query Response Interval].
当主机收到 General Query 时, 它会为其在接收该查询的接口上所属的每个组 (不包括 all-systems 组) 设置延迟计时器. 每个计时器都设置为不同的随机值, 使用主机上可用的最高时钟粒度, 从范围 (0, Max Response Time] 中选择, 其中 Max Response Time 为 Query 数据包中指定的值. 当主机收到 Group-Specific Query 时, 如果它在接收该查询的接口上是被查询组的成员, 它会按上述方式为该组设置一个延迟计时器, 值从范围 (0, Max Response Time] 中随机选择. 如果该组的计时器已经在运行, 只有当请求的 Max Response Time 小于正在运行的计时器剩余值时, 才将其重置为该随机值. 当某个组的计时器到期时, 主机会以 IP TTL 1 向该组组播一个 Version 2 Membership Report. 如果主机在计时器运行期间收到另一个主机的 Report (version 1 或 version 2), 它会停止指定组的计时器并且不发送 Report, 以抑制重复 Report.
当路由器收到 Report 时, 它会将所报告的组加入接收该 Report 的网络上的组播组成员资格列表, 并将该成员资格的计时器设置为 [Group Membership Interval]. 重复的 Report 会刷新该计时器. 如果在某个特定组的计时器到期前没有收到 Report, 路由器会假定该组没有本地成员, 并且无需再将远端发起的该组组播转发到该连接网络上.
当主机加入组播组时, 它应该立即为该组传输一个 unsolicited Version 2 Membership Report, 以防它是该网络上此组的第一个成员. 为覆盖初始 Membership Report 丢失或损坏的可能性, 建议在短暂延迟 [Unsolicited Report Interval] 后重复一到两次. (一种简单做法是发送初始 Version 2 Membership Report, 然后像收到该组的 Group-Specific Query 一样操作, 并相应设置计时器).
当主机离开组播组时, 如果它是最后一个用 Membership Report 回复该组 Query 的主机, 它 SHOULD 向 all-routers 组播组 (224.0.0.2) 发送 Leave Group 消息. 如果它不是最后一个回复 Query 的主机, 它 MAY 什么都不发送, 因为子网上必定还有另一个成员. 这是一项减少流量的优化; 没有足够存储空间来记住自己是否为最后一个回复主机的主机, MAY 在离开组时始终发送 Leave Group 消息. 路由器 SHOULD 接受以被离开的组为目的地址的 Leave Group 消息, 以兼容本标准较早版本的实现. Leave Group 消息发送到 all-routers 组, 是因为其他组成员不需要知道某个主机已经离开该组, 但将消息发送到该组也不会造成损害.
当 Querier 收到某个组的 Leave Group 消息, 且该组在接收接口上有组成员时, 它会每隔 [Last Member Query Interval] 向正在离开的组发送 [Last Member Query Count] 个 Group-Specific Query. 这些 Group-Specific Query 的 Max Response Time 设置为 [Last Member Query Interval]. 如果在最后一个 Query 的响应时间到期后没有收到 Report, 路由器会按上述方式假定该组没有本地成员. 在此期间会忽略任何 Querier 到 Non-Querier 的转换; 同一路由器继续发送 Group-Specific Query.
Non-Querier MUST 忽略 Leave Group 消息, Querier SHOULD 忽略接收接口上没有组成员的组的 Leave Group 消息.
当 Non-Querier 收到 Group-Specific Query 消息时, 如果其现有组成员资格计时器大于消息中指定的 Max Response Time 乘以 [Last Member Query Count], 它会将其组成员资格计时器设置为该值.