因特网组管理协议

互联网组管理协定（Internet Group Management Protocol，缩写：IGMP）是用于管理网路协议多播组成员的一种通信协议。IP主机和相邻的路由器利用IGMP来建立多播组的组成员。像ICMP用于单播连接一样，IGMP也是IP多播说明的一个完整部分。IGMP为互联网协定的一种，属于开放系统连结（OSI）模组的第三层协定，IP主机用它将主机的多点传送成员人数报告给临近的多点传送路由器。

## IGMP版本0

### RFC 966，16页：

因特网组管理协议（IGMP）被用在IP主机和它们即时相邻多播代理之间，用以支持临时组地址的分配和组成员的添加删除。

### RFC 988，1，2，3页

IP多点广播定义为一个去往主机群IP数据的传输，有零个或多个主机组成的主机群通过单个IP目的地址标识。一个多点播送数据报被投递给它的目的主机群的所有成员，具有和常规单路传送IP数据报同样的“尽力”安全性，那就是说该数据报不保证达到目的地组的所有成员，或者不和其他数据报具有相同的顺序。主机组的成员数是动态的；也就是说，主机随时可以参加和离开组。没有对主机组中的成员的数目或地点加以限制，但是成员仅限于那些拥有专用的接入密码的主机。一个主机可能同时是多个组的成员。一个主机即使不是一个组的成员也可以给它发送数据报。主机组可能永久性或暂时性的。永久性组具有一个众所周知的，官方分配的IP地址。它是地址，非该组的成员，也就是说永久性；任何时间，一个永久性组也许有许多成员，甚至可能有零个成员。另一方面，临时性的组，当有一个主机的请求创建时被动态地指派一个地址。当它的成员数降至零，临时性的组要解散时，它的地址可以重新分配。

临时组的创建和组员身份信息的维护是多播代理（存在于因特网网关或其他专用的主机内的实体）的职责。至少有一个多播代理直接与每个支持IP多点广播的IP网络或子网相连。主机通过用邻机代理交换报文来请求新建一个组、加入或离开现有组。多播代理还担负多点播送IP数据报的互连网络运送工作。发送一个多点播送IP数据报时，主机将它传送到一个局域网多播地址那里，哪些地址标识目的地主机组的所有邻机成员。如果该组具有在其他网络的成员，多播代理成为本地多播的辅助接收器并且通过因特网网关系统中继该数据报给其他网络上的代理。最后，另一个网络上的代理将数据报作为一个本地的多播传送给他们自己目的组的邻机成员。

### 2级：充分支持IP多点广播。

2级容许一个主机去创建、加入和离开主机组，以及给主机组发送IP数据报。它要求在主机内部实现IGMP并且扩展IP和局域网服务接口。本备忘录以下的所有部分可适用于实现2级。

### RFC 988，10页：

IP模块内部，成员资格管理操作通过IGMP支持，这在附录I.中规定。也使报文与每一上面规定的操作相对应，IGMP还规定一个“deadman timer”程序借此主机定期用多播代理确认它们的组员资格。

IP模块必须维护一个数据结构，该数据结构列出主机当前所属的所有主机组的IP地址、以及每个组的回送策略、存取关键字和时间变量。这个数据结构被用于IP多址通信传输服务，了解哪些输出数据报给回送，通过接收服务了解哪些入局数据报去接受。IGMP和管理接口操作的用途是维护这个数据结构。

### RFC 988，13页：

IGMP被用在IP主机和它们的紧接的邻机多点播送代理之间支持临时组的生成，添加和删除一个组的成员，定期证实组员身份。IGMP是一个不对称协议而且这里从一个主机观点而非一个多播代理来加以说明。

像ICMP（因特网控制报文协议）一样，IGMP是一个IP的组成部分。它要求通过所有主机对应的2级IP多点广播规范完全地实现。IGMP报文被压缩在IP数据报中，具有一个IP协议号码2。所有IGMP报文具有以下格式：

字节0｜字节1｜字节2｜字节3

0~15字节｜Type｜Code｜Checksum

16~31字节｜Identifier

32~47字节｜Group Address

48~79字节｜Access Key

Type，8位，代表报文的类型：

- 1：创建组要求
- 2：创建组应答
- 3：加入组要求
- 4：加入组应答
- 5：离开组要求
- 6：离开组应答
- 7：确认组要求
- 8：确认组应答

Code，8位，在一个创建组请求消息中代码字段指出新的主机组将是公共的或私有的：

- 0：公共
- 1：私有

在一个回答信息中，代码字段规定要求的结果

- 0：请求答应
- 1：要求被拒绝，无资源
- 2：要求被拒绝，无效代码
- 3：要求被拒绝，无效组地址
- 4：要求被拒绝，无效存取关键字
- 5-255：要求挂起，几秒后重试

IGMP Checksum，16位，校验和是从IGMP类型开始的IGMP报文中16位二进制反码和的16位二进制反码值。为了计算该校验和，校验和域应该为零。在数据包传输过程中，校验和被计算出来并插入域中。当收到数据包的时候，校验和再次被计算并相对于校验和域进行验证。当两个校验和不匹配时即发生错误。

Identifier，32位，在一个确认组请求消息中，标识符字段包含零。在所有其他的请求消息中，标识符域包含一个值以便将来自同一个主机的其他要求与该要求区别开来。在一个回答信息中，标识符域包含与在对应请求消息中同样的值。

Group Address，32位

- 在一个组创建请求报文中，组地址字段包含零。在所有其他的请求消息中，组地址域包含一个主机组地址。
- 在一个组创建应答报文中，组地址域或包含新的指定的主机组地址（如果该要求被允许）或包含零（如果被拒绝）。在所有其他的应答报文中，组地址域包含与在对应请求报文中同样的主机组地址。

Access Key，64位，在一个组创建请求报文中，存取关键字字段包含零。在所有其他的请求消息中，存取关键字域包含分配给主机组在组地址域识别的存取关键字（零对于公共的组）。在一个组创建应答报文中，存取关键字域或包含一个非零的64比特编号（如果要求一个私有组被允许）或包含零。在所有其他的应答报文中，存取关键字域包含与在对应要求中相同存取关键字。

## IGMP版本1

### RFC1054，10-13页

因特网组管理协议（IGMP v0）被IP主机用来向任何即时相邻多播路由器报告它们的组成员关系。IGMP是一个不对称协议，在此处从一个主机而不是从一个路由器的观点进行说明。（IGMP也能对称或不对称地被用于多播路由器之间）

像ICMP一样，IGMP是IP的一个整体部分。它要求通过所有主机对应的2级IP多点广播规范完全地实现。IGMP报文被压缩在IP数据报中，具有一个IP协议号码2。此备忘录详细说明了IGMP的版本1。

非正式协议描述。多播路由器发送主机成员关系查询信息（下文中称为查询）来发现在哪些主机组在它们附属的本地网络上有成员。查询被写入所有主机组地址（地址是224.0.0.1），携带的IP生存时间是1。

主机通过产生主机成员关系报告（下文中称为报告）来响应一个查询。报告各个主机组到它们所属的收到查询的用户接口。为了避免并发报告产生“内爆”，同时也减少所传输的报告总数，采用了以下两种技术:

- 当一台主机收到一个查询时，它并不是马上发送报告，而是为传入查询的网络接口上每个它的组成员关系启动一个报告延迟时间。每个时间是在0-D秒随机选择的不同的值。当一个时间截止时，就为相应的主机组产生一个报告。因此，报告散布在一个D秒区间内而不是全部立刻发生。
- 一个报告伴随一个与主机组地址等价的IP目的地址被发送，IP生存时间是1，所以，同一个网络上同一个组的其他成员可以侦听报告。如果一台主机听到网络上同组的一个报告，就停止自己对该组的计时并且不会向该组产生报告。因而，在正常情况下，在网络上各组仅会由定时器截止最快的主机产生一个报告。注意到多播路由器收到所有的IP多播数据报，因此不需要明确注明地址。另外还要注意到路由器需要知道哪些主机属于同一个组，除非在一个特殊网络上至少一个主机属于一个组。

以上描述的还有两个例外:首先，当收到一个查询时，如果一个报告的延迟定时器已经开始计时，那个定时器不会被复位成一个新的随机值，而是按其当前值继续计时。第二，不会为全主机组（224.0.0.1）中的一个主机成员关系设置报告延迟定时器，该成员关系不会被报告。

如果一台主机使用一个伪随机数生成器来计算报告延迟，主机自己的一个专用IP地址应该被用作生成的一部分，以避免多个主机产生同样延迟顺序的几率。

一台主机应该确认一个收到的报告在其IP目的域和IGMP组地址域有同样的IP主机组地址，以确保该主机自己的报告不会被一个错误接收的报告取消。主机应当放弃除了主机成员关系查询（Host Membership Query）或主机成员关系报告（Host Membership Report）之外任何形式的IGMP消息。

多播路由器定期发送查询以刷新当前特定网络上的成员信息。如果在一些查询之后没有收到一个特定组的报告，路由器就假定这个组没有本地成员并且他们不需要为本地网络上的组正向远程的多播。查询通常不是被频繁发送的（每分钟少于一次），以保持主机和网络上的IGMP额外开销很低。尽管如此，当一个多播路由器启动时，它也许会发出一些密集的查询以便于快速建立其对于本地成员关系的信息获取。

当一台主机加入到一个新的组时，它应当立即对该组发送一个报告，而不是等待一个查询，以防它正好是网络上该组的第一个成员。为避免初始化报告丢失和损坏，建议此报告在短延时后重复1到2次。一个简单的实现方法就是假设收到一个仅面向该组的查询，设置该组的随机报告延迟定时器。

### RFC 1054，16，17页

主机组地址分配:组地址捆绑将IP主机组地址捆绑到物理主机上被认为和IP单播地址捆绑类似。一个IP单播地址被静态捆绑到一个单IP网络上的单个本地网络接口。一个IP主机组地址是被动态捆绑到一个IP网络组上的本地网络组。

理解IP主机组地址并非捆绑到一个IP单播地址组非常重要。多播路由器不需要维持各个主机组独立成员的列表。例如，一个连接到Ethernet的多播路由器仅需把一个Ethernet多播地址和各个有本地成员的主机组联系起来，而不是一个独立IP成员或Ethernet地址的列表。

### RFC 1112，第3页

主机组地址主机组由D类IP地址标记，即高四位为“1110”的那些IP地址。E类IP地址，即那些高四位为“1111”的IP地址，是为了将来的编址方式而保留的。在Internet标准的点分十进制表示中，主机组地址的范围是从224.0.0.0到239.255.255.255。地址224.0.0.0被保证不分配给任何组，224.0.0.1被分配所有IP主机的永久组（包括网关）。它被用于标记在直接相连的网络中所有多播主机。没有多播地址（或其它IP地址）用来标记Internet上的所有主机。其它众所周知的地址、永久组将在“已分配编号”（Assigned Numbers）文档中公布。

### RFC 1112，11页：

Internet组管理协议（IGMP）用于IP主机向所有紧邻的多播路由器报告它们的主机组成员关系。IGMP是不对称的协议，将从主机的视角而不是从多播路由器的视角描述它。（IGMP也可以在多播路由器之间对称或非对称的使用。这样的用法这里没有指定。）像ICMP一样，IGMP是IP的一个组成部分。要在所有符合IP多播规范的2级主机上实现。IGMP报文封装在IP数据报中，数据报的IP协议字段为2。

### RFC 1122，47页：

IGMPRFC 1112是一个用于在单个网络上特定多播组中主机和网关间建立主机成员关系的协议。网关在连接一个多播路由协义时使用此信息以支持通过Internet的IP多播。

此刻，IGMP的实现是可选的，没有IGMP，一台主机仍然能参与它所在网络的本地多播。

### RFC 1122，67，68页：

主机应当支持全连接网络上的本地IP多播，为此声明从D类IP地址到链路层的地址映射（见下文）。对本地IP多播的支持包括发送多播数据报、加入多播组、接收多播数据报和离开多播组。这必须支持RFC 1112中除了IGMP协议自身之外的所有，这也是可选的。

IGMP提供容许带有信息需求的多播路由的网关，以支持复合网络上的IP多播。此时，多播路由网关处于试验性阶段并没有广泛应用。因为主机没有通过多播路由网关连接到网络上，或者不需要接收来自其他网络的多播数据报，IGMP服务没有目的性，因此目前IGMP是任选的。尽管如此，RFC 1112的其他部分在当前被建议作为一个更好的本地广播地址的选择用于提供IP层接入的本地网络多播地址。希望当多播路由网关广泛使用的时候，在将来的数据中建议使用IGMP。

如果IGMP无法实现，主机应当在IP层被初始化且激活时只有一个成员时仍然加入全主机（all-host）组（224.0.0.1）。

加入全主机（all-host）组将严格支持多播的本地使用，例如网关探测协议，甚至在IGMP无法实现的时候也是这样。

当前为如下类型的网络做了D类IP地址到本地网络映射的说明：

- Ethernet/IEEE 802.3
- 任何支持广播但不是多播的网络，编址：所有D类IP地址映射到本地广播地址。
- 任何类型的点对点链接（例如SLIP或HDLC链接）：无需映射，所有IP多播数据报按现状在本地帧中发送

其他类型网络的映射会在将来说明。主机应当为高层协议或应用提供一种决定哪种主机连接网络支持IP多播编址的方法。

### RFC 1812，84页：

IGMP是一种用于在单个物理网络上主机和多播路由器之间建立特定多播组内主机成员关系的协议。多播路由器在通过多播路由协议连接时使用此信息，以支持Internet上的正向IP多播。路由器应当实现IGMP的多播路由器部分。

## IGMP版本2

### RFC 2236，1，2页：

IGMPv2允许组成员关系的终止被迅速报告给路由协议，这一点在高带宽多播组以及易失性组成员关系的子网中很重要。

像ICMP一样，IGMP是IP的一个完整部分。它要求在所有希望接收IP多播的主机上实现。IGMP消息封装在IP数据报中，其IP的协议号为2。所有在该文档中说明了的IGMP消息均会用TTL为1进行传递，并在IP头中包括了IP路由检测选项。

### RFC 2113，第2页：

路由器警告选项语义是“路由器应该更仔细地检查这个包”。通过在其协议消息的IP头里包含路由器警告选项，RSVP能在对普通数据包的推进有少量或没有性能损失的情况下来截取消息。

### RFC 2236，4，5页：

多播路由器使用IGMP（v2）获知哪些组在其附属物理网络上有成员。多播路由器保留一个包括各附属网络多播组成员关系和各成员关系计时器的列表。多播组成员关系意味着在一个给定附属网络上至少出现一个多播组的一个成员，而不是所有成员的列表。当主机收到一个通用查询时，将为各个组（不包括全系统组）设置延迟计时器，该组就是收到查询的界面的一个成员。

当路由器接收到了报告，它就会把该组报告加入到一个组播组成员列表中，并且会为其成员关系设一个值为组成员生存周期的计时器。当一个主机加入了一个组播组，则应该立即发送一个非请求的版本2的成员关系报告给组，以防它是网络上该组的第一个成员。

当一主机离开一个组播组，如果它是最后一个主机，除它外没有其他的机器来报告成员关系了，则它应该发送一条离开组的消息给所有路由器，地址为组播组（224.0.0.2）。

## IGMP版本3

RFC 3376