MLDv2 简介

MLDv2乃从IGMPv3衍生而来,可兼容MLDv1 MLDv2涵盖MLDv1既有功能,除了指定欲聆听的multicast 地址以外,并且增加source list(来源地址列表)以及filter mode可过滤multicast封包的来源地址。 Filter mode可设为INCLUDEEXCLUDE,分别与source list组合形成白名单或者黑名单。白名单只接收source list中所指定的来源封包,其它都不接收。黑名单则除了不接收source list中所指定的来源封包,其它都接收。

MLDv2 协议概述

MLDv2使router能够查询每个link上有哪些multicast 封包和来源地址有listener,并且保持每个multicast addressListening state。再透过Multicast Routing Protocol,与邻近的其它routers交换这些讯息,以确保multicast封包能适当地传送(或实时阻断)到所有multicast listeners连接的网段。
本章节不赘述MLDv2MLDv1相同的部分。主要着重于如何建立及处理Multicast Address Listening state
u  Listeners如何建立Listening state
u  QuerierListeners如何交换MLDv2讯息
u  Routers如何处理Listener 发送的report以及建立Listener state

Listeners如何建立Listening State

n  Listeners系统中运行的应用程序透过特定的service calls,要求IP层接收或者停止接收指定的multicast封包。随着应用程序呼叫service call,会产生并且保持个别的socket Listening state。同时,Listener必须依据每个interface的所有socket Listening state,计算并且保持个别的interface listening state 概念上, socketinterface两者的listening state格式相同。listening state包含每个欲聆听的multicast封包的record 每笔record包括multicast address filter modesource listFilter mode可以是INCLUDE(对应的source list为白名单)或者EXCLUDE(对应的source list为黑名单)。

n  每个interface中,一个multicast address最多只能存在一笔记录。Listener依据interface Listening state将相关信息报告给RouterRouter依据listeners报告的信息,汇整计算出整个link上的Listener state,以确保能适当地转送multicast封包。当listenerIP层接收到multicast 封包时,会依据socket listening state做过滤处理,再决定是否将封包内容传送给socket对应的应用程序。
Router根据整个link上所有interfaceslistening state,汇整计算出整个linklistener state,只要存在listenermulticast封包就会被转送到该link。即使把某个source address 列为黑名单,只要有其它interface宣告欲接收该source address,此multicast封包还是会被routers导入此link。因此,每个interface依据socket listening state做过滤处理是必要的动作。

Querier Listeners之间交换MLDv2讯息

n   Querier利用MLDv2Query message来建立和更新Listening state Query message分为3种类型:
General Queries  定期性的询问,listeners会将目前的listening state回报routers
Multicast Address Specific Queries  Querier收到停止聆听某个multicast addressReport,就会马上发送Multicast Address Specific Queries询问是否还有其它listener聆听此multicast address
Multicast Address and Source Specific Queries  Querier收到停止聆听某个multicast address以及特定来源地址的Report时,就会马上发送Multicast Address and Source Specific Queries询问是否还有其它listener聆听此multicast address的特定来源地址。
n   Listener发送的Report分为2种:
Current State Report  Querier利用General Query message定期地向所有的listeners询问其目前的listening statelistener则将目前的listening state,透过Current State Report messages响应给link上所有的routers 如果Querier发送的是Multicast Address Specific QueriesMulticast Address and Source Specific Querieslistener仅回报与其相关的listening state
State Change Report  如果Listenerinterface listening state发生变化,会立即将变化的部分,透过State Change Report message报告给routers State Change Report可能包括Filter Mode Change recordsSource List Change records,或者两种record皆包括。
n  为了强化MLDv2 messages封包传送的可信度,每个State Change Report message会重复传送多次,尽量降低封包丢失的可能性。重传的次数取决于所谓的Robustness变量,这个变量是依据预期link传送封包时可能掉失的次数去设定。RFC 3810指定Robustness变量的默认值为2
n  为了避免加重link承载负担,周期性的General Queries Current State Reports不做多次重复传送。一般情况下,只要State Change Report没发生丢失,这类messagesstate change无关,其主要目的是更新目前的listening state。即使这类message发生丢失,在下一个周期还是会更新。
n  State Change Report message整个重复传送完成前,恰巧interface listening state又发生变化,此情况下会立即触发新的State Change Report message发送。(如何将“正在传送的State Change Report”以及“刚发生的变化”合并成新的State Change Report,请参考章节 Interface State发生变化时需要做的处理”。)
n  Querier收到State Change Report,其内容为不再聆听某个multicast address或者来源地址时, Querier必须先查询是否还有其它listener后,才可以决定从listening state删除该multicast address或从对应的source list中删除来源地址。Querier利用发送Multicast Address Specific Query询问指定的multicast address是否还有其它listener存在。同样地,Querier也利用发送Multicast Address and Source Specific Query询问指定的multicast address及其来源地址是否有其它listener
n  Multicast Address Specific Queries Multicast Address and Source Specific Queries只用于回应State Change Reports ,绝不可用于回应Current State Reports
n  listener接收到Multicast Address Specific Queries Multicast Address and Source Specific Queries时,只要其interface listening staterecord符合条件,就会将相关的listening state透过Current Listening state Report回报给routers
n  如前所述,为了保证MLDv2 protocol的健壮性。除了General Query,所有的Query messages及相对响应的Reports必须重复传送多次,传送次数由Robustness变量决定。如果整个重复传送完成前,又有另一新的Query产生(由于Querier接收到State Change report),此时必须把 “正在传送的Query”及“新的Query”合并成新的Query message发送。(如何将“正在传送的Query”以及“新的Query”合并成新的Query message发送,请参考章节“生成和发送Specific Queries”。)
n  透过使用S flagSuppress Router-Side Processing)也增强MLDv2的健壮性。当发送Multicast Address SpecificMulticast Address and Source Specific Query时,会重复发送多次。第一次的发送会将S flag域值设为0,同时Querier缩短Multicast address(或来源地址)对应的timer值,其目的是以较短的定时器可以快速将此Multicast address(或来源地址)从listening state中删除。如果timer到期前收到其它listener的响应,timer值会更新成原始设定值。Non-Querier收到Querier发送的Query message也会做跟Querier同样的动作(缩短timer值等)。然而 ,在等待下一个重复发送的query封包发送前, Querier有可能收到listenerReport。此时,未送完的Query仍需按照原计划完成,且将S flag值设为1,其目的是告知Non-Querier抑制上述的动作(即缩短timer时间),以便于跟Querierlistener state同步。

Routers如何建立Multicast Address Listener State

n  Router在每个连接的link上维护每个multicast address的状态称为Multicast Address Listener state Listener state包含multicast address及对应的Filter ModeFilter Timer以及Source ListSource list中的每个来源地址也配置了timerFilter mode可能是INCLUDEEXCLUDE
n  当接收到同一个multicast address所有的Report messagesFilter mode都是INCLUDE时,router才会将Filter mode设为INLCUDE。此时,该multicast addresslistener state符号表示法为: INCLUDE(A) 。其中A为来源地址的列表,称为“INCLUDE List”。INCLUDE List汇总link上所有listeners欲聆听的来源地址。符合这些来源地址的封包将被routers转送到这个link
n  如果有listenerINCLUDE mode(包含来源地址)发送Current State State Change Report ,这些来源地址就会被添加到routers目前的INCLUDE List ,同时更新对应的timer值。如果某个timer到期,则其对应的来源地址会从INCLUDE List中删除。
n  除了上述的“soft leave”机制,MLDv2还有“fast leave”的巧思,这是基于对timer的巧妙使用。当某个listenerINCLUDE mode表示想停止聆听指定的来源地址时,link上所有的routers缩短目前INCLUDE list中对应的timer值。然后Querier发送Multicast Address and Source Specific 来查询是否还有其它listener聆听此来源地址。如果有收到其它listenerreport,则还原对应的timer到原始设定值。如果没收到其它listenerreport,由于timer值已被缩短 ,将加速timer到期 ,进而达到快速将来源地址从INCLUDE List中删除的机制。
n  只要收到其中一个Report messagesFilter modeEXCLUDE时,router就会将multicast addressFilter mode设为EXCLUDE。当第一次收到EXCLUDE modereport时,routers启动设置该multicast address对应的Filter Timer 。每次收到EXCLUDE modeCurrent State Report时,此Filter Timer值就会被重置。当listener发送State Change Report,并将原来为INCLUDE mode换成EXCLUDE mode时,此Filter Timer值也会被更新。如果此Filter Timer到期 ,即代表不存在任何listener使用EXCLUDE mode,此时routers会将Filter mode切换成INCLUDE
n  multicast addressEXCLUDE mode时, multicast addresslistener state符号表示法为: EXCLUDE(X, Y),其中X称为“Requested List”,Y称为“Exclude List”。除了在Exclude List中的来源地址,其它所有的来源地址封包都将被routers转送到listenerslink Request List对封包的转送不具任何作用。然而,routers必须维护Requested List2个主要原因如下:
1.       保持追踪INCLUDEListener state :  可保证routers顺畅地从EXCLUDE mode切换到INCLUDE mode。切换成INCLUDE时,Requested List至少必须包括接收到的INCLUDE modereport中的所有来源地址 ,才能保证切换到INCLUDE mode后这些来源地址的封包不被阻断转送。当routers切换到INCLUDE mode时,Requested List中的来源地址被移到INCLUDE ListExclude List则被删除。

2.       快速阻断无listener封包 当某个listener透过State Change Report表示停止接收某些来源地址时,routers会将此来源地址添加到Requested List,且设定较小的值启动对应的timer。同时Queriery发送Address and Source Specific Query以检查是否这些来源地址还有其它listener。如果有其它listener响应则关掉timer。否则timer终将到期,这些来源地址从Requested List中移至Exclude List,此来源地址实时被router阻断转送。
INCLUDE mode不需要启动Filter Timer,只要INCLUDE list变成空集合,即视同没有任何listener存在并且删除该Record

The Service Interface for Listener

RFC 3810定义了概念性service interface,让上层protocol或者应用程序能透过呼叫它来请求IP层开始或停止接收指定的multicast封包。其格式如下:
IPv6MulticastListen (socket,
                                 interface,
                                 IPv6 multicast address,
                                 filter mode,
                                 source list)
socket用于区别呼叫service interface的应用程序。在同一个socketinterfaceIPv6 multicast address的组合下,后续的service interface呼叫,其filter modesource list的设定值将完全取代前一个呼叫。
MLDv1不支持过滤来源地址,只进行简单的service interface Start ListeningStop Listening 新的service interface可做等同效果操作如下:
Start Listening等于:
IPv6MulticastListen (socket,
                                 interface,
                                 IPv6 multicast address,
                                     EXCLUDE,
                                    { } )
Stop Listening等于:
IPv6MulticastListen (socket,
                                 interface,
                                 IPv6 multicast address,
                                     INCLUDE,
                                    { } )
{ }表示空的source list


Listener维护的Multicast Listening State

Per-socket state

每个socket state记录以下数据:
( interface, IPv6 multicast address, filter mode, source list )
呼叫IPv6MulticastListen时,其响应的socket state记录如下:
Ø  如果filter mode设为INCLUDEsource list设为空集合,则代表删除interfaceIPv6 multicast address对应的记录。如果此笔记录存在,则删除此记录。如果不存在,则此操作视同无效。
Ø  如果filter mode设为EXCLUDE或者source list设为非空集合,则代表新增或更新interfacemulticast address对应的记录。 如果此笔记录存在,则更新filter modesource list内容。如果不存在,则新增一笔记录。

Per-interface state

除了socket statelistener必须依据interface内所有的socket state计算且保持每个interface state。每个interface里,一个multicast address最多只能存在一笔记录。其格式如下:
(IPv6 multicast address, filter mode, source list)
假设有2个应用程序分别对interfacei”及 multicast addressm”做了以下操作:
IPv6MulticastListen ( s1, i, m, INCLUDE, {a, b, c} )
IPv6MulticastListen ( s2, i, m, INCLUDE, {b, c, d} )
为了同时满足这2sockets的要求,listener必须要求router转送此multicast address且来源地址为a b cd 。因此 ,在这个例子中,interface ilistening state的记录应该为:(mINCLUDE{a, b, c, d} )。当收到来源地址bc的封包时,IP层会将封包传送给s1s2。来源地址为a的封包只传送给s1,来源地址为d的封包只传送给s2
从每个socket state导出interface state的一般规则如下:
Ø  只要socket state中有一笔记录是EXCLUDE modeinterface statefilter mode即为EXCLUDE 且其source list为所有socket stateEXCLUDE的记录的source list的交集,再减去所有socket stateINCLUDE的记录的source list。例如,假设socket state的记录如下:
from socket s1:  ( i, m, EXCLUDE, {a, b, c, d} )
from socket s2:  ( i, m, EXCLUDE, {b, c, d, e} )
from socket s3:  ( i, m, INCLUDE, {d, e, f} )
则对应的interface state的记录为:
( m, EXCLUDE, {b, c} )
如果第4socket state被创建如下:
From socket s4:  ( i, m, EXCLUDE, { } )
则对应的interface state的记录变成:
( m, EXCLUDE, { } )
Ø  如果所有socket state的记录皆为INCLUDE modeinterface statefilter mode即为INCLUDE,且其source list为所有socket state记录的source list的联集。例如,假设socket state的记录如下:
         from socket s1:  ( i, m, INCLUDE, {a, b, c} )
         from socket s2:  ( i, m, INCLUDE, {b, c, d} )
         from socket s3:  ( i, m, INCLUDE, {e, f} )
则对应的interface state的记录为:
( m, INCLUDE, {a, b, c, d, e, f} )


MLDv2 Packet Structure

MLDv2 packet structureMLDv1一样,message封包由IPv6表头、Hop-by-Hop Options扩充表头及MLD message组成如下:





MLDv2 Message Format

MLDv2 messages共有2种类型:
1.     重新定义Multicast Listener Query (Type = 130)
MLDv2除了沿用MLDv1Multicast Listener Query (Type = 130),并在其后增加与来源地址相关的字段。所以MLDv1仍可识别MLDV2发出的Query message的原始部分。 MLDv2接收到MLDv1发出的Query message,可依其长度识别为MLDv1 message 并且假设来源地址字段为: EXCLUDE modesource list为空集合。 因此MLDv1MLDv2使用的Query message可兼容。
2.     新增Version 2 Multicast Listener Report (Type = 143)
为了能兼容MLDv1MLDv2的实现必须支持接收以下MLDv1 message类型:
Multicast Listener Report (Type = 131)
Multicast Listener Done (Type = 132)

Multicast Listener Query Message

Multicast Listener Query Message的格式如下:


















Code  固定设为0。接收端忽略其内容。
Checksum  ICMPv6 checksum域值。
Maximum Response Delay   它指定listeners回报Report message的最大延迟时间,单位为毫秒。此延迟时间的表示法如下:
如果Maximum Response Delay < 32768,则最大延迟时间 = Maximum Response Delay域值。

如果Maximum Response Delay >= 32768,则Maximum Response Delay为浮点表示法如下:




小的最大延迟时间值允许router调谐“leave latence”时间,即 -- 当有个listener通知停止聆听某个multicast封包流时,router侦测此multicast封包流不存在其它listener所需要的时间。
大的最大延迟时间值,尤其是浮点表示法可用来调谐突发性的MLD流量
Reserved  固定设为0。接收端忽略其内容。
Multicast Address  General Query messages中,此字段设为0。在Multicast Address Specific Query messages或者Multicast Address and Source Specific Query messages中,此字段设成routers欲查询的multicast address
S flag  Suppress Router-Side Processing。设为1时,Non-Queriery将抑制对接收到Query message的处理。

QRV  Querier's Robustness Variable。如果值不为0,则此字段包含了Querier所使用的 Robustness Variable 设定值。如果Querier的【Robustness Variable】设定值大于7,则QRV域值必须设为0Non-Querier采用最近接收到的Query信息的QRV值为自己的【Robustness Variable】设定值。除非最近收到的QRV值为0,这种情况下,Non-Querier将采用自己的默认值。
QQIC  Querier's Query Interval Code。此字段指明Querier所使用的【Querier Interval 设定值,时间单位为秒。实际的的间隔时间称为Querier's Query IntervalQQI),根据Querier's Query Interval Code域值来产生,方法如下:
如果QQIC < 128, QQI = QQIC值。

如果QQIC >= 128QQIC为浮点表示法如下:




Non-Querier采用最近接收到的Query信息的QQIC值为自己的【Querier Interval】设定值。除非最近收到的QQIC值为0,这种情况下,Non-Querier将采用自己的默认值。
Number of Sources  代表Query messageSource Address字段数。General QueryMulticast Address Specific Query不指定来源地址,所以此字段设为0Multicast Address and Source Specific Query利用Number of Sources字段指明来源地址数。

IPv6表头中,来源地址设为发送端的link-local地址,Hop Limit字段固定设为1General Query须向link上所有的nodes查询,其目的地址设为link-scope all- nodes address(即FF02::1)。 Multicast Address Specific QueryMulticast Address and Source Specific Query只需向此multicast addresslistener查询,其目的地址设为欲查询的multicast address


Query信息的种类

Multicast Listener Query Messages包括3种类型:
-     General Query  Querier用来查询linklistenersListening stateMulticast Address以及Number of Sources域值皆设为0
-     Multicast Address Specific Query  Querier用来查询link上是否有特定的multicast address listenerMulticast Address域值设成欲查询的multicast地址。Number of Sources域值设为0
-     Multicast Address and Source Specific Query  Querier用来查询link上是否有特定的multicast address及其特定的来源地址聆听者。Multicast Address域值设成欲查询的multicast地址。Number of Sources域值设为欲查询的来源地址的数量,对应的Source Address [ i ] 域值设成欲查询的来源地址。


Query信息的来源地址

所有的MLDv2 Query信息的IPv6来源地址必须为link-local地址。无论hostsrouters,只要收到Query信息的IPv6表头来源地址不为 (::)或者不为link-local地址,则必须丢弃封包并且应该在系统日志上留下讯息。


Query信息的目的地址

General Query信息的目的地址设为link-scope all-nodes multicast addressFF02::1)。Multicast Address Specific以及 Multicast Address and Source Specific Query信息的目的地址设为欲查询的multicast地址。
然而,nodes必须接受目的地址为unicast或者multicast地址的General Query messages。这可能在某些方面有特别的用途,例如:为了除错目的。


Version 2 Multicast Listener Report Message

ListenerReport message来告知routers希望聆听的multicast address,或者用来响应Query messages
Multicast Address字段设为要报告的multicast address

MLDv2Report messages不需要传送给其它listenersIPv6的目的地址设为all MLDv2-capable routers(即FF02::16),来源地址设为发送端的link-local地址,Hop Limit字段固定设为1















Code  固定设为0
Reserved  固定设为0
Nr of Mcast Address Records (M)  指明Multicast Address Record 数。

Multicast Address Record 的格式如下:


















Record Type  指定Multicast Address Record的类型,细节稍后说明。
Aux Data Len  指明Auxiliary Data字段的长度。 目前RFC尚未定义Auxiliary Data内容,Aux Data Len域值应该设为0
Number of Sources (N)  指明Source Address字段数。
Multicast Address  listener欲报告的multicast address
Auxiliary Data  RFC尚未定义此字段内容。


Multicast Address Record Types

当收到Query messages或者Listenerinterface state发生变化时, Listener就会发送Reportrouters
1.       当收到Query messages Listener回报目前的interface state。对于General Query回报整个interface state,对于Multicast Address Specific QueryMulticast Address and Source Specific Query则仅回报相关的Listening state。回报的Record type2种:
MODE_IS_INCLUDE(1) 表示指定聆听的multicast addressfilter modeINCLUDESource Address字段即代表source list。因为(INCLUDE{ })代表停止聆听,MODE_IS_INCLUDE类型的Report不可带空的source list
MODE_IS_EXCLUDE(2) 表示指定聆听的multicast addressfilter modeEXCLUDESource Address字段即代表source listsource list可为空集合。
2.       interface state发生变化: Listener会马上回报发生变化的部分。如果是filter mode改变,则回报所谓的“Filter Mode Change Record”。如果是source list改变,则回报所谓的“Source List Change Record”。也可能两者同时回报。
Filter Mode Change Record可能用到以下2Record type
CHANGE_TO_INCLUDE_MODE (3) 表示指定聆听的multicast addressfilter mode切换到INCLUDESource Address字段即代表source list。请注意,如果source list为空集合,则代表停止聆听指定的multicast address
CHANGE_TO_EXCLUDE_MODE (4) 表示指定聆听的multicast addressfilter mode切换到EXCLUDE Source Address字段即代表source list
Source List Change Record可能用到以下2Record type
ALLOW_NEW_SOURCES (5) Source Address字段即代表listener欲聆听的来源地址列表。
BLOCK_OLD_SOURCES (6) Source Address字段即代表listener停止聆听的来源地址列表。
以下是Multicast Address Record内容的表示法:
IS_IN ( x )
Type MODE_IS_INCLUDE, source list x
IS_EX ( x )
Type MODE_IS_EXCLUDE, source list x
TO_IN ( x )
Type CHANGE_TO_INCLUDE_MODE, source list x
TO_EX ( x )
Type CHANGE_TO_EXCLUDE_MODE, source list x
ALLOW ( x )
Type ALLOW_NEW_SOURCES, source list x
BLOCK ( x )
Type BLOCK_OLD_SOURCES, source list x
x 可能为大写字母(例如:“A”),代表source address的集合。
x也可能为集合的表达式(例如:“A+B”):
A+B”代表集合AB的联集。
A*B”代表集合AB的交集。
A-B”代表从集合A去除集合B的所有元素。


MLDv2 ReportSource Address

MLDv2 Report的来源地址必须是合法的link-local地址,或者是unspecified address (::)(如果发送者尚未获取到合法的link-local地址)。Neighbor Discovery protocol允许node尚未获得合法的link-local地址时,仍可以unspecified地址的身份发送multicast封包。同样地,MLDv2也允许这样的行为。
另一方面,routers必须忽略来源地址为非法link-local地址的Reports。只要routers无法辨认接收到的Report是否直接来自于链接的link ,就会舍弃该Report。因此,routers将丢弃来源地址为 (::) Reports。这增强了安全性,阻挡不明的nodes影响routerslistener state 尽管来源地址为 (::) Reportrouters丢弃,发送该Reportnode已经正确地维护它的listening state,能够适当地处理后续可能接收到的multicast封包流(譬如:连接的link上存在其它的listener)。一旦此node获取到合法的link-local地址,它应该依据目前的listening state立即发送Report


MLDv2 ReportDestination Address

MLDv2 Report信息的目的地址为MLDv2-capable multicast routers listen (FF02:0:0:0:0:0:0:16)然而,nodes必须接受目的地址为unicast或者multicast地址的Report messages。这可能在某些方面有特别的用途,例如:为了除错目的。


MLDv2 Report的长度

如果Report所包含的Multicast Address Records所生成的Report message的长度超过link MTU,则需分成多个Report messages发送,且尽可能填满接近link MTU为原则。
如果一个Multicast Address Record由于包含过多的source addresses而造成生成的Report message超过link MTU,则处理方式如下:
*         如果类型不是IS_EXTO_EX,则将它拆分成多个Multicast Address Records。每个Multicast Address Record包含不同source addresses的子集合,并在个别的Report message发送。
*         如果类型是IS_EXTO_EX,这类的Multicast Address Record仅能发送一个Report message,剩余的source addresses不发送。虽然发送哪些source addresses并无限制,最好在每次后续的Report message包含相同的source addresses,而不是每次发送的source addresses内容不同。



评论

此博客中的热门博文

IPv6 簡介以及地址介紹

DHCPv6 简介

Neighbor Discovery 简介

Multicast Listener Discovery (MLD) 简介

Mobile IPv6 简介

ICMPv6

IP Security 簡介