Skip to main content

IGMP

IGMP(Internet Group Management Protocol)因特网组管理协议,是TCP/IP协议族中负责IPv4组播成员管理的协议,用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。IGMP有三个版本,不同版本报文格式不一样。不同版本的IGMP协议,支持的IGMP消息也不同。

  • IGMPv1报文格式 IGMP有多个版本,其中IGMPv1版本是由RFC1112定义的。IGMPv1协议主要基于查询和响应机制完成组播组管理,支持查询和加入报文,处理过程与IGMPv2相同。IGMPv1与IGMPv2的不同之处是:主机离开组播组时不主动发送离开报文,收到查询消息后不反馈Report消息,待维护组成员关系的定时器超时后,路由器删除组记录。

  • IGMPv2报文格式 IGMP有多个版本,其中IGMPv2版本是由RFC2236定义的。运行IGMPv2的主机发送的IGMP报告中仅携带组信息。当主机发送一个组的IGMP加入报文给路由器后,路由器会通知组播转发模块,以便这个组的组播数据到来时能够正确转发给该主机。IGMPv2协议具有报告抑制机制,可以减少网络中的IGMP的重复报告。

  • IGMPv3成员查询消息 IGMP有多个版本,其中IGMPv3版本是由RFC3376定义的。运行IGMPv3的主机不仅能够选择组,还能根据需要选择组播源/组。主机发送的IGMPv3报文中可以包含多个组记录,每个组记录中可以包含多个组播源。IGMPv3包含查询消息和报告消息两种不同格式的报文。

  • IGMPv3成员报告消息 IGMPv3包含成员查询消息和成员报告消息两种不同格式的消息报文。成员报告消息是主机向组播路由器发送的报告消息,用报告加入某组播组并只接收由指定组播源发往该组的数据。

协议栈结构

IGMP消息封装在IP报文中。IP头部的Protocol字段值为0x02,用来标识数据部分封装了IGMP消息。

IGMP报文封装
+-------------------------------+
|             IGMP             |
+-------------------------------+
|     IP (Protocol = 0x02)     |
+-------------------------------+
|             L2               |
+-------------------------------+
|             L1               |
+-------------------------------+

IGMPv1报文格式

IGMP有多个版本,其中IGMPv1版本是由RFC1112定义的。IGMPv1协议主要基于查询和响应机制完成组播组管理,支持查询和加入报文,处理过程与IGMPv2相同。IGMPv1与IGMPv2的不同之处是:主机离开组播组时不主动发送离开报文,收到查询消息后不反馈Report消息,待维护组成员关系的定时器超时后,路由器删除组记录。

IGMPv1消息封装在IP报文中。IP头部的Protocol字段值为0x02,用来标识数据部分封装了IGMP消息。

IP报文头的目的地址字段用来标识该IGMP消息的目的接收端。IP报文头的TTL字段值为1,表示IGMP消息只在本地网段传播。

IGMPv1报文格式
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                         |
+---------------------------------------------------------------
IGMPv1报文字段解释
字段 长度 描述
Version 4比特 IGMP版本号,在IGMPv1中应为0x1。
Type 4比特 即IGMP报文类型: 1 = Host Membership Query 主机成员查询 2 = Host Membership Report 主机成员报告
Unused 8比特 未使用的字段,发送时必须填0,接收时忽略。
Checksum 16比特 IGMP消息的校验和。该字段在进行校验计算时设为0。当传送报文的时候,必须计算该校验字并插入到该字段中去。当接收包的时候,该校验字必须在处理该包之前进行检验。
Group Address 32比特 组播地址。

IGMPv2报文格式

IGMP有多个版本,其中IGMPv2版本是由RFC2236定义的。运行IGMPv2的主机发送的IGMP报告中仅携带组信息。当主机发送一个组的IGMP加入报文给路由器后,路由器会通知组播转发模块,以便这个组的组播数据到来时能够正确转发给该主机。IGMPv2协议具有报告抑制机制,可以减少网络中的IGMP的重复报告。

IGMPv2消息封装在IP报文中。IP头部的Protocol字段值为0x02,用来标识数据部分封装了IGMP消息。

IP报文头的目的地址字段用来标识该IGMP消息的目的接收端。IP报文头的TTL字段值为1,表示IGMP消息只在本地网段传播。

IGMPv2报文格式
 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     | Max Resp Time |           Checksum           |
+---------------------------------------------------------------
|                         Group Address                         |
+---------------------------------------------------------------
IGMPv2报文字段解释
字段 长度 描述
Type 8比特 报文类型,具体参见IGMP Type Code。在IGMP版本2中,旧的4位版本字段和旧的4位类型字段拼成了一个新的8位类型字段,通过分别将成员查询(版本1和版本2的)及版本1的成员报告报文的IGMP版本2的类型代码置为0x11和0x12,保持了IGMP版本1和版本2包格式的向后兼容。
Max Resp Time 8比特 在发出响应报告前的以1/10秒为单位的最长时间,缺省值为10秒。新的最大响应时间(以1/10秒为单位)字段允许查询用路由器为它的查询报文指定准确的查询间隔响应时间。IGMP版本2主机在随机选择它们的响应时间值时以此作为上限。这样在查询响应间隔时有助于控制响应的爆发。
Checksum 16比特 IGMP消息的校验和。传送报文时,必须计算校验和并填入该字段中;接收报文时,必须在处理报文之前检验校验和,以判断IGMP消息在传输过程中是否发生了错误。
Group Address 32比特 组播组地址(如果是通用查询则为0.0.0.0)。除了在通用查询时这一字段置为0.0.0.0外,这一字段和IGMP版本1中的这一字段意义相同。
IGMP Type Code
Type Name 说明
0x11 IGMP Membership Query IGMP查询消息
0x12 Version 1 Membership Report IGMPv1成员报告消息
0x16 Version 2 Membership Report IGMPv2成员报告消息
0x17 IGMPv2 Leave Group IGMPv2离组消息

IGMPv3成员查询消息

IGMP有多个版本,其中IGMPv3版本是由RFC3376定义的。运行IGMPv3的主机不仅能够选择组,还能根据需要选择组播源/组。主机发送的IGMPv3报文中可以包含多个组记录,每个组记录中可以包含多个组播源。IGMPv3包含查询消息和报告消息两种不同格式的报文。

查询报文格式

IGMPv3查询报文格式
  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)                     |
+---------------------------------------------------------------

查询消息有三种类型的变体:

  1. “普通查询”由多播路由器发出,用于获知邻接接口(即查询所传输的网络中所相连的接口)的完整的多播接收状态。在一个普通查询中,组地址字段和源数量(N)字段都为0。

  2. “指定组查询”由一台多播路由器发出,用于获知邻接接口中跟某一个IP地址相关的多播接收状态。在指定组查询中,“组地址”字段含有需要查询的那个组地址,源数量(N)字段为0。

  3. “指定组和源查询”由一台多播路由器发出,用于获知邻接接口是否需要接收来自指定的这些源的,发往指定组的多播数据报。在一个指定组和源的查询中,组地址字段含有要查询的多播地址,源地址[i]字段含有相关的源地址。

IGMPv3查询报文格式字段解释
字段 长度 描述
Type 8比特 成员关系查询 Type = 0x11。
Max Resp Code 8比特 设备接收到查询消息后发出响应报文的最大延迟时间,超过该时间没有发出响应报文,则查询设备认为此次查询超时,单位是1/10秒。
Checksum 16比特 IGMP消息的校验和。传送报文时,必须计算校验和并填入该字段中;接收报文时,必须在处理报文之前检验校验和,以判断IGMP消息在传输过程中是否发生了错误。
Group Address 32比特 对于普遍组查询消息,该字段置0。对于特定组查询消息、特定组/源查询消息,该字段为设置为欲查询的组播组的地址。
Resv 4比特 保留字段,发送报文时置0;接收到报文时,对该字段不做任何处理。
S 1比特 该比特位置1时,所有收到此查询消息的其他路由器不启动定时器刷新过程,但是此查询消息并不抑制查询器选举过程和路由器的主机侧处理过程。
QRV 3比特 查询者的健壮变量,如果不为0,QRV中包含中一个被查询者使用的[健壮变量]的值,如果查询者的健壮变量的值超过7,即QRV字段的最大值,那么QRV被设成0。路由器取最近收到的查询中的QRV值作为它们自己的健壮性变量的值,除非最近收到的QRV是0,在这种情况下,接收者使用缺省的健壮性变量值,或者是一个静态配置的值。
QQIC 8比特 查询器的查询间隔,单位是秒。非查询器收到查询报文时,如果发现该字段非0,则将自己的查询间隔参数调整为该字段的值。
Number of Sources (N) 16比特 消息中包含的组播源的数量。对于普遍组查询报文和特定组查询报文,该字段为0;对于特定组/源地址查询报文,该字段非0。此参数的大小受到所在网络MTU大小的限制。
Source Address [i] 32比特 组播源地址,其数量受到Number of Sources字段值大小的限制。

IGMPv3成员报告消息

IGMPv3包含成员查询消息和成员报告消息两种不同格式的消息报文。成员报告消息是主机向组播路由器发送的报告消息,用报告加入某组播组并只接收由指定组播源发往该组的数据。

IGMPv3成员报告消息封装在IP报文中。IP头部的Protocol字段值为0x02,用来标识数据部分封装了IGMP消息。

封装IGMPv3成员报告消息的IP报文头的目的地址字段为224.0.0.22,本地网段上的所有IGMPv3路由器都能识别并接收。

IGMPv3成员报告消息的格式
  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         |   Reserved   |           Checksum           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Reserved           | Number of Group Records (M) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                       Group Record (1)                       ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                       Group Record (2)                       ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                             ...                             :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                       Group Record (M)                       ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Group Record字段格式
   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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Record Type   | Aux Data Len | Number of Sources(N)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Multicast Address                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address (1)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address (2)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                               .                               :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address (M)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Auxiliary Data                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IGMPv3成员报告消息字段解释
字段 长度 描述
Type 8比特 Type = 0x22表示成员关系报告
Reserved 8比特 保留字段,在发送的时候是以0填充,在接收的时候是不作任何处理的。
Checksum 16比特 校验和是对整个IGMP消息以16位为一段进行取反求和。为了计算校验和,校验和字段首先必须被置0。当收到一个数据,在处理之前,必须先对校验和进行验证。
Reserved 16比特 T保留字段,在发送的时候是以0填充,在接收的时候是不作任何处理的。
Number of Group Records (M) 16比特 该字段表示该报告报文中包含有几个组记录。
Group Record 变长 一个主机可能需要点播多个组播地址的组播业务,每个记录包含了对应于其中一个组播地址的源地址列表等信息,它受到Number_of_Group_Records的大小的影响。每一个组记录字段是一整块数据,其含有的信息是关于发送者在报告发送接口上的某一个多播组的成员关系。
Record Type 8比特 Group Record消息的类型。详见IGMPv3 Record Type
Aux Data Len 8比特 辅助数据长度含有在组记录中的辅助数据的实际长度,其单位是32bit字。它有可能是0,这就表示辅助数据不存在。
Number of Sources (N) 16比特 源数量(N)字段标明在组记录中存在多少源地址。
Multicast Address 32比特 多播地址字段标明该组记录从属的多播IP地址。
Source Address [i] 32比特 源地址[i]字段是一个数组,含有n个单播地址。n就是该记录的源数量(N)字段的值。
Auxiliary Data 变长 附加数据。如果收到的报告中的IP首部的数据报长度字段标明在最后一个组记录后面有附加的数据存在。IGMPv3的实现必须在计算和验证校验和的时候包含这些附加数据,但是同时必须忽略这些附加数据。当发送一个报告时,一个IGMPv3的实现在最后一个组记录后面不能包含附加数据。
IGMPv3 Record Type
Value Type 说明
1 MODE_IS_INCLUDE 接收源地址列表包含的源发往该组的组播数据。如果指定源地址列表为空,该消息为无效消息。
2 MODE_IS_EXCLUDE 不接收源地址列表包含的源发往该组的组播数据。
3 CHANGE_TO_INCLUDE_MODE 过滤模式由EXCLUDE转换到INCLUDE,接收源地址列表包含的新组播源发往该组播组的数据。如果指定源地址列表为空,主机离开组播组。
4 CHANGE_TO_EXCLUDE_MODE 过滤模式由INCLUDE转换到EXCLUDE,拒绝源地址列表中新组播源发往该组的组播数据。
5 ALLOW_NEW_SOURCES 表示在现有的基础上,需要接收源地址列表包含的源发往该组播组的组播数据。如果当前对应关系为INCLUDE,则向现有源列表中添加这些组播源;如果当前对应关系为EXCLUDE,则从现有阻塞源列表中删除这些组播源。
6 BLOCK_OLD_SOURCES 表示在现有的基础上,不再接收从源地址列表包含的源组播源发往该组播组的组播数据。如果当前对应关系为INCLUDE,则从现有源列表中删除这些组播源;如果当前对应关系为EXCLUDE,则向现有源列表中添加这些组播源。

参考标准

标准 描述
RFC 1112 Host extensions for IP multicasting
RFC 2236 Internet Group Management Protocol, Version 2
RFC 3376 Internet Group Management Protocol, Version 3
IANA协议注册表 Internet Group Management Protocol (IGMP) Type Numbers