目 录
1 IGMP 协议 ............................................................................................................................................... 2 1.1 IGMPv1协议 ..................................................................................................................................... 2 1.1.1 IGMPv1的工作原理 .................................................................................................................. 2 1.1.2 IGMPv1报文格式 ...................................................................................................................... 2 1.1.3 IGMPv1工作过程 ...................................................................................................................... 3 1.2 IGMPv2协议 ..................................................................................................................................... 5 1.2.1 IGMPv2的工作原理 .................................................................................................................. 5 1.2.2 IGMPv2的报文格式 .................................................................................................................. 6 1.2.3 IGMPv2工作过程 ...................................................................................................................... 7 1.3 IGMPv3协议 ..................................................................................................................................... 9 1.3.1 IGMPv3的工作原理 .................................................................................................................. 9 1.3.2 IGMPv3的报文格式 .................................................................................................................. 9 1.3.3 IGMPv3的主要改进 ................................................................................................................ 12 2 MLD协议 ................................................................................................................................................ 13 2.1 MLDv1协议 ..................................................................................................................................... 14 2.1.1 MLDv1的工作原理 .................................................................................................................. 14 2.1.2 MLDv1报文格式 ...................................................................................................................... 14 2.1.3 MLDv1工作流程 ...................................................................................................................... 16 2.2 MLDv2协议 ..................................................................................................................................... 16 2.2.1 工作原理 ................................................................................................................................... 17 2.2.2 MLDv2报文格式 ...................................................................................................................... 17 2.2.3 MLDv2工作过程 ...................................................................................................................... 23
1 IGMP 协议
IGMP用来动态的将各个主机注册到特定局域网中的一个组播组中。主机向本地的组播路由器发送IGMP消息来表明自己所属的组播组。在IGMP协议中,路由器侦听IGMP消息并周期的发出查询,以发现某个子网上哪些组是活动的,哪些是不活动的。
IGMP消息在IP数据报内发送,用IP协议号2来标识。同时,将IP存活时间(TTL)字段值设定为1,因此IGMP信息处于本地范围本子网内传送并且不会被路由器转发。
1989年,IGMP版本1(RFClll2)第一次详细定义了IGMP规范。后来施乐公司对最早的IGMP版本1进行了大幅更新,产生了IGMP版本2(RFC2236)。到目前为止IGMP版本3规范己经称为IETF正式标准(RFC3376),通用的是IGMPv2。IGMPvl实现简单,但是有离开延迟过大和选择查询路由器需要依赖组播路由协议的缺点,IGMPv2对此进行了改进。IGMPv3协议的主要目的是支持源特定组播,并进一步对IGMPv2进行完善。
1.1 IGMPv1协议
1.1.1 IGMPv1的工作原理
在IGMPvl中定义了基本规则、组成员查询机制和报告机制。当某接收主机希望接收到某个组播组的数据时,它会向本地链路上的查询路由器发送加入消息,通知查询路由器本机希望申请加入的组播组;查询路由器收到加入消息之后,把这条消息加入到查询路由器所维护的状态列表,同时向源发起建立组播分发树的请求;查询路由器在设定的周期内发起组成员查询消息;接收主机收到查询消息之后,会向查询路由器发送报告消息来应答查询,否则查询路由器会认为不存在接受主机;主机如果想离开某个组播组,就对路由器的查询保持沉默,经过一定时间,路由器便知道子网内没有组成员了。
1.1.2 IGMPv1报文格式
IGMPvl报文格式如图2-4所示,
图2-4 IGMPv1报文格式
其主要内容包括:
(1) 版本字段表示IGMP协议的版本号,在IGMP中置为1. (2) 类型字段,在IGMPv1中,只有两个值:
取值为0x11,表示该报文为成员关系查询(Membership Query),主要是由路由器使用。 取值为0x12,表示该报文为成员关系报告(Membership Report),主要是主机使用。
(3) 校验和字段用于数据报文的校验。
(4) 组地址字段。当用于成员关系查询时,本字段置为0,并被主机忽略;当用于成员关系报告时,本字段包含组播组地址。
IGMPv1报文在网络中传输完整的报文格式如图2-5:
图2-5 在网络中传输的IGMPv1报文
1.1.3 IGMPv1工作过程
在IGMPv1中,路由器利用查询一响应过程来确定在本地子网中是否有加入某个组播组的主机存在,如果有,则这台路由器就要完成向本子网组播数据包的功能;如果没有,则这台路由器就不必向此子网转发组播包。路由器周期性地向子网上的所有主机发送组播成员关系查询报文,希望加入某个组播组的主机就响应该查询,发送一个组播成员关系报告报文到子网上,在IGMP报文的组地址地段中加入想要加入的组播组的地址。路由器接收到来自主机的成员关系报告报文后,就知道了在该子网上有主机要加入组播组,组播组地址在报文中可以获得,接下来,路由器就会根据所使用的路由协议建立起相应的转发状态。
当一个子网上有多台主机想加入同一个组播组时,就可以利用报告响应抑制功能,来减少子网中的重复信息传递。处理流程如下:主机接收到IGMP成员关系查询报文后,对加入的每个组播组启动一个倒数计时器。当计时器的值为0时,主机发送IGMP成员关系报告报文,通知路由器子网内仍有处于活动状态的组播接收者。当计时器到达0之前,若主机接收到来自其他主机发送的同一组成员关系报告报文,那么它就停止与该计时器得到的数,重新计时,这样,就避免了发送同一个成员关系报告报文给路由器。
如果在一个子网中有多个组播路由器,那么多个路由器都发送IGMP查询报文是一种浪费,所以应当确定一个路由器作为查询路由器就可以了。但是在IGMPv1中,没有提供选举查询路由器的机制,而是把这一任务留给了组播路由协议。由于不同的协议使用不同的选举机制,会造成在一个子网中出现多个查询路由器,这也是IGMPv1的缺点之一。
但是IGMPv1的另一个缺点是缺乏显式的离开方式。当一台主机想要离开一个组播组时,并不显式地表示出来,而只是不再对路由器的查询报文进行响应。当一个网段内某个组播组的最后一个成员退出后,路由器还会继续组播这个组的数据,直到一段时间内路由器接收不到任何来自该组的成员响应,才会知道该组已经没有接收者了,然后停止转发该组的组播数据报文。因此,路由器中需要为子网中的每一个组维护一个计时器。当路由器接收到某台主机发送的报告报文时,就会将该组的计时器清零;当某个组的计时器超时后,就说明在本网段上已经没有接收者,于是停止转发该组报文。
下面是工作过程图解: 1) 组成员加入
图2-6 IGMPv1组成员加入
2) 查询与响应
图2-7 IGMPv1组成员查询
3) 响应抑制机制
图2-8 IGMPv1响应抑制机制
4) 组成员离开
图2-9 IGMPv1组成员离开
1.2 IGMPv2协议
1.2.1 IGMPv2的工作原理
IGMPv1的主要缺点是离开延迟过大和选择查询路由器需要依赖组播路由协议进行。针对这些缺点,IGMPv2做了相关的改进。在IGMPv2中,增加了离开组的报文格式,当主机想要离开某个组播组时,不必等待路由器发出查询报文,而是可以直接向路由器发送成员关系报告报文,这样可以有效地缩短离开延迟。另外在IGMPv2中,还明确了查询路由器的选举机制。除此之外,IGMPv2的工作原理与IGMPv1基本一致
1.2.2 IGMPv2的报文格式
IGMPv2的报文格式如图2-10所示:
图2-10 IGMPv2报文格式
它在IGMPvl的基础上,进行了两处改动:一个是将v1的版本字段和类型字段进行了合并;另一个是增加了最大响应时间字段 (MaxResponseTime)。其主要内容如下: (1)类型字段,在兼容IGMPv1的基础上,IGMPv2中新增了两种报文类型。
·0xll:成员关系查询。与IGMPv1不同,IGMPv2的查询分为两种类型:①通用查询 (GeneralQuery),组地址字段置为全0,对所有的组进行组成员查询;②特定组查询 (GrouPpecificQuery),针对特定组进行组成员查询,组地址字段置为特定组的地址。 ·0x12:IGMPv1成员关系报告(为了向后兼容IGMPv1)。 ·0x16:IGMPv2成员关系报告。 ·0xl7:离开组。
(2)最大响应时间字段,只有在成员关系查询报文中有效,主机必须在最大响应时间到达之前发出成员关系报告报文。通过该值,路由器可以调节组成员的离开延迟。 (3)校验和字段,与IGMPv1中的一样。
(4)组地址地段,与IGMPv1中的基本一样,当采用特定组查询时,该字段存放要查询的组播组的地址。
IGMPv2报文在网络中传输完整的报文格式如图2-11:
图2-11 在网络中传输的IGMPv2报文格式
1.2.3 IGMPv2工作过程
查询一响应过程与IGMPv1基本相同,但是有两点改进:①增加了特定组查询,特定组查询的目的是为了让路由器知道一个特定组在子网内是否还有组成员,以便判断是否还需要转发该组的数据报文;②IGMPv2的成员关系报告的类型代码不一样。
IGMPv2的组成员加入与 IGMPv1中的完全一样。IGMPv2离开过程与IGMPv1相比有了较大的改进。主机离开一个组时,需要显式地发送一个离开报文给路由器。其过程如下:要离开的主机发送一个离开报文给子网上所有路由器(目的地址224.0.0.2)。查询路由器接收到离开报文后,会立即发送一个特定组查询到子网上。如果子网上还有该组的成员,则会发回一个响应报文;如果子网上己经没有该组的成员,则没有主机回应,于是路由器就知道己经没有该组成员了,就停止转发该组的数据。
在IGMPv1中,选择查询路由器依赖于组播路由协议。而在IGMPv2中,明确了选择查询路由器的机制。其过程如下:开始时,子网上的每个路由器都假定自己就是查询路由器,发送一个通用查询报文给所有主机(目的地址224.0.0.1)。每个路由器都可以接收到来自其他路由器的报文,然后进行IP地址的比较,具有最低IP地址的路由器就成为查询路由器;非查询路由器启动一个计时器,无论何时接收到来自当选的查询路由器的通用查询报文,就将计时器复位。如果计时器超时,就认为当选的查询路由器发生故障,转向开始重新选择。计时器的取值一般为查询间隔的2倍 图解工作过程如下: 1)组成员加入
图2-12 IGMPv2组成员加入
2)查询与响应
图2-13 IGMPv2组成员查询与响应
3)查询器选举
图2-14 IGMPv2查询路由器选择
4)成员离开
图2-15 IGMPv2组成员离开
1.3 IGMPv3协议
1.3.1 IGMPv3的工作原理
IGMPv3的提出,主要是为了配合源特定组播的实现,即组播组成员可以指定接收或指定不接收某些组播源的报文。这样主机就可以有选择性接收来自某个特定组播源的数据包,而不是被动接收该组中所有组播源的数据包。IGMPv3的这一特性,可以实现源特定组播SSM技术。源特定组播(Source Specific Multicast,SSM)是一种区别于传统组播的新的业务模型,SSM保留了传统PIM-SM模式中的主机显式加入组播组的高效性,但是跳过了PIM-SM模式中的共享树和RP规程。SSM直接建立由(S,G)标志的一个组播最短路径树。SSM的一个(S,G)对也被称为一个频道(Channel)。PIM-SSM是对传统PIM协议的扩展,使用SSM,用户能直接从组播源接收组播报文,需要汇聚点(RP)的帮助。
IGMPv3在IGMPvl/v2的基础上提供了额外的源过滤组播功能(Source FilteredMulticast,SFM)。在IGMPvl/v2中,主机只根据组地址来决定加入某个组,并从任何一个源接收发给该组地址的报文。具有源过滤组播功能(SFM)的主机使用IGMPv3来表示主机所希望加入的组播组,同时还表示该主机所希望接收的组播源的地址。主机可以使用一个包括列表(Inclusion List)或一个排除列表 (Exclusion List)来表示对源地址的限制。即组播组成员可以指定接收或指定不接收某些组播源的报文。这样主机就可以有选择性接收来自某个特定组播源的数据包,而不是被动接收该组中所有组播源的数据包。
1.3.2 IGMPv3的报文格式
IGMPv3的报文类型有以下几种:
0xll:成员关系查询报文 (MembershipQeury)。
0x22:版本3成员关系报告报文(version 3 Membership Report) 0x12:版本1成员关系报告报文(version 1 Membership Report) 0x16:版本2成员关系报告报文 (version 2 Membership Report) 0x17:版本2离开报文 (version 2 LeaveGroup)。
报文类型的值填写在报文中的类型字段。在IGMPv3中,查询报文和报告报文格式有较大差异,需要分别描述。图2-16为查询报文的格式
图2-16 IGMPv3查询信息格式
(1)类型字段,设置为0xll,代表该报文为查询报文。 (2)最大响应时间字段,指明了主机发出响应的最长时间。
(3)组地址字段,功能与IGMPv2一样,可以用于通用查询和组特定查询。 (4)s字段,置为1时,其他路由器不对该报文进行处理。
(5)QRV字段,查询路由器的健壮值(Querier’s RobustnessVariable),该值影响计时器和重试次数的取值。
(6)QQIC字段,查询路由器的查询间隔码(Querier’s QueryIntervalCode),该值影响查询路由器的查询间隔时间,非查询路由器按照此值更新自己的缺省值。
(7)源地址数目字段,该值表在这个报文中包含了多少个源地址。当进行通用查询(GeneraQuery)或者组特定查询 (GroupSpecific Query)时,该值置为0;当进行特定组和源查询 (Group Source pecific Query,用于PIM一SSM)时,该值为源特定地址的数目。虽然该值最大可为65536,但是实际上受限于数据链路层的MTU,例如在以太网上,1P数据报最长为1500字节,除去IP报头的24字节和IGMP报头的12字节,剩余1464字节,所以最多包含366(1464/4)个源地址。 (8)源地址地段。
IGMPv3查询信息报文在网络中传输完整的报文格式如图2-17:
图2-17 在网络中传输的IGMPv3查询报文格式
IGMPv3报告报文的格式较为复杂,如图2-18所示。
图2-18 IGMPv3侦听者报告格式
(1)类型字段,置为0x22,表示该报文为IGMPv3报告报文。 (2)组记录数目字段,表示此报文中包含的组记录数目。
(3)组记录字段。包含若干个组记录,每个组记录长度不固定,其内容如图2-19:
图2-19 IGMPv3组记录格式
①组记录类型字段,表示该组记录中包含的数据的类型,目前定义了六种类
型,分别是:
·MODE IS INCLUDE。表示该主机的过滤模式为INCLUDE.也就是说,后面列出的地址都是主机想要接收的组播源地址。
·MODE IS EXCLUDE。表示该主机的过滤模式为EXCLUDE,也就是说,后面列 出的地址都是主机想要拒绝的组播源地址。
·CHANGE TO INCLUDE MODE。表示该主机的过滤模式从EXCLUDE切换为INCLUDE模式。 ·CHANGE TO EXCLUDE MODE。表示该主机的过滤模式从INCLUDE切换为EXCLUDE模式。 ·ALLOW NEW SOURCES。表示该主机中新增的想要接收的源地址。 ·BLOCK OLD SOURCES。表示从该主机中删除的不想接收的源地址。
②辅助数据长度字段,在组记录的最后,可以增加以4字节为单位的辅助数据,如果没有辅助数据,则置为0。
③源地址数目字段,表示该记录中包含了多少个组播源地址。 ④组地址字段,与源地址共同表示特定源组播。
⑤源地址字段,每个长度为32bits。标志源地址,数目由源地址数目字段表示。
⑥辅助数据字段。为将来的应用预留,在IGMPv3中并不需要。一台主机在发送报告报文的时候,应当把自己的源IP地址包含在IP数据报中,当主机还没有获得IP地址的时候,可以使用0.0.0.0作为源IP地址,支持IGMPv3的路由器必须接收来自0.0.0.0的数据报。主机的IGMP报文的目的地址标志为224.0.0.22,代表子网中所有支持IGMPv3的路由器。
1.3.3 IGMPv3的主要改进
IGMPv3除了支持原特定组播外,其工作原理与IGMPv2相比,并没有本质的改变,只是在某些地方做了改进和优化。以下列出了IGMPv3的主要特点和改进: ① 支持源特定组播SSM; ② 向后兼容IGMPvl和IGMPv2; ③ 主机可以定义要接收的组播源地址;
④ 非查询路由器可以与查询路由器保持参数值同步; ⑤ 最大响应时问从25.5s增加到53min,适合于较大的网络; ⑥ 辅助数据字段为将来的应用预留了空间;
⑦关系成员报告报文发送给目的地址224.0.0.22,可以帮助二层交换机更有效地实现IGMP监听 (IGMPSnooping)功能;
⑧报告报文中可以包含多个组记录,可以有效地减少网络通信量;
⑨在IGMPv3中,取消了前面版本中的响应抑制功能,主要原因是:
第一,使用响应抑制时,路由器只知道子网上是否有组成员,而不知道有几个组成员,以及成员是哪些主机:取消响应抑制,路由器就可以记录每一个组成员的信息,可以开发一记账等增值服务功能。
第二,许多网桥或者二层/三层交换机在实现IGMP监听功能时,为了避免响应抑制,一般不转发网段问的IGMP报文。取消了响应抑制后,可以简化这些设备的设计。
第三,取消响应抑制后,主机不必处理来自其他主机的报文,简化了主机的实现。在查询报文中,增加S标志位,可以提高系统的健壮性。
IGMPv3报告报文在网络中传输完整的报文格式如图2-20:
图2-20 在网络中传输的IGMPv3报告报文
2 MLD协议
IPv6的组管理协议被称为MLD(组播监听者发现)。1999年,MLD版本l(RFC2710)被IETF发布。2004年,MLD版本2(RFC3810)标准出台,后一个版本可以向前一个兼容。MLD协议是专门针对基于IPv6的组播组管理协议。因为MLD使用全新的ICMPv6的报文格式,所以MLD协议就是
ICMPv6协议的一个子集。MLD消息使用链路本地IPv6源地址发送,其跳数被限制为1。MLD消息的封装格式如图2-21所示:
图2-21 MLD消息封装格式
以下分别描述MLD协议的两个版本以及MLDSnooping,其中对于MLDSnooping的详细描述见第三章。
2.1 MLDv1协议
2.1.1 MLDv1的工作原理
MLDvl协议是从IGMPv2协议中派生出来的,其运行机制和IGMPv2协议相同,专门用于IPv6组播群组的管理,其主要是应用于ASM模式组播路由协议的组管理工作。
对于运行MLD协议的路由器,其接口要监听由IPv6组播地址产生的所有链路组播地址。路由器为它所在的每一条链路维护一个列表。表项有此链路中存在的组成员的组播地址,以及该地址相应的定时器。路由器周期性地发送通用请求 (general query),以查询该链路上是否存在某组播地址的组成员。节点收到路由器发送的常规请求后,经过随机时延后发出组播监听报告。这样是为了防止所有的节点都在同一时间发出报告分组,从而造成网络的突发性阻塞。当路由器收到链路上的报告分组时,如果报告地址不在路由器的列表上,则加入该项,否则计时器重新置位。如果某个地址的计时器过期,则从列表中删除。当节点要加入一个组播组时,主动发送组播监听报告,向路由器报告组成员的存在。节点退出组播组时,发送完成分组,删除有关路径。当请求状态的路由器从链路上接收到一个完成消息,如果消息中的组播地址在路由器的列表上,路由器发送一个特定组播地址查询。如果一段时延后没有报告分组,则认为该组播地址在此链路上没有组成员了。
2.1.2 MLDv1报文格式
MLDv1的报文格式如图2-22所示:
图2-22 MLDv1报文格式
(1)类型字段,MLDvl有如下三种报文类型:
·组播侦听查询消息(Type=130),分为两种类型:①通用查询(GeneralQuery),组地址字段置为全0,对所有的组进行组成员查询;②特定组查询(Group Pecific Query),用于判断一个特定的组播地址在本地链路上是否有组播侦听者。 ·组播侦听报告消息(Type = 131) ·组播侦听完成消息(Type = 132) (2)编码字段,初始值为0。 (3)校验和字段。
(4)最大响应时间字段,只有在组播监听者查询报文中有效,主机必须在最大响应时间到达之前发出成员关系报告报文。通过该值,路由器可以调节组成员的离开延迟。
(5)组地址字段,在通用组查询中,置为0;在特定组查询时,该字段存放要查询的组播组的地址。在报告和完成报文中,分别用于存放主机要加入和离开的组地址。 MLDv1报文在网络中传输完整的报文格式如图2-23:
图2-23 在网络中传输的MLDv1报文
以上这些查询消息和应答消息报文有三种不同的报文交互方式:
第一种交互方式是由路由器发起的。路由器作为询问者向与其相连接的所有主机发送一个一般查询消息报文。其目的地址是FF02::1。主机收到此消息后,应答一个包含当前组播地址状态记录的报文消息,此报文告诉路由器此主机希望接收哪个组播组或者哪些源发来的数据。
第二种交互方式是由主机发起的。当一个主机离开一个组播组时,它就要向路由器发送组播侦听者完成消息,该消息包括一个状态改变一记录。路由器收到此消息后,向其相连的链路上发送一个特定组播地址查询,询问是否还有主机加人了此特定的组。
第三种交互方式是由路由器发起的。如果在路由器的组播地址表中某一个组播地址的相关定时器超时后,仍然没有收到主机发来的包含状态变化记录的组播侦听者报告消息,路由器则向所有主机发送一个特定组查询消息,确认该组播组是否还有组播侦听者。
2.1.3 MLDv1工作流程
当一个网段内连接有多台路由器运行MLDvl协议时,必须选举一台路由器作为查询路由器,其余的自然成为非查询路由器。选举的机制是:地址最小的路由器当选。非查询路由器中有一个其他查询路由器存在计时器,当该计时器到期仍没有收到来自查询路由器的报文,则认为该查询路由器失效,重新开始新的选举。
路由器定期向子网内所有的主机广播查询报文(目的地址为FF02::1),目的是获得主机的报告报文。在路由器刚开始工作时,会快速连续地发送查询报文,以便尽快搜集到子网内的组成员信息。 当主机接收到一个查询报文后,就为每一个要接收的组地址启动一个延迟定时器。定时器的值在[0,最大响应时间]之间取一个随机数。如果查询报文中的最大响应时间字段被置为0,则定时器立刻到期。定时器到期后,主机会发送一个报告报文给路由器,通知路由器主机想接收的组播组地址。 如果一台主机在定时器还未到期时,就收到其它主机通告路由器的报告报文,则读取该报文的组地址,如果和自己需要通告的组地址相同,则立刻停止相应的定时器,并不再发送关于该组地址的报告报文,这样就可以避免多台主机发送相同内容的报告报文给路由器,这种机制称为“响应抑制”。路由器收到来自主机的报告报文后,查看其中的组地址,如果该地址未在路由器的组地址列表中,则将其添加到组地址列表中,同时为其启动一个相应的定时器;如果该地址已经在路由器的组地址列表中,则将相应的定时器恢复最大值。如果一个组地址的定时器到期了,则说明该组地址在子网内已经没有接收者了,路由器会将此组地址从列表中删除。
当一台主机想要加入某个组播组时,可以不必等待路由器的查询报文,而是直接向路由器发送报告报文。为了保障该报文的可靠性,一般会进行重传。当一台主机想要离开某个组播组时,必须发送一个离开报文给子网内的路由器。路由器收到离开报文后,会首先查看该组地址是否在组地址列表中,如果在,则发送一个特定组地址查询给子网内的所有主机。在一定的时间内,路由器收不到来自主机的应答,则会认为该组已经没有接收者,于是将该组地址从列表中删除。非查询路由器会忽略所有的离开报文。
2.2 MLDv2协议
MLDv2从IGMPv3中发展过来,和MLDvl相比,增加了IGMPv3所具有的源过滤功能,不仅能够支持ASM模式组播路由协议,而且还能够支持基于IPv6的SSM模式组播路由协议。
MLDv2在MLDv1的基础上添加了源组播 (Source Specific Multieast)的概念,主机可以组播源报告(Group-Source Report)报告感兴趣的源,路由器则只转发该链路上所有组成员感兴趣的源所发送的报文。当主机想退出某组播源时,主机发送离开组播源报告(Group-Source Leave),查询者在接收到该报告后可以发送指定组播源请求,确认是否仍有组成员关心该组播源。MLDv2支持源过滤 (SourceFiltering),因此比MLDvl具备更高的可管理性和安全性。此外MLDv2还可以与MLDvl兼容。
2.2.1 工作原理
MLD协议的目的是使每一个组播路由器知道在本地链路上监听者对哪些组播地址和源地址感兴趣。被MLD收集到的信息提供给在路由器上运行的任何组播路由协议,来保证组播数据包被传递到组播组成员。组播路由器只需要知道在一个链路上,至少有一个节点正在监听从一个特定的源发给一个特定组播地址的数据包,它不需要知道有多少个这样的节点。
MLDv2是一个不对称的协议,它包括分离的两部分:针对组播地址侦听者部分(监听组播数据包的主机或者路由器)和组播路由器部分。它为组播地址侦听者和组播路由器定义了不同的行为。当执行“组播路由器”功能时,收集组播路由协议所需要的组播侦听者信息;当执行“组播地址侦听者”功能时,通知本身和其他邻居组播路由器他的侦听状态。需要注意的是,一个组播路由器可以本身是一个或者多个组播地址的侦听者,执行“组播路由器”和“组播地址侦听者”双重功能。 组播地址监听者在所有的支持组播的接口上执行MLDv2协议的“组播地址监听者”功能。 组播路由器在它的每一个接口上执行MLDv2协议的“组播路由器”功能。如果在同一个子网上具有不止一个组播路由器,组播路由器将运行查询者选举机制来选择一个组播路由器来充当查询路由器。在这个子网上的所有的组播路由器都在监听由组播地址监听者发送的消息,并且维护相同的组播监听信息状态,以便于当目前的查询路由器不能工作时,接替查询路由器的工作,但是只有查询路由器在子网上能够发送周期的消息和被触发的查询消息。
2.2.2 MLDv2报文格式
为了支持以上的功能,MLDv2除了兼容支持MLDvl所有的三种报文:组播侦听查询(MLD消息类型值为130),包括一般查询和特定组播地址查询:组播侦听报告(MLD消息类型值为131);组播侦听完成(MLD消息类型值为 132)外,还增加了MLDv2查询消息(一般的查询、特定组播地址查询,特定组播地址和源查询)和“侦听者报告”报文。“侦听者报告”报文是向邻居路由器报告当前的组播侦听状态,或者声明侦听状态变化情况。 综上,MLDv2消息中的所有消息如下: n 两种类型的MLDv2消息: l 组播侦听查询(类型值=130)
l Version 2组播侦听报告(类型值=143)
n 为保证和MLDvl的兼容,MLDv2还要支持以下两种消息: l Versionl组播侦听报告(类型值=131)[RFC2710] l versionl组播侦听完成(类型值=132)[RFC2710] 以下详细介绍两种类型的MLDv2消息内容。 a) MLDv2侦听查询消息
组播侦听查询消息是在请求状态的路由器发出来的,它用来查询邻居接口的侦听状态。它的消息格式如图2-24所示:
图2-24 MLDv2侦听查询消息
(1)编码
被发送者初始化为0,接收者被忽略。 (2)校验和
标准的ICMPv6校验和;算它,它需要计算整个消息,包括IPv6的伪造报头。为了计算它,首先把它设置为0。收到包后,要先验证后处理。 (3)最大响应延迟
最大响应延迟编码域指定了在发送响应报告的允许的最大延迟。实际时间叫做最大响应延迟,单位为毫秒。它们之间编码方式如下:
l 如果最大响应延迟编码<32768,则最大响应延迟=最大响应延迟编码。 l 如果最大响应延迟编码>=32768,则最大响应延迟编码构成如图2-25所示:
图2-25 最大响应延迟编码构成图
而且最大响应延迟=(mant | 0x1000) << (exp+3)。
值比较小的最大响应延迟允许MLDv2路由器调整“离开潜伏期”(链路上最后一个节点停止侦听某个特定的组播地址到路由协议认为对于这个地址没有侦听者的时间)。值比较大的最大响应延迟,尤其是编码的那些,是用来调整在链路上的爆炸性的MLD消息的传输。 (4)预留
被发送者初始化为0,被接收者忽略。 (5)组播地址
对于一般的查询消息,组播地址为0。对于特定组地址或者特定组地址和源的查询消息来说,组播地址被设置成需要查询的地址。 (6)S Flag(抑制路由器端的处理)
如果设置成1,则表示对于所有接收在收到查询消息时抑制计时器更新。不过,并不抑制选举查询者和主机端对一类查询消息的处理,这类查询是路由器请求实现组播侦听者的功能。 (7)QRV(查询者活跃变量)
如果非0,那么查询者活跃变量域包含查询者使用的活跃变量值。如果活跃变量大于7(查询者活跃变量域的最大值),查询者活跃变量域被设置为0。
路由器把近期收到的查询消息中的查询者活跃变量值设置为自己的活跃变量值,除非近期收到的查询消息中多数的查询者活跃变量值都为0。在多数的查询者活跃变量值都为0的清况时,就使用缺省值,或者静态配置特定的值。 (8)QQIC(查询者查询间隔编码)
查询者查询间隔编码域指定了查询者使用的查询间隔。实际间隔被叫作查询者查询间隔(QQI),它是以秒为单位的。它们之间的转换如下: l 如果QQIC<128,那么QQI=QQIC。
l 如果QQIC>=128,则查询者查询间隔编码构成如图2-26所示:
图2-26 查询者查询间隔编码构成图
而且QQI = (mant | 0x10) << (exp+ 3)。
不是当前查询者的组播路由器把最新收到的查询消息中的QQI值作为自己的查询间隔时间,除非近期收到的查询消息中多数的QQI值都为0。在都为0情况时,就使用缺省值 (9)源个数(N)
源个数(N)指出在当前处在查询的源地址的个数。在一般查询消息或者特定组播地址的查询消息中源个数都为0,在特定源和组地址的查询消息中不为0。源个数的大小由链路上可传输的最大报文决定。例如,在Ethernet上,可传输的最大报文是1500字节,携带路由警报选项的8字节的Hop-By-Hop扩展头和40字节的IPv6头一共48字节;源个数域前的MLD头共28字节,这样留给源个数域的有1424字节,所以源个数最大为89(1424/16)。 (10)源地址[i]
源地址[i]域是指向n的单播地址,n既是源个数域中的值。 (11)附加数据区
如果收到的查询消息中的IPv6头的负载长度域指定了需要有附加数据存在时,执行MLDv2时必须包含附加字节,用来确认收到MLD消息的校验和,否则就忽略附加字节。当发送查询消息时,一定不含附加消息。 (12)查询变量
查询消息中有三类查询变量:
l “一般查询消息”是查询路由器发出的,用来查询相连的链路上哪个组播地址有侦听者。组播地址和源个数都为0。
l “特定组地址查询消息”是查询路由器发出的,用来查询相连的链路上某个特定的组播地址是否有侦听者。在特定组地址查询消息中,包括希望查询的组地址,源个数为0。
l “特定组地址和源查询消息”是查询路由器发出的,用来查询相连的链路上某个特定的组播地址并且是来自特定的源的消息是否有侦听者。在特定组地址和源查询消息中,包括希望查询的组地址,源地址列表包含关注的源地址。 (13)查询消息源地址
所有MLDv2的查询消息的源地址为可用的IPv6链路本地地址。如果节点(路由器或主机)收到的来自不明的地址的查询消息,或者不是可用的IPv6链路本地地址时,它就丢弃这个消息,同时记录警报。
(14)查询消息目的地址
在MLDv2协议中,一般查询消息是发给链路内所有节点的地址的(FF02::1)。特定组地址查询消息和特定组地址和源查询消息都发给希望查询的组地址。同时节点必须接收和处理所有的IP目的地址是任意的单播或组播地址的查询消息,这样有利于调试。 MLDv2侦听查询报文在网络中传输完整的报文格式如图2-27:
图2-27 在网络中传输的MLDv2侦听查询报文
b) MLDv2组播侦听报告
MLDv2组播侦听报告是IP节点发送的,它可以用来向邻居报告当前的侦听状态和以身改变接口上的组播侦听状态。消息格式如图2-28所示:
图2-28MLDv2组播侦听报告报文
组地址记录的消息格式如图2-29所示:
图2-29 组地址记录的消息格式
(1) 类型字段,在MLDv2侦听报告置为143。 (2) 预留,被发送者初始化为0,被接收者忽略。 (3) 校验和
标准的ICMPv6校验和;它需要计算整个消息,包括IPv6的伪造报头。为了计算它,首先把它设置为0。收到包后,要先验证后处理。 (4) 组播地址记录个数(M)
组播地址记录个数(M)指出在当前侦听报告中的组播地址一记录的个数。 (5) 组播地址记录
组播地址记录是由来自报告发送的接口的发送者侦听每个组播地址的信息组成。具体记录如下: ① 记录类型
当前状态报告是用来在收到查询消息的接口上节点发出的消息。它报告接口对于每一个组地址的当前的侦听状态。以下两类,如表2-2所示
表2-2 当前状态报告类型
值 名字 作用 1 包括指明在当前的接口上对于特定的组地址的过滤模式是包括模式的。相应的源地址域是对模式 于特定的组地址的列表必须为非空。 排除指明在当前的接口上对于特定的组地址的过滤模式是排除模式的。如果组地址列表为非模式 空,则组地址域包含接口的对于特定组地址的源列表。 2
过滤模式变化报告是接点在本地的接口层对于特殊的组地址状态变化时引起的IPv6 Multicast Listen请求而发出的报告,这种报告无论源地址是否发生变化都要发送。只有状态变化的接口才发送这类的报告。以下两类,如表2-3所示: 表2-3 过滤模式变化报告
值 名字 3 作用 变为包指明在当前的接口上对于特定的组地址的过滤模式转变为包括模式的。如果组地址列括模式 表为非空,则组地址域包含接口的对于特定组地址的新的源列表。 变为排 指明在当前的接口上对于特定的组地址的过滤模式转变为排除模式的。如果组地址除模式 列表为非空,则组地址域包含接口的对于特定组地址的新的源列表。 4
源列表改变报告是节点发出的,当源列表改变,过滤模式和组地址不改变时会触发发送此消息。以下两类,如表2-4示
表2-4 源列表改变报告
值 名字 5 作用 允许新 指明在当前组地址记录中的源地址域需要增加新的源。若是在包含模式下,则把这些的源 源加入到列表中。若是在排除模式下,则把这些源从列表中删除。 6 阻止旧指明在当前组地址记录中的源地址域需要删除旧的源。若是在包含模式下,则把这些源的源 删除到列表中。若是在排除模式下,则把这些源从列表中删除加入。 ② 附加数据长度 附加数据长度域包含在当前在侦听报告中的附加数据长度,单位是字(32bits)。如果为0,则表示没有附加数据。 ③ 源个数(N) 源个数(N)指出在当前在侦听报告中的源地址记录的个数。 ④ 组播地址 组播地址域包含组播侦听报告中有的组播地址。 ⑤ 源地址[i]
源地址[i]域是指向n的单播地址,n既是源个数域中的值。 ⑥ 辅助数据区
如果存在辅助数据区,那么它是用来补充说明组播地址报告的。在MLDv2协议中没有定义间接寻址数据,所以不需要包括辅助数据区。因此设置辅助数据区为0,收到时也忽略。留出这样一部分辅助数据区是为了以后能够扩展MLD。
MLDv2组播侦听报告报文在网络中传输完整的报文格式如图2-30:
图2-30 在网络中传输的MLDv2组播侦听报告报文
2.2.3 MLDv2工作过程
MLDv2的工作过程可以分成三部分:一是侦听者端建立“组播侦听状态”;二是侦听者端和路由器端之间交换各种报文;三是路由器端建立侦听者状态列表。 a) 建立侦听状态
侦听者根据自身的需要指定它所感兴趣的组播组和组的源地址,建立自身的侦听状态,即加入列表或排除列表,然后主动或被动通知邻居组播路由器它的侦听状态。
侦听者执行MLDv2协议的“侦听部分”的功能。无论节点上的接口是否在同一链路上.每个接口上都会执行侦听者功能。运行在侦听节点上层的协议或者应用通过“套接字组播状态”函数IPv6 Multicast Listen告知接口启用或禁用组播功能。 IPv6Muhieast Listen的格式如下:
IPv6 MulticastListen(套接口,接口,IPv6组播地址,过滤模式,源列表)
套接口:用来区分节点内不同的组播请求实体(如进程用程序等)。 接口:表示一个本地网络接口.通过该接口可以启用或禁用组播功能。
IPv6组播地址:表示请求加入的组播地址。如果一个接口接收多于一个组播的分组,IPv6Multicast Listen就会被每个组播单独调用。
过滤模式:过滤模式分为“INCLUDEMODE”(包含模式)和“EXCLUDEMODE”(排除模式)两种。 源列表:一个无序的地址列表,可以为空。
除了“套接字组播状态”之外,节点必须维护或计算出每个接口的组播侦听状态,称为“接口组播状态”,表示为(IPv6组播地址,过滤模式,源列表)。“接口组播状态”从“套接字组播状态”推导出来。从“套接字组播状态”导出“接口组播状态”的一般规律如下:根据具有相同接口(IPv6组播地址)的“套接字组播状态”记录,推导出一个“接口组播状态”。
(1)若有“套接字组播状态”记录处于排除模式,那么“接口组播状态”的过滤模式就是“排除模式”,且“源地址列表”等于所有“排除模式”“套接字组播状态”记录中的源地址列表的交集,减去所有“包含模式”“套接字组播状态”记录中的源地址列表。
(2)若所有“套接字组播状态”记录都是“包含模式”,那么“接口组播状态”就是“包含模式”,且“源地址列表”等于所有“套接字组播状态”记录中源地址列表的并集。
侦听者通过上述算法可以建立起自己的“接口组播状态”。当接口收到组播分组之后,就会根据应用或者进程的“套接字组播状态”判断是否将数据分组传给上层。MLDv2报文不受源地址过滤影响,能够被所有的主机或路由器处理。 b) 交换各种报文
侦听者端和路由器端之间交换各种报文是协议的重要部分,在此过程中计时器会保持各个功能实体的可用性,若计时器到期会重新选举新的侦听者和查询器。
同一子网内的运行MLDv2协议的路由器首先通过1P地址最小的接口为查询接口的“查询器选举机制”选举出一台“查询器”(Querierrouter),其余的路由自然成为非查询路由器(Non-Querier router)。被当选为“查询器”的接口周期性的在子网内发布一般查询报文,触发性地发布特定组播地址查询报文和特定组播地址和源查询报文,查询邻居接口的组播侦听者发出的组播侦听状态路由器周期性地发送一般查询报文,以查询该链路上是否存在某组播地址的组成员。
在接收到收到路由器发送的一般查询报文后,节点经过[0,最大响应时间〕之间的随机时延后发出组播侦听报告,通过“当前状态报告”报告自己的“接口组播状态”。经过随机时延是为了防止所有的节点都在同一时间发出报告分组,从而避免网络的突发性阻塞。当侦听者端改变自己的接口组播状态时,如想要加入某个组播组时或改变对某个源的接收状态,就可以不必等待路由器的查询报文,而是直接向路由器发送报告报文。如果节点状态发生变化,会立刻发送并重传“状态变化报告”。在旧的“状态变化报告”重传过程中.如果又有新的状态变化发生,这个新的状态变化就会和原来的状态变化合并,然后组成新的“状态变化报告”重新发送,同时重置“重传次数”。节点新旧状态的变化引起的状态变化报告算法表如表2-5所示:
表2-5状态变化报告算法表
旧状态 包含(A) 排除(A) 包含(A) 排除(A)
新状态 包含(B) 排除(B) 排除(B) 包含(B) 状态改变报告 允许(B-A),阻止(A-B) 允许(A-B),阻止(B-A) 变成排除(B) 变成包含(B) 在表中A和B为源地址列表,“包含”和“排除”指的是接口过滤模式,“允许”的意思是希望侦听的新增的源地址列表,“阻止”的意思是希望不再侦听的旧的源地址列表。
路由器收到侦听者针对某组播的“状态变化报告”后,查询器会发送“组播地址指定查询”或者“组播地址和源地址指定查询”,以确定链路上是否还有其他侦听者,如果在“查询超时时钟”超时之前,收到其他侦听者的“当前状态报告”,则重置计时器。否则将修改相应的“组播侦听者状态”。 c) 建立侦听状态列表
通过侦听来自侦听者的报告报文,子网内所有路由器维持相同的“组播侦听状态”。当路由器收到链路上的报告分组时,如果报告地址不在路由器的列表上,则加入该项,否则计时器重新置位。路由器为它所在的每一条链路维护一个列表,除了组播地址列表外,还维护着每个组播地址相关的过滤模式、源地址列表、该地址相应的源计时器等信息。如果某个计时器过期,则把相应的表项从列表中删除。
通过收到的侦听者报告,路由器(包括查询器和非查询器)可以在其接口上建立自己的“组播侦听者状态”信息表。与侦听者不同,如果路由器有多个接口处于同一子网内,则只在其中一个接口建立“侦听者状态”信息。“侦听者状态”由过滤模式、过滤时钟和源地址列表三部分组成。如果链路上某一组播的所有侦听者都是“包含模式”。则接口处于该组播的“包含模式”,用INCLUDE(A)表示。其中A表示源地址列表,INCLUDE(A)称为“包含列表”。如果“包含模式”侦听者发送了包含特定源地址的“当前状态报告”或者“状态变化报告”,该源地址就会被加入到“包含列表”中。“包含列表”中每一个源地址都有“源地址时钟”,一旦“包含模式”侦听者发送报告证实自己在侦听着某一特定源地址.“源地址时钟”就会被更新。如果“包含列表”中的“源地址时钟”由于长时间得不到更新而到期,该源地址就会从“包含列表”中删除。这称为“软离开”机制。
除了“软离开”之外,还有一种“快速离开”机制。当“包含模式”侦听者通过“状态变化报告”声明不再侦听特定源地址时,链路上所有的路由器就会降低该源地址的“源地址时钟”。随后查询器会发出“组播地址和源地址指定查询”,用以验证该链路是否还有该源地址的侦听者。如果“源地址时钟”到期,该源地址就会从“包含列表”中删除。
如果链路上存在处于“排除模式”的侦听者,则接口处于该组播的“排除模式”。收到第一个“排除模式”侦听者的报文时起,路由器就设定该组播的“过滤时钟”。每当“排除模式”侦听者通过“当前状态报告”证实自己的侦听状态时,“过滤时钟”被更新。当一个“包含模式”侦听者,通过“状态变化报告”声明自
己变为“排除模式”时,该“过滤时钟”也会被更新。如果“过滤时钟”过期,路由器便将侦听者状态切换成“包含模式”。处于“排除模式”的路由器接口。侦听者状态由符号Exclude(X,Y)表示,其中X表示“请求列表”,Y表示“排除列表”。除了“排除列表”之外所有的源地址发出的组播分组,都会被路由器转发。虽然“请求列表”对于转发分组没有任何影响,但是路由器必须保持“请求列表”。原因如下: (1)为了标明“包含模式”侦听者所侦听的源地址。当链路中没有“排除模式”侦听者时,能及时将路由器转换成“包含模式”。这种转换不应该中断向该组播“包含模式”侦听者传输的数据流。当路由器切换成“包含模式”时。“请求列表”中的源地址被转移到“包含列表”中,“排除列表”被删除。
(2)用来对原来没有“排除”的源地址进行快速的“排除”。如果路由器接收到一个特定源地址请求的报告。源地址就会被加入到“请求列表”,源地址时钟被赋值.随后查询器发出“组播地址和源地址指定查询”。用以检测该链路上是否还有对这些源地址感兴趣的节点。如果源地址的时钟就会到期时。仍没有侦听者响应。这时,这些源地址就会从“请求列表”移到“排除列表”。从这时起,该源地址就会被路由器阻断[15]。