目录
1. IGMP简介
IGMP(Internet组管理协议)是一种用于管理多播组的协议,它允许主机和路由器在网络中注册加入或离开多播组,并帮助路由器确定哪些主机应该接收特定的多播流。IGMP是在IP协议的基础上工作的,它使用IP协议中的一些字段来实现多播组的管理。IGMP主要用于局域网的多播传输。
IGMP协议有三个版本:IGMPv1、IGMPv2和IGMPv3。
IGMPv1是最早的IGMP协议版本,它只支持主机加入多播组,而不支持离开多播组。IGMPv1报文中只有一个操作类型字段,用于指示主机加入多播组。
IGMPv2是在IGMPv1的基础上进行了改进,它支持主机加入和离开多播组。IGMPv2报文中增加了一个操作类型字段,用于指示主机离开多播组。此外,IGMPv2还引入了组播组查询报文(IGMP Query Message),用于路由器查询网络中的主机是否仍然对某个多播组感兴趣。
IGMPv3是最新的IGMP协议版本,它在IGMPv2的基础上进一步提升了多播组管理的能力。IGMPv3支持源地址过滤和组地址过滤,可以让主机只接收特定源地址或特定组地址的多播流。此外,IGMPv3还引入了多播组和源地址查询报文(IGMPv3 Query Message),用于在网络中查询特定多播组或源地址的成员信息。
IGMP以太网帧格式
图 1 IGMP以太网帧
IGMP协议数据IP子协议,IP子协议号位2。
2.IGMPv1协议
2.1IGMPv1首部
图 2 IGMPv1首部格式
IGMP版本:4比特,固定1,说明IGMP所用版本。
IGMP类型:4比特
0x1:表示普遍组查询报文 。
0x2:表示成员报告报文 。
未使用: 1字节,发送时设置位0,接收时忽略。
校验和:2字节,校验和数据覆盖首部和数据部分,校验和计算方法可以参考我的其他文章。
组播地址:4字节,查询报文该字段为0,报告报文该字段为加入的组播组地址。
2.2 IGMPv1工作原理
图 3 IGMPv1工作原理
- 组成员加入
主机通过IGMPv1报告报文报告组播路由器加入组播组,组播路由器收到报告报文后,会生成对应的组播路由表项。组播源向该组播组发送数据时,组播路由器会查询组播路由表项,将数据转发至主机所在网段。
- 组成员离开
IGMPv1没有定义离开报文,只能通过查询报文确认主机是否离开组播组,组播路由器发送查询报文至该网段,已离开组播组的主机将不会响应报告报文,如果该网段存在未离开组播组的主机,该主机将会响应报告报文至组播路由器,组播路由器收到报告报文后,不会删除组播路由表项。当该网段所有组播成员都离开组播组,组播路由器将删除组播路由表项。
2.3 IGMPv1报文
IGMPv1查询报文
图 4 IGMPv1查询报文
IGMPv1报告报文
图 5 IGMPv1报告报文
3.IGMPv2协议
3.1 IGMPv2首部
图 6 IGMPv2首部格式
类型:1字节,报文类型,有以下几种类型
0x11:表示查询报文,包括普遍组查询报文和特定组查询报文。
0x12:表示IGMPv1成员报告报文。
0x16:表示IGMPv2成员报告报文。
0x17:表示成员离开报文。
最大响应时间:1字节,指定发送方等待响应的最大时间,单位为 1/10 秒。
校验和:2字节,校验和数据覆盖首部和数据部分。
组播地址:4字节,组播组地址
- 普遍查询报文为0。
- 特定组查询报文为查询组播组地址。
- 成员加入和离开报文为加入和离开组播组地址。
3.2 IGMPv2工作原理
图 6 IGMPv2工作原理
- 组成员加入
主机通过IGMPv2报告报文报告组播路由器加入组播组,组播路由器收到报告报文后,会生成对应的组播路由表项,组播源向该组播组发送数据时,组播路由器会查询组播路由表项,将数据转发至主机所在网段,组播成员就能收到组播数据。
- 组成员离开
IGMPv2定义了离开报文,如果组播成员需要离开组播组,会发送IGMPv2离开报文至组播路由器,组播路由器收到离开报文后,会定时的发送查询报文至组成员所在网段,如果该网段内已经没有组成员,组播路由器将不会再收到报告报文,组播路由器将删除组播路由表项。该网段内还有其他组成员,组播路由器将收到其他组成员的报告报文,组播路由器维持原来状态。
3.3 IGMPv2报文
IGMPv2查询报文
图 7 IGMPv2查询报文
IGMPv2报告报文
图 8 IGMPv2报告报文
IGMPv2离开报文
图 9 IGMPv2离开报文
4.IGMPv3协议
4.1 IGMPv3首部
4.1.1 IGMPv3查询报文首部
图 10 IGMPv3查询报文首部
类型:1字节,0x11:表示查询报文。
最大响应时间:1字节,指定发送方等待响应的最大时间,单位为 1/10 秒。
校验和:2字节,校验和数据覆盖首部和数据部分。
组播地址:4字节,组播组地址
- 普遍查询报文为0。
- 特定组查询报文为查询组播组地址。
保留字段:4比特,发送报文该字段为0。
标志位(S):1比特,表示是否启用抑制机制。
标志位(QRV): 3比特,表示查询器的健壮性。
查询间隔(QQIC):1字节,查询间隔时间,单位为秒。
组播源数量:1字节,主播源地址数量。
源地址列表:由多个源地址组成,一个源地址4字节。
4.1.2 IGMPv3报告报文首部
图 11 IGMPv3报告报文首部
类型:1字节,0x22:报告报文。
保留:1字节,发送报文该字段为0,接收报文忽略。
校验和:2字节,校验和数据覆盖首部和数据部分。
保留:2字节,发送报文该字段为0,接收报文忽略。
组记录个数:2字节,报文中包含组记录数量。
组记录列表:包含一些列组记录。
组记录格式:
组记录类型:1字节,组记有以下几种类型
- 当前状态报告,有两种模式:MODE_IS_INCLUDE,MODE_IS_EXCLUDE。
- 过滤模式改变报告,有两种模式:CHANGE_TO_INCLUDE_MODE,CHANGE_TO_EXCLUDE_MODE。
- 源列表改变报告,有两种模式:ALLOW_NEW_SOURCES,BLOCK_OLD_SOURCES。
辅助数据长度:1字节,该字段为0。
源地址数量:2字节,本记录中包含源地址数量。
组播组地址:4字节,组播组地址。
组播源地址列表:每个组播源地址4字节。
辅助数据:IGMPv3报文中不存在辅助数据 。
4.2 IGMPv3工作原理
图 12 IGMPv3工作原理
- 组成员加入
IGMPv3加入组播组流程和IGMPv2类似,IGMPv3加入组播组同样时采用IGMPv3报告报文。IGMPv3报告报文既能指定想要加入的组播组,也能指定想要接收的组播源,这样IGMPv3就能很好的支持指定源组播(SSM)。IGMPv3报告报文可以携带多个组播组信息,可以减少报文数据量。
- 组成员离开
IGMPv3离开组播组流程和IGMPv2类似,IGMPv3没有定义专门的离开报文,离开报文通过报告报文来实现,通过设置记录类型(Record Type)来离开组播组。
- 组成员查询
IGMPv3查询报文包含普遍组查询报文和特定组查询报文。普通组查询报文和IGMPv2类似,特定组查询通过报文中的携带组播源地址来完成,用于查询组成员是否愿意接收特定组播源数据。
4.3 IGMPv3报文
IGMPv3查询报文
图 13 IGMPv3查询报文
IGMPv3报告报文
图 14 IGMPv3报告报文
5.IGMP不同版本对比
图 15 IGMP不同版本对比