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所示: