转载请注明:http://blog.csdn.net/shanzhizi
汇总一下IGMP三个版本的协议包的格式,因为是简单的汇总,因此对于字段没有详细说明,对个别字段的说明可能不准确,对于v3各个字段的详细说明请参考IGMPv3的标准文档。
关于IGMP协议原理请参考“IGMP技术总结”
IGMPv1 包格式
字段说明:
版本:
即IGMP版本号,在IGMPv1中应为0x1。
类型:
即IGMP报文类型
1=主机成员查询
2=主机成员报告
在IGMPv2中这一字段扩充为8位。
组地址:
在报告报文中指定为多播组地址,在查询报文中该字段为0IGMPv2包格式
字段说明:
类型:
0x11 成员查询
0x12 版本1成员报告
0x16 版本2成员报告
0x17 离开组
在IGMP版本2中,旧的4位版本字段和旧的4位类型字段拼成了一个新的8位类型字段,通过分别将成员查询(版本1和版本2的)及版本1的成员报告报文的IGMP版本2的类型代码置为0x11和0x12,保持了IGMP版本1和版本2包格式的向后兼容。
最大响应时间:
在发出响应报告前的以1/10秒为单位的最长时间,缺省值为10秒。
新的最大响应时间(以1/10秒为单位)字段允许查询用路由器为它的查询报文指定准确的查询间隔响应时间。IGMP版本2主机在随机选择它们的响应时间值时以此作为上限。
这样在查询响应间隔时有助于控制响应的爆发。
组地址:
多播组地址(如果是通用查询则为0.0.0.0)
除了在通用查询时这一字段置为0.0.0.0外,这一字段和IGMP版本1中的这一字段意义相同。IGMPv3包格式
IGMPv3包含查询报文和报告报文两种不同格式的报文,下面分别对两种报文的格式做简要说明。
查询报文:
字段说明:
类型(Type):
0x11 成员关系查询
最大响应代码(Max_Resp_Code):
最大响应代码字段指定在发送一个响应报告之前所允许的最大时间。实际允许的时间,被称为最大响应时间,其单位是1/10秒。它跟最大响应代码的换算如下:
if Max Rsp Code < 128 最大响应时间=Max Rsp Code
if Max Rsp Code >= 128 MaxRsp Code其实是表示如下的一个浮点值:
0 1 2 3 4 5 6 7
1|exp |mant |
最大响应时间= (mant | 0x10)<< (exp + 3)
最大响应时间的小值允许IGMPv3路由器调节“离开延迟”(最后一台主机离开组的那个时间点跟路由协议被通知到已经不存在成员的那个时间点,两者之间的时间差)。更大的值,尤其在指数范围内的值,可以调节网络中IGMP流量的爆炸。
校验和
校验和是对整个IGMP数据报以16位为一段进行取反求和。为了计算校验和,校验和字段开始必须被设置成0。当收到一个数据,在处理之前必须先对校验和进行验证
组地址(GroupAddress):
当发送一个普通查询的时候,组地址字段必须被置0。当发送一个指定组查询或者发送一个指定组和源的查询时,必须被设置成要被查询的IP组地址。
保留(Resv):
发送的时候以0填充,接收的时候不做处理,被忽略。
标志位S(禁止路由器处理):
当被设置成1的时候,S标志表示任何接收路由器禁止更新它们在收到查询时要更新的那些定时器。但它不禁止查询者选举或者普通的在路由器上执行的(当路由器作为一个组成员的时候)主机端的查询处理
QQIC:查询间隔时间,单位是秒;
查询者的健壮变量(QRV)
如果不为0,QRV中包含中一个被查询者使用的[健壮变量]的值,如果查询者的健壮变量的值超过7,即QRV字段的最大值,那么QRV被设成0。路由器取最近收到的查询中的QRV值作为它们自己的健壮性变量的值,除非最近收到的QRV是0,在这种情况下,接收者使用缺省的健壮性变量值,或者是一个静态配置的值。
查询者的查询间隔代码(QQIC)
查询者的查询间隔代码字段指定查询者使用的[查询间隔]。实际的间隔,称为查询者的查询间隔(QQI),以秒为单位表示,从查询者的查询间隔代码进行换算的方法如下:
if QQIC < 128 QQI=QQIC
if QQIC >= 128 QQI代表如下的一个浮点值:
0 1 2 3 4 5 6 7
1|exp |mant |
QQI = (mant | 0x10 ) << (exp + 3)
当前为非查询者的多播路由器从最近收到的查询中取QQI值作为自己的[查询间隔]值,除非最近收到QQI是0,在这种情况下,接收路由器使用缺省的[查询间隔]值。
源数量Number_of_Source:
源数量(N)字段表明该查询中存在多少个源地址。在普通查询或指定组查询中这个值是0,在指定组和源的查询中,这个值为非0值。
Sourceaddress[i] (i取值从1到n):
n个IP单播地址的数组,n就是Number of Sources(N)字段的值。
附加数据:
如果收到的查询中的IP首部中数据报长度字段表明除了上述的字段之外,还有附加的数据存在,IGMPv3的实现在计算校验和的时候必须包含这些数据,但是在发送查询的时候,必须忽略这些数据,一个IGMPv3的实现在上述字段之外,不能再包含其它数据。
查询消息有三种类型的变体:
1、“普通查询”由多播路由器发出,用于获知邻接接口(即查询所传输的网络中所相连的接口)的完整的多播接收状态。在一个普通查询中,组地址字段和源数量(N)字段都为0。
2、“指定组查询”由一台多播路由器发出,用于获知邻接接口中跟某一个IP地址相关的多播接收状态。在指定组查询中,“组地址”字段含有需要查询的那个组地址,源数量(N)字段为0。
3、“指定组和源查询”由一台多播路由器发出,用于获知邻接接口是否需要接收来自指定的这些源的,发往指定组的多播数据报。在一个指定组和源的查询中,组地址字段含有要查询的多播地址,源地址[i]字段含有相关的源地址。报告报文
字段说明:
Type(8bit)
0x22 成员关系报告
Reserved( 8bit)和Reserved( 16bit):
都是表示保留字段,不过在IGMP中为了使它们都保持对应的长度,所以才有了长度上的区别,它在发送的时候是以0填充,在接收的时候是不作任何处理的。
校验和
校验和是对整个IGMP消息以16位为一段进行取反求和。为了计算校验和,校验和字段首先必须被置0。当收到一个数据,在处理之前,必须先对校验和进行验证。
Number_of_Group_Records(M):
该字段表示该报告报文中包含有几个组记录
Group Record[i] (i 从 1 到M):
一个主机可能需要点播多个组播地址的组播业务,每个记录包含了对应于其中一个组播地址的源地址列表等信息,它受到Number_of_Group_Records的大小的影响。
每一个组记录字段是一整块数据,其含有的信息是关于发送者在报告发送接口上的某一个多播组的成员关系。
每一个Group Reocrd的内部格式如下:
Record Type(8bit) |
Aux_Data_Len(8bit) |
(16bit)Number_of_Group_Sources (N) |
Multicast Address(32bit) |
||
Source Address [i] (i从1到N) |
||
Auxiliary Data |
字段说明:
Aux Data Len:
辅助数据长度含有在组记录中的辅助数据的实际长度,其单位是32bit字。它有可能是0,这就表示辅助数据不存在。
Number_of_Group_Sources:
源数量(N)字段标明在组记录中存在多少源地址。
MulticastAddress:
多播地址字段标明该组记录从属的多播IP地址。
SourceAddress[i]:
源地址[i]字段是一个数组,含有n个单播地址。n就是该记录的源数量(N)字段的值。
Auxiliary Data:
辅助数据字段如果存在,它含有关于该组记录的一些附加信息。本文档所描述的协议IGMPv3,没有定义任 何辅助数据。所以,IGMPv3的实现在任何传输的组记录中都不应该含有任何辅助数据(即必须把Aux Data Len字段置0)。并且在收到的所有组记录中,必须忽略辅助数据的存在。关于辅助数据的语法和内部编码会由将来版本的使用该字段的IGMP或其扩展定义。
附加数据:
如果收到的报告中的IP首部的数据报长度字段标明在最后一个组记录后面有附加的数据存在。IGMPv3的实现必须在计算和验证校验和的时候包含这些附加数据,但是同时必须忽略这些附加数据。当发送一个报告时,一个IGMPv3的实现在最后一个组记录后面不能包含附加数据。
组记录类型(Record Type):
在一个报告消息中,有一定数量的不同类型的组记录:
-“当前状态记录”由一个系统发出,用于响应在一个接口上收到的查询。它报告了接口跟某一个多播IP地址相关的当前的接收状态。当前状态记录的记录类型可以是下面两个值中的一个:
值 名字和含义
1 MODE_IS_INCLUDE-标明接口相关于某一指定多播地址的过滤模式为INCLUDE。该组记录中的源地址[i]字段含有该接口的相关于该多播地址的源列表(如果非空的话)。
2 MODE_IS_EXCLUDE-标明接口相关于某一指定多播地址的过滤模式为EXCLUDE。该组记录中的源地址[i]字段含有该接口的相关于该多播地址的源列表(如果非空的话)。
-“过滤模式改变记录”是当本地的IPMulticastListen调用造成本地的接口层相关于某一特定多播IP地址的过滤模式的改变的时候(即从INCLUDE变到EXCLUDE,或者从EXCLUDE变到INCLUDE),由系统发出。这个记录包含在一个报告中,而该报告是从发生改变的那个接口上发出来的。过滤模式改变记录的记录类型是以下两个值中的一个:
值 名字和含义
3 CHANGE_TO_INCLUDE_MODE,标明接口相关于某一指定的多播地址的过滤模式改变到INCLUDE。该组记录中的源地址[i]字段含有该指定多播地址相关的新的源列表(如果非空的话)。
4 CHANGE_TO_EXCLUDE_MODE,标明接口相关于某一指定的多播地址的过滤模式改变到EXCLUDE。该组记录中的源地址[i]字段含有该指定多播地址相关的新的源列表(如果非空的话)。
-“源列表改变记录”是当本地的IPMulticastListen调用造成本地的接口层相关于某一特定多播IP地址的源列表发生改变,并且该改变不跟过滤模式的改变产生冲突时,由系统发出。该记录包含在一个报告中,而该报告是从发生改变的那个接口上发出来的。源列表改变记录的记录类型是以下两个值中的一个:
值 名字和含义
5 ALLOW_NEW_SOURCE,标明组记录中的源地址[i]字段含有系统希望接收的发往某一多播地址的,新的源的列表。如果这是对一个INCLUDE列表的改变,那么这些地址会被添加到列表中,如果这是对一个EXCLUDE列表的改变,那么这些地址会被从列表中删除。
6 BLOCK_OLD_SOURCE,标明组记录中的源地址[i]字段含有系统不希望再接收的发往某一多播地址的源的列表。如果这是对一个INCLUDE列表的改变,那么这些地址会被从列表中删除,如果这是对一个EXCLUDE列表的改变,那么这些地址会被添加到列表中。
如果源列表的改变是同时添加新的源和阻止旧的源,这两种组记录会同时发往一个多播地址,一个是ALLOW_NEW_SOURCE,另一个是BLOCK_OLD_SOURCE。
我们把过滤模式改变记录和源列表改变记录都统一称作状态改变记录。
不能识别的记录类型值必须被丢弃。注意休息,定期活动颈椎,保持颈椎健康是一生的大事!
在IGMPV3中它有了以下的改进功能:
1.增加了主机的控制能力;
如何实现:IGMP V3不仅可以指定加入的组播组G,还能明确要求从哪个指定组播源S接受信息,这也是指定源组播功能。
2.查询消息可以携带源地址;(源地址就是节目流地址)
3.响应消息包含多组记录:
如何实现:IGMP V1 V2版本的响应消息和查询消息具有相同的报文结构,即报文中仅包含组地址信息。IGMP V3响应消息包含的组地址为224.0.0.22,,其中可以携带1个多则多个组记录,在每个组记录中,包含组播组地址、数目不等的源地址信息。
4.取消响应的抑制机制:
原因:由于IGMP V3响应报文中同时携带源地址和组播组地址,而且包括Include和Exclude两种状态,为了减轻主机负担无需响应抑制机制,即组成员可以独立报告响应消息。