标题：Internet组管理协议
IGMP
IGMP：Internet Group Management Protocol (Internet组管理协议)
协议简介
Internet 组管理协议（IGMP）是因特网协议家族中的一个组播协议，用于 IP 主机向任一个直接相邻的路由器报告他们的组成员情况。IGMP 信息封装在 IP 报文中，其 IP 的协议号为 2。
它用来在ip主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。igmp不包括组播路由器之间的组成员关系信息的传播与维护，这部分工作由各组播路由协议完成。所有参与组播的主机必须实现igmp。
参与ip组播的主机可以在任意位置、任意时间、成员总数不受限制地加入或退出组播组。组播路由器不需要也不可能保存所有主机的成员关系，它只是通过igmp协议了解每个接口连接的网段上是否存在某个组播组的接收者，即组成员。而主机方只需要保存自己加入了哪些组播组。
igmp在主机与路由器之间是不对称的：主机需要响应组播路由器的igmp查询报文，即以igmp membership report报文响应；路由器周期性发送成员资格查询报文，然后根据收到的响应报文确定某个特定组在自己所在子网上是否有主机加入，并且当收到主机的退出组的报告时，发出特定组的查询报文（igmp版本2），以确定某个特定组是否已无成员存在。
协议版本
IGMP 具有三种版本，即 IGMP v1、v2 和 v3。
IGMPv1： 主机可以加入组播组。没有离开信息（leave messages）。路由器使用基于超时的机制去发现其成员不关注的组。 
IGMPv2： 该协议包含了离开信息，允许迅速向路由协议报告组成员终止情况，这对高带宽组播组或易变型组播组成员而言是非常重要的。 
IGMPv3： 与以上两种协议相比，该协议的主要改动为：允许主机指定它要接收通信流量的主机对象。来自网络中其它主机的流量是被隔离的。IGMPv3 也支持主机阻止那些来自于非要求的主机发送的网络数据包。
协议变种
IGMP 协议变种有： 
距离矢量组播路由选择协议（DVMRP： Distance Vector Multicast Routing Protocol） 
IGMP 用户认证协议 （IGAP： IGMP for user Authentication Protocol） 
路由器端口组管理协议（RGMP： Router-port Group Management Protocol）
协议结构
IGMP v3 必须实现5种基本信息类型且与以前的版本相兼容： 
0x11：会员查询 
0x22：第3版本会员报告 
0x12：第1版本会员报告 
0x16：第2版本会员报告 
0x17：第2版本离开组
版本改进
igmp版本2对版本1所做的改进主要有：
(1)共享网段上组播路由器的选举机制
共享网段表示一个网段上有多个组播路由器的情况。在这种情况下，由于此网段上运行igmp的路由器都能从主机那里收到成员资格报告消息，因此，只需要一个路由器发送成员资格查询消息，这就需要一个路由器选举机制来确定一个路由器作为查询器。
在igmp版本1中，查询器的选择由组播路由协议决定；igmp版本2对此做了改进，规定同一网段上有多个组播路由器时，具有最小ip地址的组播路由器被选举出来充当查询器。
(2)igmp版本2增加了离开组机制
在igmp版本1中，主机悄然离开组播组，不会给任何组播路由器发出任何通知。造成组播路由器只能依靠组播组响应超时来确定组播成员的离开。而在版本2中，当一个主机决定离开时，如果它是对最近一条成员资格查询消息作出响应的主机，那么它就会发送一条离开组的消息。
(3)igmp版本2增加了对特定组的查询
在igmp版本1中，组播路由器的一次查询，是针对该网段下的所有组播组。这种查询称为普遍组查询。
在igmp版本2中，在普遍组查询之外增加了特定组的查询，这种查询报文的目的ip地址为该组播组的ip地址，报文中的组地址域部分也为该组播组的ip地址。这样就避免了属于其它组播组成员的主机发送响应报文。
(4)igmp版本2增加了最大响应时间字段
igmp版本2增加最大响应时间字段，以动态地调整主机对组查询报文的响应时间。
工作过程
1.IGMPv1 工作机制
IGMPv1 主要基于查询和响应机制来完成对组播组成员的管理。当一个网段内有多台组播路由器时，由于它们都能从主机那里收到IGMP 成员关系报告报文（Membership Report Message），因此只需要其中一台路由器发送IGMP查询报文（Query Message）就足够了。这就需要有一个查询器（Querier）的选举机制来确定由哪台路由器作为IGMP 查询器。对于IGMPv1 来说，由组播路由协议（如PIM）选举出唯一的组播信息转发者DR（Designated Router，指定路由器）作为IGMP 查询器。
IGMPv1 没有专门定义离开组播组的报文。当运行IGMPv1 的主机离开某组播组时，将不会向其要离开的组播组发送报告报文。当网段中不再存在该组播组的成员后，IGMP 路由器将收不到任何发往该组播组的报告报文，于是IGMP 路由器在一段时间之后便删除该组播组所对应的组播转发项。
2.IGMPv2 的改进
与IGMPv1 相比，IGMPv2 增加了查询器选举机制和离开组机制。
1） 查询器选举机制
在IGMPv1 中，当某共享网段上存在多个组播路由器时，由组播路由协议（如PIM）选举的指定路由器充当查询器。
在IGMPv2 中，增加了独立的查询器选举机制，其选举过程如下：
(1) 所有IGMPv2 路由器在初始时都认为自己是查询器，并向本地网段内的所有主机和路由器发送IGMP 普遍组查询（General Query）报文（目的地址为:224.0.0.1）；
(2) 本地网段中的其它IGMPv2 路由器在收到该报文后，将报文的源IP 地址与自己的接口地址作比较。通过比较，IP 地址最小的路由器将成为查询器，其它路由器成为非查询器（Non-Querier）；
(3) 所有非查询器上都会启动一个定时器（即其它查询器存在时间定时器OtherQuerier Present Timer）。在该定时器超时前，如果收到了来自查询器的IGMP查询报文，则重置该定时器；否则，就认为原查询器失效，并发起新的查询器选举过程。
2）离开组机制
在IGMPv1 中，主机离开组播组时不会向组播路由器发出任何通知，导致组播路由器只能依靠组播组成员查询的响应超时来获知组播组成员的离开。
而在IGMPv2 中，当一个主机离开某组播组时：
(1) 该主机向本地网段内的所有组播路由器（目的地址为224.0.0.2）发送离开组（Leave Group）报文；
(2) 当查询器收到该报文后，向该主机所声明要离开的那个组播组发送特定组查询（Group-Specific Query）报文（目的地址字段和组地址字段均填充为所要查询的组播组地址）；　
(3) 如果该网段内还有该组播组的其它成员，则这些成员在收到特定组查询报文后，会在该报文中所设定的最大响应时间（Max Response Time）内发送成员关系报告报文；
(4) 如果在最大响应时间内收到了该组播组其它成员发送的成员关系报告报文，查询器就会继续维护该组播组的成员关系；否则，查询器将认为该网段内已无该组播组的成员，于是不再维护这个组播组的成员关系。
3.IGMPv3 的改进
IGMPv3 在兼容和继承IGMPv1 和IGMPv2 的基础上，进一步增强了主机的控制能力，并增强了查询和报告报文的功能。　
1）主机控制能力的增强
IGMPv3 增加了针对组播源的过滤模式（INCLUDE/EXCLUDE），使主机在加入某组播组G 的同时，能够明确要求接收或拒绝来自某特定组播源S 的组播信息。当主机加入组播组时：
若要求只接收来自指定组播源如S1、S2、……的组播信息，则其报告报文中可以标记为INCLUDE Sources（S1，S2，……）；
若拒绝接收来自指定组播源如S1、S2、……的组播信息，则其报告报文中可以标记为EXCLUDE Sources（S1，S2，……）。
2）查询和报告报文功能的增强
(1) 携带源地址的查询报文
IGMPv3 不仅支持IGMPv1 的普遍组查询和IGMPv2 的特定组查询，而且还增加了对特定源组查询的支持：
􀁺 普遍组查询报文中，既不携带组地址，也不携带源地址；
􀁺 特定组查询报文中，携带组地址，但不携带源地址；
􀁺 特定源组查询报文中，既携带组地址，还携带一个或多个源地址。
(2) 包含多组记录的报告报文
IGMPv3 报告报文的目的地址为224.0.0.22，可以携带一个或多个组记录。在每个组记录中，包含有组播组地址和组播源地址列表。组记录可以分为多种类型，如下：
IS_IN：表示组播组与组播源列表之间的过滤模式为INCLUDE，即只接收从指定组播源列表发往该组播组的组播数据。
IS_EX：表示组播组与组播源列表之间的过滤模式为EXCLUDE，即只接收从指定组播源列表之外的组播源发往该组播组的组播数据。
􀁺 TO_IN：表示组播组与组播源列表之间的过滤模式由EXCLUDE 转变为INCLUDE。
TO_EX：表示组播组与组播源列表之间的过滤模式由INCLUDE 转变为EXCLUDE。
ALLOW：表示在现有状态的基础上，还希望从某些组播源接收组播数据。如果当前的对应关系为INCLUDE，则向现有组播源列表中添加这些组播源；如果当前的对应关系为EXCLUDE，则从现有组播源列表中删除这些组播源。
BLOCK：表示在现有状态的基础上，不再希望从某些组播源接收组播数据。如果当前的对应关系为INCLUDE，则从现有组播源列表中删除这些组播源；如果当前的对应关系为EXCLUDE，则向现有组播源列表中添加这些组播源。