IGMP协议

  IGMP 是Internet Group Management Protocol(互联网组管理协议)的简称。它是TCP/IP 协议族中负责IP 组播成员管理的协议,用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。
  IGMP协议(IPv4) 和MLD协议(IPv6)用来帮助主机指定对那些组感兴趣(加入哪一些多播组),以及确定来自某些特定源的报文应该被接收还是过滤掉。为了实现这一目标,主机需要向本地子网的组播路由器发送一些报文来向组播路由器交互一些多播成员关系管理的信息。
  IGMP协议到目前已经有三个版本。
+ IGMPv1(由RFC 1112 定义)
+ IGMPv2(由RFC 2236 定义)
+ IGMPv3(由RFC 3376 定义)

1. 报文

  IGMP协议涉及到2种报文,
+ 查询报文
+ 报告报文(包括加入报文和离开报文)
  IGMP协议报文的具体格式,与IGMP版本有关,不同的版本格式也会不一样。
  IGMP在IP层是分装成IP数据报进行传输的。IGMPv1和IGMPv2报文具有固定长度8字节。IGMPv3查询报文和报告报文不一样,且报文没有固定长度(因为要包含指定源地址)

(1) IGMPv1报文 与 IGMPv2 报文

IGMPv1报文首部
这里写图片描述
IGMPv2报文首部:
这里写图片描述
  IGMPv2报文首部兼容IGMPv1报文首部
* Type:*
0x11-成员查询;
0x12-IGMPv1成员报告;
0x16-IGMPv2成员报告
0x17-IGMPv2成员离开。
* Max Rsp Code:*
最大响应时间,缺省10s(以0.1s为单位)
* Checksum:*
校验和
* Group Address: *
组播组地址
IGMPv2普通查询:组地址为0.0.0.0,目的地址为224.0.0.1
IGMPv2特定组查询:组地址和目的地址为要查询的特定组地址
IGMPv2成员报告:组地址和目的地址为要报告的组地址
IGMPv2离开报文:组地址为要离开的组地址,目的地址为224.0.0.2

(2) IGMPv3 查询报文

IGMP协议_第1张图片
* Type:* 0x11 表示成员关系查询报文
Max Rsp Code:最大响应代码
S标志:(禁止路由器处理),禁止任何接收路由器更新它们在收到查询时要更新 的那些 定时器(通常设为0)
QRV:查询者健壮变量(<=7)
QQIC:查询者查询间隔代码
注:
IGMPv3普通查询源地址和组地址为0.0.0.0,目的地址为224.0.0.1
IGMPv3特定组查询源为0.0.0.0 ,组地址和目的地址为为查询组组地址。
IGMPv3特定组和源查询组地址和目的地址为查询组地址,源地址含有指定源地址。

(3) IGMPv3 报告报文

IGMP协议_第2张图片

  IGMPv3的报告报文兼容IGMPv1、和IGMPv2的报告报文。
Type: 报告类型:
0x22-V3成员报告
0x12-V1成员报告
0x16-V2成员报告
0x17-V2离开报告
Reserved: 保留
CheckSum: 检验和
Reserved: 保留
* Num of Grp Records:* 多播组记录的数目。
* Group Record:* 多播组记录,其格式如下所示:
IGMP协议_第3张图片
Records Type: 记录类型

Record Type 名称 含义 何时发送
0x01 IS_IN MODE_IS_INCLUDE:来自相关源地址的报文不应该被过滤掉 用于应答多播路由器的查询报文
0x02 IS_EX MODE_IS_EXCLUDE:来自相关源地址的报文应该被过滤掉 用于应答多播路由器的查询报文
0x03 TO_IN CHANGE_TO_INCLUDE_MODE:来自相关源地址的报文不应该被过滤掉 本地应用程序过滤状态发生变化
0x04 TO_EX CHANGE_TO_EXCLUDE_MODE:来自相关源地址的报文应该被过滤掉 本地应用程序过滤状态发生变化
0x05 ALLOW ALLOW_NEW_SOURCES:来自相关源地址的报文不应该被过滤掉 多播源地址列表发生变化
0x06 BLOCK BLOCK_OLD_SOURCES:来自相关源地址的报文应该被过滤掉 多播源地址列表发生变化

  我们可以看到 Record Type为 0x01、0x02时,记录表示的是一种当前的状态,即主机当前对某种组播感兴趣;0x03、0x04主要是翻译了对某种组播是否感兴趣的状态发生的变化;0x05,0x06则是表示源地址列表发生了变化。
  我们知道,多播路由器会定时发送查询报文,这是主机在应答时发送的报告报文的记录类型就是0x01、0x02这两种记录。 如果主机因自身对多播组的兴趣发生变话,而主动发送报告报文,那么报文的记录类型就是0x03、0x04、0x05、0x06这几种,具体是哪一种取决于主机对多播组的兴趣发生了怎么样的变化。

Aux Data Type:辅助数据类型
Num of Sources: 多播源地址列表的数据。
Multicast Address: 多播组地址
Sources Address: 多播源地址列表
Auxiliary Data:辅助数据

2. 轻量级IGMPv3

  在前面介绍IGMPv3的报文时,在Group Record时,可以看到,Record Type有许多中类型,IS_IN、IS_EX、TO_IN、TO_EX、ALLOW、BLOCK。这里我们关注下IS_IN、IS_EX、TO_IN、TO_EX这四种Mode(其实是两对)。我们先看IS_IN、IS_EX这一对模式,它们分别表示有主机针对某个组播来自特定源的流量感兴趣,以及本地子网对某个组播来自特定源的流量不感兴趣。事实上,任何可以用IS_EX组播表示的成员关系,也都可以用对应的IS_IN表示。 比如:IS_EX(ALL)相当于IS_IN(NULL), IS_EX(NULL)相当于IS_IN(ALL), IS_EX(src1,src2)相当于IS_IN(src3,src4…)。同理,所有能以TO_EX表示的成员关系,可以都可以用TO_IN表示。
  出于上面的结论,为了使得IGMPv3更加简洁易用,轻量级的IGMPv3遍出现了。首先,IGMPv3应该支持ASM和SSM。先考虑SSM的情况,我们如果要指定组播源,那么这个组播源大多数情况下是属于全体组播源中的少数,所以在指定组播源时,轻量级的IGMPv3不再使用IS_EX(a,b,c…)和TO_EX(a,b,c…), 而都用IS_IN和TO_IN表示。在考虑ASM的情况,由于不指定组播源,如果我们使用IS_IN和TO_IN,那要包含所有的组播源,这样就会导致Report消息太繁重。因此,我们仍然支持IS_EX(NULL)和TO_EX(NULL)来表示ASM。

你可能感兴趣的:(计算机网络)