Appendix I. Internet Group Management Protocol (互联网组管理协议)
附录 I. 互联网组管理协议
Internet Group Management Protocol (互联网组管理协议, IGMP) 由 IP 主机用于向任何直接相邻的组播路由器报告其主机组成员关系. IGMP 是一个非对称协议, 本文从主机的角度而非组播路由器的角度加以规定. (IGMP 也可以在组播路由器之间对称或非对称地使用. 此类使用不在本文规定范围内.)
与 ICMP 一样, IGMP 是 IP 的一个组成部分. 符合 IP 组播规范级别 2 的所有主机都必须实现它. IGMP 消息封装在 IP 数据报中, IP 协议号为 2. 与主机相关的所有 IGMP 消息具有以下格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Unused | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version (版本)
本备忘录规定 IGMP 第 1 版. 第 0 版在 RFC-988 中规定, 现已废弃.
Type (类型)
与主机相关的 IGMP 消息有两种类型:
- 1 = Host Membership Query (主机成员关系查询)
- 2 = Host Membership Report (主机成员关系报告)
Unused (未使用)
未使用字段, 发送时置零, 接收时忽略.
Checksum (校验和)
校验和是 8 字节 IGMP 消息的一补码和的 16 位一补码. 计算校验和时, 校验和字段置零.
Group Address (组地址)
在 Host Membership Query 消息中, 组地址字段发送时置零, 接收时忽略.
在 Host Membership Report 消息中, 组地址字段保存被报告的 IP 主机组地址.
非正式协议描述
组播路由器发送 Host Membership Query 消息 (以下简称查询) 以发现其连接的本地网络上哪些主机组有成员. 查询发往 all-hosts 组 (地址 224.0.0.1), 并携带 IP 生存时间为 1.
主机通过生成 Host Membership Report (以下简称报告) 来响应查询, 报告它们在收到查询的网络接口上所属的每个主机组. 为避免并发报告的"爆炸"并减少传输的报告总数, 使用了两种技术:
-
当主机收到查询时, 不是立即发送报告, 而是为传入查询的网络接口上的每个组成员关系启动一个报告延迟计时器. 每个计时器设置为 0 到 D 秒之间不同的随机选择值. 当计时器到期时, 为相应的主机组生成报告. 因此, 报告分散在 D 秒的间隔内, 而不是同时发生.
-
报告以等于被报告主机组地址的 IP 目的地址发送, IP 生存时间为 1, 以便同一网络上同一组的其他成员可以听到该报告. 如果主机听到其在该网络上所属的某个组的报告, 主机将停止该组的自身计时器, 不再为该组生成报告. 因此, 在正常情况下, 网络上每个存在的组只会由延迟计时器最先到期的成员主机生成一个报告. 请注意, 组播路由器接收所有 IP 组播数据报, 因此无需被明确寻址. 还请注意, 路由器不需要知道哪些主机属于某个组, 只需知道特定网络上至少有一台主机属于该组.
上述行为有两个例外. 首先, 如果在收到查询时某个组成员关系的报告延迟计时器已在运行, 该计时器不会重置为新的随机值, 而是继续以当前值运行. 其次, 主机在 all-hosts 组 (224.0.0.1) 的成员关系上永远不会设置报告延迟计时器, 该成员关系也永远不会被报告.
如果主机使用伪随机数生成器来计算报告延迟, 应将主机自身的某个单独 IP 地址用作生成器种子的一部分, 以减少多台主机生成相同延迟序列的可能性.
主机应确认收到的报告在其 IP 目的地址字段和 IGMP 组地址字段中具有相同的 IP 主机组地址, 以确保主机自身的报告不会被错误收到的报告取消. 主机应静默丢弃任何类型不是 Host Membership Query 或 Host Membership Report 的 IGMP 消息.
组播路由器定期发送查询以刷新其对特定网络上存在的成员关系的了解. 如果在若干次查询后某个特定组没有收到报告, 路由器假定该组在本地没有成员, 不需要将该组的远程发起的组播转发到本地网络. 查询通常不频繁发送 (每分钟不超过一次), 以使主机和网络上的 IGMP 开销非常低. 但是, 当组播路由器启动时, 它可能会发出几个间隔较短的查询, 以便快速建立对本地成员关系的了解.
当主机加入新组时, 应立即为该组传输报告, 而不是等待查询, 以防它是该网络上该组的第一个成员. 为了应对初始报告丢失或损坏的可能性, 建议在短暂延迟后重复一两次. (实现此目的的一种简单方法是假装仅为该组收到了查询, 设置该组的随机报告延迟计时器. 下面的状态转换图说明了这种方法.)
请注意, 在没有组播路由器的网络上, 唯一的 IGMP 流量是主机加入新组时发送的一个或多个报告.
状态转换图
IGMP 行为由下面的状态转换图更正式地规定. 对于任何单个网络接口上的任何单个 IP 主机组, 主机可能处于三种可能状态之一:
-
Non-Member (非成员) 状态: 主机在该接口上不属于该组. 这是所有网络接口上所有成员关系的初始状态; 在主机中不需要存储.
-
Delaying Member (延迟成员) 状态: 主机在该接口上属于该组, 并且该成员关系的报告延迟计时器正在运行.
-
Idle Member (空闲成员) 状态: 主机在该接口上属于该组, 并且该成员关系没有报告延迟计时器在运行.
有五个重要事件可能导致 IGMP 状态转换:
-
"join group" (加入组): 当主机决定在该接口上加入该组时发生. 只能在 Non-Member 状态下发生.
-
"leave group" (离开组): 当主机决定在该接口上离开该组时发生. 只能在 Delaying Member 和 Idle Member 状态下发生.
-
"query received" (收到查询): 当主机收到有效的 IGMP Host Membership Query 消息时发生. 要有效, 查询消息必须至少 8 字节长, 具有正确的 IGMP 校验和, 且 IP 目的地址为 224.0.0.1. 单个查询适用于收到查询的接口上的所有成员关系. 对于处于 Non-Member 或 Delaying Member 状态的成员关系, 该事件被忽略.
-
"report received" (收到报告): 当主机收到有效的 IGMP Host Membership Report 消息时发生. 要有效, 报告消息必须至少 8 字节长, 具有正确的 IGMP 校验和, 且在其 IP 目的地址字段和 IGMP 组地址字段中包含相同的 IP 主机组地址. 报告仅适用于收到报告的接口上报告所标识的组的成员关系. 对于处于 Non-Member 或 Idle Member 状态的成员关系, 该事件被忽略.
-
"timer expired" (计时器到期): 当该接口上该组的报告延迟计时器到期时发生. 只能在 Delaying Member 状态下发生.
所有其他事件, 例如收到无效的 IGMP 消息, 或收到查询或报告以外的 IGMP 消息, 在所有状态下均被忽略.
响应上述事件可能采取三种可能的动作:
-
"send report" (发送报告): 为该接口上的该组发送报告.
-
"start timer" (启动计时器): 为该接口上的该组启动计时器, 使用 0 到 D 秒之间的随机延迟值.
-
"stop timer" (停止计时器): 为该接口上的该组停止计时器.
在下图中, 每个状态转换弧标注了导致转换的事件, 以及括号中转换期间采取的任何动作.
________________
| |
| |
| |
| |
----->| Non-Member |<---------
| | | |
| | | |
| | | |
| |________________| |
| | |
| leave group | join group | leave group
| (stop timer) |(send report, |
| | start timer) |
________|________ | ________|________
| |<----- | |
| | | |
| |<---------------| |
| | query received | |
| Delaying Member | (start timer) | Idle Member |
| |----------------->| |
| | report received | |
| | (stop timer) | |
|_________________|----------------->|_________________|
timer expired
(send report)
all-hosts 组 (地址 224.0.0.1) 作为特殊情况处理. 主机在每个接口上以 Idle Member 状态启动该组, 永远不会转换到其他状态, 也永远不会为该组发送报告.
协议参数
最大报告延迟 D 为 10 秒.