MLD是Multicast Listener Discovery Protocol(组播侦听者发现协议)的简称,它用于IPv6路由器在其直连网段上发现组播侦听者。组播侦听者(Multicast Listener)是那些希望接收组播数据的主机节点。
路由器通过MLD协议,可以了解自己的直连网段上是否有IPv6组播组的侦听者,并在数据库里做相应记录。同时,路由器还维护与这些IPv6组播地址相关的定时器信息。
MLD路由器使用IPv6单播链路本地地址作为源地址发送MLD报文。MLD使用ICMPv6(Internet Control Message Protocol for IPv6,针对IPv6的互联网控制报文协议)报文类型。所有的MLD报文被限制在本地链路上,跳数为1。
到目前为止,MLD有两个版本:
l MLDv1(由RFC 2710定义),源自IGMPv2
l MLDv2(由RFC 3810定义),源自IGMPv3
所有版本的MLD协议都支持ASM(Any-Source Multicast,任意信源组播)模型;MLDv2可以直接应用于SSM(Source-Specific Multicast,指定信源组播)模型,而MLDv1则需要在MLD SSM Mapping技术的支持下才能应用于SSM模型。
MLDv1主要基于查询和响应机制完成对IPv6组播组成员的管理。
当一个网段内有多台IPv6组播路由器时,由于它们都能从主机那里收到MLD成员关系报告报文(Multicast Listener Report Message),因此只需要其中一台路由器发送MLD查询报文(Query Message)就足够了。这就需要有一个查询器(Querier)的选举机制来确定由哪台路由器作为MLD查询器,其选举过程如下:
(1) 所有MLD路由器在初始时都认为自己是查询器,并向本地网段内的所有主机和路由器发送MLD普遍组查询(General Query)报文(目的地址为FF02::1);
(2) 本地网段中的其它MLD路由器在收到该报文后,将报文的源IPv6地址与自己的接口地址作比较。通过比较,IPv6地址最小的路由器将成为查询器,其它路由器成为非查询器(Non-Querier);
(3) 所有非查询器上都会启动一个定时器(即其它查询器存在时间定时器Other Querier Present Timer)。在定时器超时前,如果收到了来自查询器的MLD查询报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。
图1 MLD查询响应示意图
如图1所示,假设Host B与Host C想要收到发往IPv6组播组G1的IPv6组播数据,而Host A想要收到发往IPv6组播组G2的IPv6组播数据,那么主机加入IPv6组播组以及MLD查询器(Router B)维护IPv6组播组成员关系的基本过程如下:
(1) 主机会主动向其要加入的IPv6组播组发送MLD成员关系报告报文以声明加入,而不必等待MLD查询器发来的MLD查询报文;
(2) MLD查询器(Router B)周期性地以组播方式向本地网段内的所有主机和路由器发送普遍组查询报文(目的地址为FF02::1);
(3) 在收到该查询报文后,关注G1的Host B与Host C其中之一(这取决于谁的延迟定时器先超时)——譬如Host B会首先以组播方式向G1发送MLD成员关系报告报文,以宣告其属于G1。由于本地网段中的所有主机都能收到Host B发往G1的报告报文,因此当Host C收到该报告报文后,将不再发送同样针对G1的报告报文,因为MLD路由器(Router A和Router B)已知道本地网段中有对G1感兴趣的主机了。这个机制称为主机上的MLD成员关系报告抑制机制,该机制有助于减少本地网段的信息流量;
(4) 与此同时,由于Host A关注的是G2,所以它仍将以组播方式向G2发送报告报文,以宣告其属于G2;
(5) 经过以上的查询和响应过程,MLD路由器了解到本地网段中有G1和G2的成员,于是由IPv6组播路由协议(如IPv6 PIM)生成(*,G1)和(*,G2)组播转发项作为IPv6组播数据的转发依据,其中的“*”代表任意IPv6组播源;
(6) 当由IPv6组播源发往G1或G2的IPv6组播数据经过组播路由到达MLD路由器时,由于MLD路由器上存在(*,G1)和(*,G2)组播转发项,于是将该IPv6组播数据转发到本地网段,接收者主机便能收到该IPv6组播数据了。
当一个主机离开某IPv6组播组时:
(1) 该主机向本地网段内的所有IPv6组播路由器(目的地址为FF02::2)发送离开组(Done)报文;
(2) 当查询器收到该报文后,向该主机所声明要离开的那个IPv6组播组发送特定组查询(Multicast-Address-Specific Query)报文(目的地址字段和组地址字段均填充为所要查询的IPv6组播组地址);
(3) 如果该网段内还有该IPv6组播组的其它成员,则这些成员在收到特定组查询报文后,会在该报文中所设定的最大响应时间(Maximum Response Delay)内发送成员关系报告报文;
(4) 如果在最大响应时间内收到了该IPv6组播组其它成员发送的成员关系报告报文,查询器就会继续维护该IPv6组播组的成员关系;否则,查询器将认为该网段内已无该IPv6组播组的成员,于是不再维护这个IPv6组播组的成员关系。
MLDv2的原理与MLDv1基本相同,并新增了以下特性:
MLDv2增加了针对IPv6组播源的过滤模式(INCLUDE/EXCLUDE),使主机在加入某IPv6组播组G的同时,能够明确要求接收或拒绝来自某特定IPv6组播源S的IPv6组播信息。当主机加入IPv6组播组时:
l 若要求只接收来自指定IPv6组播源如S1、S2、……发来的IPv6组播信息,则其报告报文中可以标记为INCLUDE Sources(S1,S2,……);
l 若拒绝接收来自指定IPv6组播源如S1、S2、……发来的IPv6组播信息,则其报告报文中可以标记为EXCLUDE Sources(S1,S2,……)。
如图2所示,网络中存在Source 1(S1)和Source 2(S2)两个IPv6组播源,均向IPv6组播组G发送IPv6组播报文。Host B仅对从Source 1发往G的信息感兴趣,而对来自Source 2的信息没有兴趣。
图2 指定源组的IPv6组播流路经
如果主机与路由器之间运行的是MLDv1,Host B加入IPv6组播组G时无法对IPv6组播源进行选择,因此无论Host B是否需要,来自Source 1和Source 2的IPv6组播信息都将传递给Host B。
当主机与路由器之间运行了MLDv2之后,Host B就可以要求只接收来自Source 1、发往G的IPv6组播信息(S1,G),或要求拒绝来自Source 2、发往G的IPv6组播信息(S2,G),这样就只有来自Source 1的IPv6组播信息才能传递给Host B了。
运行MLDv2的组播路由器按每条直连链路上的组播地址(per multicast address per attached link)来保持IPv6组播组的状态。IPv6组播组的状态包括:
l 过滤模式:保持对INCLUDE或EXCLUDE的状态跟踪。
l 源列表:保持对新增或删除IPv6组播源的跟踪。
l 定时器:表示IPv6组播地址超时后切换到INCLUDE模式的过滤定时器、关于源记录的源定时器等。
运行MLDv2的组播路由器通过侦听接收者主机的状态,记录和维护网段上加入到源组的主机的信息。
下面以MLDv2为例对MLD的报文类型进行介绍:
MLD查询器通过发送MLD查询报文来了解相邻接口的组播侦听状态。MLD查询报文的格式如图3所示,图中深蓝色部分为MLDv1的报文格式,各字段的含义如表1所示。
图3 MLDv2查询报文格式
表1 MLDv2查询报文各字段含义
字段 | 描述 |
Type = 130 | 报文类型,130代表查询报文 |
Code | 初始化为0 |
Checksum | 标准的IPv6校验和 |
Maximum Response Delay | 主机发送报告报文前允许的最大响应时间 |
Reserved | 保留字段,初始化为0 |
Multicast Address | l 普遍组查询中,此字段设置为0 l 特定组或特定源组查询中,此字段设置为待查询的IPv6组播组地址 |
S | 标识位,表示路由器接收到查询报文后是否对定时器更新进行抑制 |
QRV | 查询器的健壮性变量(Querier’s Robustness Variable) |
QQIC | 查询器发送普遍组查询报文的查询间隔(Querier’s Query Interval Code) |
Number of Sources | l 普遍组查询或特定组查询中,此字段设置为0 l 特定源组查询中,此字段表示查询报文中包含的源地址个数 |
Source Address( i ) | 特定源组查询中的IPv6组播源地址(i=1, 2, …, n,其中n表示源地址的个数) |
主机通过发送MLD报告报文来汇报当前的组播侦听状态。MLD报告报文的格式如图4所示,各字段的含义如表2所示。
图4 MLDv2报告报文格式
表2 MLDv2报告报文各字段含义
字段 | 描述 |
Type = 143 | 报文类型,143代表报告报文 |
Reserved | 保留字段,发送时设置为0,接收时忽略此值 |
Checksum | 标准的IPv6校验和 |
Number of Multicast Address Records | IPv6组播地址记录的个数 |
Multicast Address Record( i ) | 组播地址记录,表示主机在接口上侦听到的每个IPv6组播地址信息,包括记录类型、IPv6组播地址、IPv6源地址等(i=1, 2, …, m,其中m表示IPv6组播地址记录的个数) |
MLD SSM Mapping通过在路由器上配置SSM静态映射规则,从而为运行MLDv1的接收者主机提供对SSM模型的支持。
SSM模型要求在接收者主机所在的网段,路由器能够了解主机加入IPv6组播组时所指定的IPv6组播源。如果接收者主机上运行的是MLDv2,则可以在MLDv2的报告报文中直接指定IPv6组播源的地址;如果某些接收者主机只能运行MLDv1,则在MLDv1的报告报文中无法指定IPv6组播源的地址。这种情况下需要通过在路由器上配置MLD SSM Mapping功能,将MLDv1报告报文中所包含的(*,G)信息映射为(G,INCLUDE,(S1,S2...))信息。
在如图5所示的IPv6 SSM网络中,Host A、Host B和Host C上分别运行MLDv1和MLDv2。在不允许将Host A和Host B升级为MLDv2的情况下,若要为Host A和Host B也提供SSM组播服务,则需在Router A上配置MLD SSM Mapping功能。
配置完成后,当Router A收到来自主机的MLDv1报告报文时,首先检查该报文中所携带的IPv6组播组地址G,然后根据检查结果的不同分别进行处理:
(1) 如果G不在IPv6 SSM组地址范围内,则提供ASM组播服务。
(2) 如果G在IPv6 SSM组地址范围内:
l 若Router A上没有G对应的MLD SSM Mapping规则,则无法提供SSM组播服务,丢弃该报文;
l 若Router A上有G对应的MLD SSM Mapping规则,则依据规则将报告报文中所包含的(*,G)信息映射为(G,INCLUDE,(S1,S2...))信息,可以提供SSM组播服务。
& 说明:
MLD SSM Mapping不对MLDv2的报告报文进行处理。
在一些简单的树型网络拓扑中,边缘设备上并不需要运行复杂的IPv6组播路由协议(如IPv6 PIM),可以通过在这些设备上配置MLD Proxying(MLD代理)功能,使其代理下游主机来发送MLD报文及维护组成员关系,并基于该关系进行IPv6组播转发。在上游设备看来,配置了MLD Proxying功能的设备(称为MLD代理设备)不再是一个IPv6 PIM邻居,而只是一台主机。
如图6所示,MLD Proxying模型中定义了以下两种接口类型:
l 上行接口:又称代理接口,指MLD代理设备上运行MLD Proxying功能的接口,即朝向组播分发树树根方向的接口。由于该接口执行MLD协议的主机行为,因此也称为主机接口(Host Interface)。
l 下行接口:指MLD代理设备上除上行接口外其它运行MLD协议的接口,即背向组播分发树树根方向的接口。由于该接口执行MLD协议的路由器行为,因此也称为路由器接口(Router Interface)。
MLD代理设备上维护着一个组成员关系数据库(Membership Database),将所有下行接口维护的组成员关系记录都存到这个数据库中。组成员关系记录的结构如下:(Multicast-address,Filter-mode,Source-list),每条记录都是各下行接口上具有相同组地址的成员关系记录的合集。
上行接口正是依据这个数据库来执行主机行为——当收到查询报文时根据当前数据库状态响应报告报文,或者当数据库变化时主动发送报告或离开报文;而下行接口则执行路由器行为——参与查询器的选举、发送查询报文并根据报告报文维护组成员关系等。