4. 消息格式
4. 消息格式
IGMP 消息封装在 IPv4 数据报中, IP 协议号为 2. 本文档中描述的每个 IGMP 消息都以 IP 生存时间 (Time-to-Live) 为 1、IP 优先级为互联网控制 (Internetwork Control, 例如服务类型 0xc0) 发送, 并在其 IP 头部中携带 IP 路由器警告选项 (Router Alert option) [RFC-2113]. IGMP 消息类型由 IANA [IANA-REG] 注册, 如 [RFC-3228] 所述.
本文档中描述的 IGMPv3 协议涉及两种 IGMP 消息类型:
| 类型编号 (十六进制) | 消息名称 |
|---|---|
| 0x11 | 成员查询 (Membership Query) |
| 0x22 | 第3版成员报告 (Version 3 Membership Report) |
IGMPv3 的实现还必须支持以下三种消息类型, 以便与 IGMP 的早期版本互操作 (参见第7节):
| 类型编号 (十六进制) | 消息名称 | 参考文献 |
|---|---|---|
| 0x12 | 第1版成员报告 (Version 1 Membership Report) | [RFC-1112] |
| 0x16 | 第2版成员报告 (Version 2 Membership Report) | [RFC-2236] |
| 0x17 | 第2版离开组 (Version 2 Leave Group) | [RFC-2236] |
无法识别的消息类型必须被静默忽略. 其他消息类型可能由 IGMP 的更新版本或扩展、组播路由协议或其他用途使用.
在本文档中, 除非另有说明, 大写单词 "Query" 和 "Report" 分别指 IGMP 成员查询和 IGMP 第3版成员报告.
4.1. 成员查询消息
成员查询由 IP 组播路由器发送, 用于查询相邻接口的组播接收状态. 查询具有以下格式:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x11 | Max Resp Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Resv |S| QRV | QQIC | Number of Sources (N) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address [1] |
+- -+
| Source Address [2] |
+- . -+
. . .
. . .
+- -+
| Source Address [N] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4.1.1. Max Resp Code (最大响应代码)
Max Resp Code 字段指定在发送响应报告之前允许的最长时间. 实际允许的时间称为最大响应时间 (Max Resp Time), 以 1/10 秒为单位表示, 并按如下方式从 Max Resp Code 派生:
如果 Max Resp Code < 128, 则 Max Resp Time = Max Resp Code
如果 Max Resp Code >= 128, 则 Max Resp Code 表示浮点值如下:
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|1| exp | mant |
+-+-+-+-+-+-+-+-+
Max Resp Time = (mant | 0x10) << (exp + 3)
较小的 Max Resp Time 值允许 IGMPv3 路由器调整"离开延迟" (从最后一个主机离开组到路由协议被通知不再有成员之间的时间). 较大的值, 特别是在指数范围内, 允许调整网络上 IGMP 流量的突发性.
4.1.2. Checksum (校验和)
校验和是整个 IGMP 消息 (整个 IP 负载) 的反码和的 16 位反码. 在计算校验和时, 校验和字段设置为零. 在接收数据包时, 必须在处理数据包之前验证校验和. [RFC-1071]
4.1.3. Group Address (组地址)
在发送通用查询 (General Query) 时, 组地址字段设置为零; 在发送组特定查询 (Group-Specific Query) 或组和源特定查询 (Group-and-Source-Specific Query) 时, 设置为被查询的 IP 组播地址 (参见下面的第 4.1.9 节).
4.1.4. Resv (保留字段)
Resv 字段在传输时设置为零, 在接收时忽略.
4.1.5. S Flag (抑制路由器端处理标志)
当设置为 1 时, S 标志向任何接收的组播路由器指示它们应抑制在听到查询时执行的正常定时器更新. 但是, 它不会抑制查询者选举或路由器作为组成员可能需要执行的查询的正常"主机端"处理.
4.1.6. QRV (查询者的鲁棒性变量)
如果非零, QRV 字段包含查询者 (即查询的发送者) 使用的 [鲁棒性变量 (Robustness Variable)] 值. 如果查询者的 [鲁棒性变量] 超过 7 (QRV 字段的最大值), 则 QRV 设置为零. 路由器采用从最近接收的查询中获得的 QRV 值作为它们自己的 [鲁棒性变量] 值, 除非最近接收的 QRV 为零, 在这种情况下, 接收者使用第 8.1 节中指定的默认 [鲁棒性变量] 值或静态配置的值.
4.1.7. QQIC (查询者的查询间隔代码)
查询者的查询间隔代码字段指定查询者使用的 [查询间隔 (Query Interval)]. 实际间隔称为查询者的查询间隔 (QQI), 以秒为单位表示, 并按如下方式从查询者的查询间隔代码派生:
如果 QQIC < 128, 则 QQI = QQIC
如果 QQIC >= 128, 则 QQIC 表示浮点值如下:
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|1| exp | mant |
+-+-+-+-+-+-+-+-+
QQI = (mant | 0x10) << (exp + 3)
不是当前查询者的组播路由器采用从最近接收的查询中获得的 QQI 值作为它们自己的 [查询间隔] 值, 除非最近接收的 QQI 为零, 在这种情况下, 接收路由器使用第 8.2 节中指定的默认 [查询间隔] 值.
4.1.8. Number of Sources (N) (源数量)
源数量 (N) 字段指定查询中存在多少个源地址. 在通用查询或组特定查询中, 此数字为零; 在组和源特定查询中为非零. 此数字受传输查询的网络 MTU 的限制. 例如, 在 MTU 为 1500 字节的以太网上, 包括路由器警告选项的 IP 头部占用 24 字节, 包括源数量 (N) 字段在内的 IGMP 字段占用 12 字节, 剩下 1464 字节用于源地址, 这将源地址数量限制为 366 个 (1464/4).
4.1.9. Source Address [i] (源地址)
源地址 [i] 字段是一个包含 n 个 IP 单播地址的向量, 其中 n 是源数量 (N) 字段中的值.
4.1.10. Additional Data (附加数据)
如果接收到的查询的 IP 头部中的数据包长度字段指示除此处描述的字段之外还存在其他数据字节, IGMPv3 实现必须在计算中包括这些字节以验证接收到的 IGMP 校验和, 但必须忽略这些附加字节. 在发送查询时, IGMPv3 实现不得包括此处描述的字段之外的附加字节.
4.1.11. Query Variants (查询变体)
查询消息有三种变体:
-
"通用查询 (General Query)" 由组播路由器发送, 用于了解相邻接口的完整组播接收状态 (即, 连接到传输查询的网络的接口). 在通用查询中, 组地址字段和源数量 (N) 字段都为零.
-
"组特定查询 (Group-Specific Query)" 由组播路由器发送, 用于了解相邻接口相对于单个组播地址的接收状态. 在组特定查询中, 组地址字段包含感兴趣的组播地址, 源数量 (N) 字段包含零.
-
"组和源特定查询 (Group-and-Source-Specific Query)" 由组播路由器发送, 用于了解是否有任何相邻接口希望接收从指定源列表中的任何源发送到指定组播地址的数据包. 在组和源特定查询中, 组地址字段包含感兴趣的组播地址, 源地址 [i] 字段包含感兴趣的源地址.
4.1.12. IP Destination Addresses for Queries (查询的 IP 目标地址)
在 IGMPv3 中, 通用查询以 IP 目标地址 224.0.0.1 (全系统组播地址) 发送. 组特定查询和组和源特定查询以等于感兴趣的组播地址的 IP 目标地址发送. 但是, 系统必须接受和处理 IP 目标地址字段包含分配给查询到达的接口的任何地址 (单播或组播) 的任何查询.
4.2. 第3版成员报告消息
第3版成员报告由 IP 系统发送, 用于向相邻路由器报告其接口的当前组播接收状态或组播接收状态的变化. 报告具有以下格式:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0x22 | Reserved | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Number of Group Records (M) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Group Record [1] .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Group Record [2] .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| . |
. . .
| . |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Group Record [M] .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中每个组记录 (Group Record) 具有以下内部格式:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Record Type | Aux Data Len | Number of Sources (N) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Multicast Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address [1] |
+- -+
| Source Address [2] |
+- -+
. . .
. . .
. . .
+- -+
| Source Address [N] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Auxiliary Data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4.2.1. Reserved (保留字段)
保留字段在传输时设置为零, 在接收时忽略.
4.2.2. Checksum (校验和)
校验和是整个 IGMP 消息 (整个 IP 负载) 的反码和的 16 位反码. 在计算校验和时, 校验和字段设置为零. 在接收数据包时, 必须在处理消息之前验证校验和.
4.2.3. Number of Group Records (M) (组记录数量)
组记录数量 (M) 字段指定此报告中存在多少个组记录.
4.2.4. Group Record (组记录)
每个组记录是一个字段块, 包含与发送者在发送报告的接口上对单个组播组的成员关系有关的信息.
4.2.5. Record Type (记录类型)
参见下面的第 4.2.12 节.
4.2.6. Aux Data Len (辅助数据长度)
Aux Data Len 字段包含此组记录中辅助数据字段的长度, 以 32 位字为单位. 它可以包含零, 以指示不存在任何辅助数据.
4.2.7. Number of Sources (N) (源数量)
源数量 (N) 字段指定此组记录中存在多少个源地址.
4.2.8. Multicast Address (组播地址)
组播地址字段包含此组记录所涉及的 IP 组播地址.
4.2.9. Source Address [i] (源地址)
源地址 [i] 字段是一个包含 n 个 IP 单播地址的向量, 其中 n 是此记录的源数量 (N) 字段中的值.
4.2.10. Auxiliary Data (辅助数据)
辅助数据字段 (如果存在) 包含与此组记录有关的附加信息. 本文档中指定的协议 IGMPv3 不定义任何辅助数据. 因此, IGMPv3 的实现不得在任何传输的组记录中包含任何辅助数据 (即, 必须将 Aux Data Len 字段设置为零), 并且必须忽略任何接收的组记录中存在的任何辅助数据. 辅助数据字段的语义和内部编码将由使用此字段的 IGMP 的任何未来版本或扩展定义.
4.2.11. Additional Data (附加数据)
如果接收到的报告的 IP 头部中的数据包长度字段指示除最后一个组记录之外还存在其他数据字节, IGMPv3 实现必须在计算中包括这些字节以验证接收到的 IGMP 校验和, 但必须忽略这些附加字节. 在发送报告时, IGMPv3 实现不得包括最后一个组记录之外的附加字节.
4.2.12. Group Record Types (组记录类型)
报告消息中可以包含多种不同类型的组记录:
-
"当前状态记录 (Current-State Record)" 由系统在接口上接收到查询时发送. 它报告该接口相对于单个组播地址的当前接收状态. 当前状态记录的记录类型可以是以下两个值之一:
值 名称和含义 1 MODE_IS_INCLUDE - 表示接口对于指定的组播地址具有 INCLUDE 过滤模式. 如果非空, 此组记录中的源地址 [i] 字段包含接口对于指定组播地址的源列表. 2 MODE_IS_EXCLUDE - 表示接口对于指定的组播地址具有 EXCLUDE 过滤模式. 如果非空, 此组记录中的源地址 [i] 字段包含接口对于指定组播地址的源列表. -
"过滤模式变更记录 (Filter-Mode-Change Record)" 由系统在本地调用 IPMulticastListen 导致特定组播地址的接口级状态条目的过滤模式发生变化 (即, 从 INCLUDE 变为 EXCLUDE, 或从 EXCLUDE 变为 INCLUDE) 时发送. 该记录包含在从发生变化的接口发送的报告中. 过滤模式变更记录的记录类型可以是以下两个值之一:
值 名称和含义 3 CHANGE_TO_INCLUDE_MODE - 表示接口已更改为指定组播地址的 INCLUDE 过滤模式. 如果非空, 此组记录中的源地址 [i] 字段包含接口对于指定组播地址的新源列表. 4 CHANGE_TO_EXCLUDE_MODE - 表示接口已更改为指定组播地址的 EXCLUDE 过滤模式. 如果非空, 此组记录中的源地址 [i] 字段包含接口对于指定组播地址的新源列表. -
"源列表变更记录 (Source-List-Change Record)" 由系统在本地调用 IPMulticastListen 导致特定组播地址的接口级状态条目的源列表发生变化 (不伴随过滤模式变化) 时发送. 该记录包含在从发生变化的接口发送的报告中. 源列表变更记录的记录类型可以是以下两个值之一:
值 名称和含义 5 ALLOW_NEW_SOURCES - 表示此组记录中的源地址 [i] 字段包含系统希望接收的附加源列表, 用于发送到指定组播地址的数据包. 如果变化是对 INCLUDE 源列表的变化, 这些是添加到列表中的地址; 如果变化是对 EXCLUDE 源列表的变化, 这些是从列表中删除的地址. 6 BLOCK_OLD_SOURCES - 表示此组记录中的源地址 [i] 字段包含系统不再希望接收的源列表, 用于发送到指定组播地址的数据包. 如果变化是对 INCLUDE 源列表的变化, 这些是从列表中删除的地址; 如果变化是对 EXCLUDE 源列表的变化, 这些是添加到列表中的地址.
如果源列表的变化导致同时允许新源和阻止旧源, 则为同一组播地址发送两个组记录, 一个类型为 ALLOW_NEW_SOURCES, 一个类型为 BLOCK_OLD_SOURCES.
我们使用术语"状态变更记录 (State-Change Record)" 来指代过滤模式变更记录或源列表变更记录.
无法识别的记录类型值必须被静默忽略.
4.2.13. IP Source Addresses for Reports (报告的 IP 源地址)
IGMP 报告使用目标子网的有效 IP 源地址发送. 尚未获得 IP 地址的系统可以使用 0.0.0.0 源地址. 请注意, LAN 上的多个系统可能同时使用 0.0.0.0 源地址. 路由器必须接受源地址为 0.0.0.0 的报告.
4.2.14. IP Destination Addresses for Reports (报告的 IP 目标地址)
第3版报告以 IP 目标地址 224.0.0.22 发送, 所有支持 IGMPv3 的组播路由器都侦听该地址. 在第1版或第2版兼容模式下运行的系统将第1版或第2版报告发送到报告的组地址字段中指定的组播组. 此外, 系统必须接受和处理 IP 目标地址字段包含分配给报告到达的接口的任何地址 (单播或组播) 的任何第1版或第2版报告.
4.2.15. Notation for Group Records (组记录的符号表示)
在本文档的其余部分, 我们使用以下符号来描述与特定组播地址有关的组记录的内容:
IS_IN ( x ) - 类型 MODE_IS_INCLUDE, 源地址 x
IS_EX ( x ) - 类型 MODE_IS_EXCLUDE, 源地址 x
TO_IN ( x ) - 类型 CHANGE_TO_INCLUDE_MODE, 源地址 x
TO_EX ( x ) - 类型 CHANGE_TO_EXCLUDE_MODE, 源地址 x
ALLOW ( x ) - 类型 ALLOW_NEW_SOURCES, 源地址 x
BLOCK ( x ) - 类型 BLOCK_OLD_SOURCES, 源地址 x
其中 x 是:
-
一个大写字母 (例如, "A") 表示源地址集合, 或
-
一个集合表达式 (例如, "A+B"), 其中 "A+B" 表示集合 A 和 B 的并集, "A*B" 表示集合 A 和 B 的交集, "A-B" 表示从集合 A 中删除集合 B 的所有元素.
4.2.16. Membership Report Size (成员报告大小)
如果报告中所需的组记录集不适合单个报告消息的大小限制 (由将发送该报告的网络的 MTU 确定), 则组记录将在所需数量的报告消息中发送, 以报告整个集合.
如果单个组记录包含的源地址太多以至于不适合单个报告消息的大小限制, 如果其类型不是 MODE_IS_EXCLUDE 或 CHANGE_TO_EXCLUDE_MODE, 则将其拆分为多个组记录, 每个组记录包含源地址的不同子集, 并在单独的报告消息中发送. 如果其类型是 MODE_IS_EXCLUDE 或 CHANGE_TO_EXCLUDE_MODE, 则发送单个组记录, 包含尽可能多的源地址, 剩余的源地址不报告; 尽管要报告哪些源的选择是任意的, 但最好在每次后续报告中报告相同的源集, 而不是每次报告不同的源.