MLD简介
组播侦听者发现协议MLD(Multicast Listener Discovery)是负责IPv6组播成员管理的协议,用来在IPv6成员主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系。MLD通过在成员主机和组播路由器之间交互MLD报文实现组成员管理功能,MLD报文封装在IPv6报文中。
目的:
出现于IPv4时代的组播技术,有效解决了单点发送、多点接收的问题,实现了网络中点到多点的高效数据传送,能够大量节约网络带宽、降低网络负载。在IPv6网络中,组播技术的应用得到了进一步的丰富和加强。MLD可以理解为IGMP的IPv6版本,两者的协议行为完全相同,区别仅仅在于报文格式。
原理描述
MLD版本:
到目前为止,MLD有两个版本:
- MLDv1版本(由RFC 2710定义),对应IGMPv2。
- MLDv2版本(由RFC 3810定义),对应IGMPv3。
MLDv1的工作机制与IGMPv2相同,基于查询和响应机制完成对IPv6组播组成员的管理。MLDv2在MLDv1的基础上,**增加的主要功能是成员主机可以指定接收或不接收某些组播源的报文。**MLD两个版本在演进过程中对协议报文的处理是向前兼容的,即运行MLDv2的组播路由器可以识别MLDv1的协议报文。
所有MLD版本都支持ASM(Any-Source Multicast)模型。MLDv2可以直接应用于SSM(Source-Specific Multicast)模型,而MLDv1则需要MLD SSM Mapping技术的支持才可以应用于SSM模型。
MLDv1工作原理:
MLDv1的工作机制与IGMPv2相同,定义了查询器选举机制、普遍组查询和响应机制、新组成员加入机制以及离开组机制。
MLD查询器周期性地向本网段内所有主机和组播路由器发送普遍组查询报文,通过成员主机反馈的报告报文来维护组成员关系;当MLD查询器收到成员主机发送的针对某组的离开报文时,会发送特定组查询报文来了解网段内是否还存在该组的成员,如果没有则删除对应的组成员关系。MLD查询器根据组成员关系来决定是否将对应组的组播数据报文转发到该网段。
MLDv1报文:
MLDv1包括四种类型的报文:
- 普遍组查询报文(General Query):查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。
- 特定组查询报文(Multicast Address Specific Query):查询器向共享网段内指定组播组发送的查询报文,用于查询该组播组是否存在成员。
- 成员报告报文(Multicast Listener Report):主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。
- 成员离开报文(Multicast Listener Done):主机离开组播组时主动向查询器发送的报文,用于宣告自己离开了某个组播组。
字段解释说明:
字段 | 说明 |
---|---|
Type | 报文类型。该字段有以下三种取值:130:表示查询报文。包括普遍组查询报文和特定组查询报文两类。131:表示成员报告报文。132:表示成员离开报文。 |
Code | 该字段在发送时被设为0,并在接收时被忽略。 |
Checksum | 标准的ICMPv6校验和。 |
Maximum Response Delay | 最大响应时间。成员主机在收到MLD查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。该字段仅在MLD查询报文中有效。 |
Reserved | 保留字段。 |
Multicast Address | 组播组地址。 |
MLDv1工作机制:
查询器选举机制
当一个网段内有多台IPv6组播路由器时,由于它们都可以接收到主机发送的报告报文,因此只需要选取其中一台组播路由器发送查询报文就足够了,该组播路由器称为MLD查询器(Querier)。
如上图所示,查询器的选举过程如下:
-
最初,所有运行MLD的组播路由器(RouterA和RouterB)都认为自己是查询器,向本网段内的所有主机和组播路由器发送普遍组查询报文。
RouterA和RouterB在收到对方发送的普遍组查询报文后,将报文的源IPv6地址与自己的接口地址作比较。通过比较,IPv6地址最小的组播路由器将成为查询器,其他组播路由器成为非查询器(Non-Querier)。如上图所示,RouterA的接口地址小于RouterB,则RouterA当选为查询器,RouterB为非查询器。
-
此后,由MLD查询器(RouterA)向本网段内的所有主机和其他组播路由器发送普遍组查询报文,而非查询器(RouterB)不再发送普遍组查询报文。
非查询器(RouterB)上都会启动一个定时器(即其他查询器存在时间定时器Other Querier Present Timer)。在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。
普遍组查询和响应机制
通过普遍组查询和响应,MLD查询器可以了解到该网段内哪些组播组存在成员。
如上图所示,普遍组查询和响应过程如下:
-
MLD查询器发送目的地址为FF02::1(表示同一网段内所有主机和路由器)的普遍组查询报文;收到该查询报文的组成员启动定时器。
**普遍组查询报文是周期性发送的,**发送周期可以通过命令配置,**缺省情况下每隔125秒发送一次。**HostA和HostB是组播组G1的成员,则在本地启动定时器Timer-G1。缺省情况下,定时器的范围为0~10秒之间的随机值。
-
第一个定时器超时的组成员发送针对该组的报告报文。
假设HostA上的Timer-G1首先超时,HostA向该网段发送目的地址为G1的报告报文。HostB收到此报告报文,则停止定时器Timer-G1,不再发送针对G1的报告报文。这样报告报文被抑制,可以减少网段上的MLD报文的数量。
-
MLD查询器接收到HostA的报告报文后,了解到本网段内存在组播组G1的成员,则由IPv6组播路由协议生成( * ,G1)组播转发表项,“*”代表任意IPv6组播源。网络中一旦有组播组G1的数据到达路由器,将向该网段转发。
新成员加入机制
共享网段内有新组成员需要加入组播组时,会主动向MLD查询器发送报告报文,而不必等待普遍组查询报文的到来。
离开组机制
通过离开组机制,MLD查询器可以及时了解到网段内哪些组播组已不存在成员,从而及时更新组成员关系,减少网络中冗余的组播流量。
离开过程如下:
-
HostA向本地网段内的**所有组播路由器(目的地址为FF02::2)**发送针对组G1的离开报文(Done)。
-
查询器收到离开报文,会发送针对组G1的特定组查询报文。发送间隔和发送次数可以通过命令配置,缺省情况下每隔1秒发送一次,共发送两次。同时查询器启动组成员关系定时器(Timer-Membership = 发送间隔 × 发送次数)。
-
该网段内还存在组G1的其他成员(HostB),这些成员在收到查询器发送的特定组查询报文后,会立即发送针对组G1的报告报文。查询器收到针对组G1的报告报文后将继续维护该组成员关系。
如果该网段内不存在组G1的其他成员,查询器将不会收到针对组G1的报告报文。在Timer-Membership超时后,查询器将删除记录的(*,G1)组信息。当有组G1的组播数据到达查询器时,查询器将不会向下游转发。
MLDv2工作原理:
MLDv1报文中只能携带组播组的信息,不能携带组播源的信息,这样运行MLDv1的成员主机在加入组时无法选择加入哪个指定源的组。MLDv2解决了这个问题。运行MLDv2的成员主机不仅能够选择组播组,还能够根据需要选择接收哪些组播源的数据。同时,与MLDv1的成员报告只能携带一个组播组信息相比,MLDv2报文可以携带多个组播组信息,这就大大减少了成员主机与查询器之间交互的报文数量。
MLDv2报文:
与MLDv1相比,MLDv2报文的变化如下:
- MLDv2报文包含两大类:查询报文和成员报告报文。MLDv2没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。
- 查询报文中不仅包含普遍组查询报文和特定组查询报文,还新增了特定源组查询报文(Multicast Address and Source Specific Query)。该报文由查询器向共享网段内特定组播组成员发送,用于查询该组成员是否愿意接收特定源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。
- 成员报告报文不仅包含主机想要加入的组播组,而且包含主机想要接收来自哪些组播源的数据。MLDv2增加了针对组播源的过滤模式(INCLUDE/EXCLUDE),将组播组与源列表之间的对应关系简单的表示为(G,INCLUDE,(S1、S2…)),表示只接收来自指定组播源S1、S2…发往组G的数据;或(G,EXCLUDE,(S1、S2…)),表示接收除了组播源S1、S2…之外的组播源发给组G的数据。当组播组与组播源列表的对应关系发生了变化,MLDv2报告报文会将该关系变化存放于组播地址记录(Multicast Address Record)字段,发送给MLD查询器。
- Type:报文类型。取值为130,表示查询报文。MLDv2的查询报文包括普遍组查询报文、特定组查询报文和特定源组查询报文三类。
- S: 该比特位为1时,所有收到此查询报文的其他路由器不启动定时器刷新过程,但是此查询报文并不抑制查询器选举过程和路由器的主机侧处理过程。
- QRV: 如果该字段非0,则表示查询器的健壮系数(Robustness Variable)。如果该字段为0,则表示查询器的健壮系数大于7。路由器接收到查询报文时,如果发现该字段非0,则将自己的健壮系数调整为该字段的值;如果发现该字段为0,则不做处理。
- QQIC: MLD查询器的查询间隔,单位为秒。非查询器收到查询报文时,如果发现该字段非0,则将自己的查询间隔参数调整为该字段的值;如果发现该字段为0,则不做处理。
MLDv2工作机制:
在工作机制上,与MLDv1相比,MLDv2增加了主机对组播源的选择能力。
特定源组加入
MLDv2的成员报告报文的目的地址为FF02::16(表示本地网段内所有使能MLDv2的路由器)。通过在报告报文中携带组播地址记录,主机在加入组播组的同时,能够明确要求接收或不接收特定组播源发出的组播数据。
MLD SSM Mapping:
SSM(Source-Specific Multicast)称为指定源组播,要求路由器能了解成员主机加入组播组时所指定的组播源。如果成员主机上运行MLDv2,可以在MLDv2报告报文中直接指定组播源地址。但是某些情况下,成员主机只能运行MLDv1,为了使其也能够使用SSM服务,组播路由器上需要提供MLD SSM Mapping功能。
MLD SSM Mapping的机制是:通过在组播路由器上静态配置SSM地址的映射规则,将MLDv1报告报文中的(*,G)信息转化为对应的(G,INCLUDE,(S1,S2…))信息,以提供SSM组播服务。
MLD命令行配置
mld enable
//在接口上使能MLD功能。
mld lastlistener-queryinterval 1
//在接口上配置MLD查询器在收到成员主机发送的离开报文时,
//发送特定组\源组查询报文的时间间隔。
mld limit
//当前接口可以维护MLD组成员关系的最大个数。
mld max-response-time
//接口上配置MLD普遍组查询报文的最大响应时间。
mld prompt-leave
//在接口上配置组播组成员快速离开功能
mld require-router-alert
//配置丢弃不包含Router-Alert选项的MLD报文
mld send-router-alert
//设置接口上发送的MLD报文在IPv6报文头里包含Router-Alert选项。
//缺省情况下,设备接口上发送包含Router-Alert选项的MLD报文。
mld ssm-mapping enable
//在接口上使能MLD SSM Mapping功能。
mld timer query 125
//配置MLD普遍组查询报文的发送时间间隔。
参考文档:华为HedEx文档