MLDv2 简介
MLDv2乃从IGMPv3衍生而来,可兼容MLDv1。
MLDv2涵盖MLDv1既有功能,除了指定欲聆听的multicast 地址以外,并且增加source
list(来源地址列表)以及filter mode可过滤multicast封包的来源地址。
Filter mode可设为INCLUDE或EXCLUDE,分别与source
list组合形成白名单或者黑名单。白名单只接收source list中所指定的来源封包,其它都不接收。黑名单则除了不接收source
list中所指定的来源封包,其它都接收。
MLDv2 协议概述
MLDv2使router能够查询每个link上有哪些multicast
封包和来源地址有listener,并且保持每个multicast
address的Listening state。再透过Multicast
Routing Protocol,与邻近的其它routers交换这些讯息,以确保multicast封包能适当地传送(或实时阻断)到所有multicast
listeners连接的网段。
本章节不赘述MLDv2与MLDv1相同的部分。主要着重于如何建立及处理Multicast
Address Listening state:
u Listeners如何建立Listening
state
u Querier和Listeners如何交换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。
概念上, socket及interface两者的listening
state格式相同。listening state包含每个欲聆听的multicast封包的record,
每笔record包括multicast address、
filter mode和source list。Filter
mode可以是INCLUDE(对应的source list为白名单)或者EXCLUDE(对应的source
list为黑名单)。
n 每个interface中,一个multicast
address最多只能存在一笔记录。Listener依据interface Listening state将相关信息报告给Router,Router依据listeners报告的信息,汇整计算出整个link上的Listener
state,以确保能适当地转送multicast封包。当listener的IP层接收到multicast
封包时,会依据socket listening state做过滤处理,再决定是否将封包内容传送给socket对应的应用程序。
注
|
Router根据整个link上所有interfaces的listening state,汇整计算出整个link的listener state,只要存在listener的multicast封包就会被转送到该link。即使把某个source
address 列为黑名单,只要有其它interface宣告欲接收该source
address,此multicast封包还是会被routers导入此link。因此,每个interface依据socket listening state做过滤处理是必要的动作。
|
Querier 与Listeners之间交换MLDv2讯息
n
Querier利用MLDv2的Query
message来建立和更新Listening state。
Query message分为3种类型:
General Queries 定期性的询问,listeners会将目前的listening
state回报routers。
Multicast Address Specific Queries
当Querier收到停止聆听某个multicast
address的Report,就会马上发送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
state,listener则将目前的listening
state,透过Current State Report messages响应给link上所有的routers。
如果Querier发送的是Multicast Address Specific
Queries或Multicast Address and Source Specific Queries,listener仅回报与其相关的listening
state。
State Change Report 如果Listener的interface
listening state发生变化,会立即将变化的部分,透过State Change Report message报告给routers。
State Change Report可能包括Filter Mode Change records或Source
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没发生丢失,这类messages跟state 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 state的record符合条件,就会将相关的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
flag(Suppress Router-Side Processing)也增强MLDv2的健壮性。当发送Multicast
Address Specific或Multicast 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有可能收到listener的Report。此时,未送完的Query仍需按照原计划完成,且将S
flag值设为1,其目的是告知Non-Querier抑制上述的动作(即缩短timer时间),以便于跟Querier的listener
state同步。
Routers如何建立Multicast Address Listener State
n Router在每个连接的link上维护每个multicast
address的状态称为Multicast Address Listener state 。Listener
state包含multicast address及对应的Filter
Mode,Filter Timer以及Source
List。Source list中的每个来源地址也配置了timer。Filter
mode可能是INCLUDE或EXCLUDE。
n 当接收到同一个multicast
address所有的Report messages的Filter
mode都是INCLUDE时,router才会将Filter
mode设为INLCUDE。此时,该multicast
address的listener state符号表示法为:
INCLUDE(A) 。其中A为来源地址的列表,称为“INCLUDE
List”。INCLUDE List汇总link上所有listeners欲聆听的来源地址。符合这些来源地址的封包将被routers转送到这个link。
n 如果有listener用INCLUDE
mode(包含来源地址)发送Current State或
State Change Report ,这些来源地址就会被添加到routers目前的INCLUDE
List ,同时更新对应的timer值。如果某个timer到期,则其对应的来源地址会从INCLUDE
List中删除。
n 除了上述的“soft
leave”机制,MLDv2还有“fast leave”的巧思,这是基于对timer的巧妙使用。当某个listener用INCLUDE
mode表示想停止聆听指定的来源地址时,link上所有的routers缩短目前INCLUDE
list中对应的timer值。然后Querier发送Multicast
Address and Source Specific 来查询是否还有其它listener聆听此来源地址。如果有收到其它listener的report,则还原对应的timer到原始设定值。如果没收到其它listener的report,由于timer值已被缩短
,将加速timer到期 ,进而达到快速将来源地址从INCLUDE
List中删除的机制。
n 只要收到其中一个Report
messages的Filter mode是EXCLUDE时,router就会将multicast
address的Filter mode设为EXCLUDE。当第一次收到EXCLUDE
mode的report时,routers启动设置该multicast
address对应的Filter Timer 。每次收到EXCLUDE
mode的Current 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
address在EXCLUDE mode时,
该multicast address的listener
state符号表示法为: EXCLUDE(X, Y),其中X称为“Requested
List”,Y称为“Exclude List”。除了在Exclude
List中的来源地址,其它所有的来源地址封包都将被routers转送到listeners的link。
Request List对封包的转送不具任何作用。然而,routers必须维护Requested List有2个主要原因如下:
1. 保持追踪INCLUDE的Listener
state : 可保证routers顺畅地从EXCLUDE
mode切换到INCLUDE mode。切换成INCLUDE时,Requested
List至少必须包括接收到的INCLUDE mode的report中的所有来源地址
,才能保证切换到INCLUDE mode后这些来源地址的封包不被阻断转送。当routers切换到INCLUDE
mode时,Requested List中的来源地址被移到INCLUDE
List,Exclude 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的应用程序。在同一个socket、interface及IPv6
multicast address的组合下,后续的service interface呼叫,其filter
mode和source list的设定值将完全取代前一个呼叫。
MLDv1不支持过滤来源地址,只进行简单的service
interface: Start Listening及Stop
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设为INCLUDE且source list设为空集合,则代表删除interface及IPv6
multicast address对应的记录。如果此笔记录存在,则删除此记录。如果不存在,则此操作视同无效。
Ø 如果filter
mode设为EXCLUDE或者source list设为非空集合,则代表新增或更新interface及multicast
address对应的记录。 如果此笔记录存在,则更新filter mode及source
list内容。如果不存在,则新增一笔记录。
Per-interface
state
除了socket state,listener必须依据interface内所有的socket
state计算且保持每个interface state。每个interface里,一个multicast
address最多只能存在一笔记录。其格式如下:
(IPv6 multicast address, filter mode, source list)
假设有2个应用程序分别对interface“i”及
multicast address“m”做了以下操作:
IPv6MulticastListen ( s1, i, m, INCLUDE, {a, b, c}
)
IPv6MulticastListen ( s2, i, m, INCLUDE, {b, c, d}
)
为了同时满足这2个sockets的要求,listener必须要求router转送此multicast
address且来源地址为a ,b ,c或d
。因此 ,在这个例子中,interface i的listening
state的记录应该为:(m,INCLUDE,{a,
b, c, d} )。当收到来源地址b或c的封包时,IP层会将封包传送给s1及s2。来源地址为a的封包只传送给s1,来源地址为d的封包只传送给s2。
从每个socket state导出interface
state的一般规则如下:
Ø 只要socket
state中有一笔记录是EXCLUDE mode,interface
state的filter mode即为EXCLUDE,
且其source list为所有socket
state为EXCLUDE的记录的source list的交集,再减去所有socket
state为INCLUDE的记录的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} )
如果第4个socket state被创建如下:
From socket
s4: ( i, m, EXCLUDE, { } )
则对应的interface state的记录变成:
( m, EXCLUDE, { }
)
Ø 如果所有socket
state的记录皆为INCLUDE mode,interface
state的filter 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 Message Format
MLDv2 messages共有2种类型:
1.
重新定义Multicast
Listener Query (Type = 130)
MLDv2除了沿用MLDv1的Multicast
Listener Query (Type = 130),并在其后增加与来源地址相关的字段。所以MLDv1仍可识别MLDV2发出的Query
message的原始部分。 MLDv2接收到MLDv1发出的Query
message,可依其长度识别为MLDv1 message,
并且假设来源地址字段为: EXCLUDE mode,source
list为空集合。 因此MLDv1和MLDv2使用的Query
message可兼容。
2.
新增Version
2 Multicast Listener Report (Type = 143)
为了能兼容MLDv1,MLDv2的实现必须支持接收以下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流量 。
Version 2 Multicast Listener Report Message
Multicast
Address Record Types
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域值必须设为0。Non-Querier采用最近接收到的Query信息的QRV值为自己的【Robustness
Variable】设定值。除非最近收到的QRV值为0,这种情况下,Non-Querier将采用自己的默认值。
QQIC Querier's Query Interval Code。此字段指明Querier所使用的【Querier
Interval】 设定值,时间单位为秒。实际的的间隔时间称为Querier's
Query Interval(QQI),根据Querier's Query Interval Code域值来产生,方法如下:
如果QQIC < 128, 则QQI = QQIC值。
如果QQIC >= 128,QQIC为浮点表示法如下:
Non-Querier采用最近接收到的Query信息的QQIC值为自己的【Querier Interval】设定值。除非最近收到的QQIC值为0,这种情况下,Non-Querier将采用自己的默认值。
Number of Sources
代表Query
message的Source
Address字段数。General
Query及Multicast
Address Specific Query不指定来源地址,所以此字段设为0。Multicast Address and Source Specific Query利用Number of Sources字段指明来源地址数。
在IPv6表头中,来源地址设为发送端的link-local地址,Hop Limit字段固定设为1。General Query须向link上所有的nodes查询,其目的地址设为link-scope all- nodes address(即FF02::1)。 Multicast Address Specific
Query及Multicast
Address and Source Specific Query只需向此multicast address的listener查询,其目的地址设为欲查询的multicast address。
Query信息的种类
Multicast
Listener Query Messages包括3种类型:
- General Query Querier用来查询link上listeners的Listening
state。Multicast Address以及Number
of Sources域值皆设为0。
- Multicast Address Specific Query Querier用来查询link上是否有特定的multicast
address listener。Multicast 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地址。无论hosts或routers,只要收到Query信息的IPv6表头来源地址不为
(::)或者不为link-local地址,则必须丢弃封包并且应该在系统日志上留下讯息。
Query信息的目的地址
General Query信息的目的地址设为link-scope
all-nodes multicast address(FF02::1)。Multicast Address Specific以及 Multicast Address and Source Specific Query信息的目的地址设为欲查询的multicast地址。
然而,nodes必须接受目的地址为unicast或者multicast地址的General Query messages。这可能在某些方面有特别的用途,例如:为了除错目的。
Version 2 Multicast Listener Report Message
Listener用Report message来告知routers希望聆听的multicast
address,或者用来响应Query messages。
Multicast Address字段设为要报告的multicast
address。
MLDv2的Report
messages不需要传送给其它listeners,IPv6的目的地址设为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或者Listener的interface
state发生变化时, Listener就会发送Report给routers:
1.
当收到Query messages: Listener回报目前的interface
state。对于General Query回报整个interface
state,对于Multicast Address Specific Query及Multicast
Address and Source Specific Query则仅回报相关的Listening
state。回报的Record type有2种:
MODE_IS_INCLUDE(1): 表示指定聆听的multicast address的filter
mode为INCLUDE,Source Address字段即代表source
list。因为(INCLUDE,{ })代表停止聆听,MODE_IS_INCLUDE类型的Report不可带空的source
list。
MODE_IS_EXCLUDE(2): 表示指定聆听的multicast
address的filter mode为EXCLUDE,Source
Address字段即代表source list。source
list可为空集合。
2.
当interface state发生变化: Listener会马上回报发生变化的部分。如果是filter
mode改变,则回报所谓的“Filter Mode Change Record”。如果是source
list改变,则回报所谓的“Source List Change Record”。也可能两者同时回报。
Filter Mode
Change Record可能用到以下2种Record type:
CHANGE_TO_INCLUDE_MODE
(3): 表示指定聆听的multicast
address的filter mode切换到INCLUDE,Source
Address字段即代表source list。请注意,如果source
list为空集合,则代表停止聆听指定的multicast address。
CHANGE_TO_EXCLUDE_MODE
(4):
表示指定聆听的multicast address的filter
mode切换到EXCLUDE, Source Address字段即代表source
list。
Source List
Change Record可能用到以下2种Record 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”代表集合A和B的联集。
“A*B”代表集合A和B的交集。
“A-B”代表从集合A去除集合B的所有元素。
MLDv2 Report的Source 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影响routers的listener
state。 尽管来源地址为 (::) 的Report被routers丢弃,发送该Report的node已经正确地维护它的listening state,能够适当地处理后续可能接收到的multicast封包流(譬如:连接的link上存在其它的listener)。一旦此node获取到合法的link-local地址,它应该依据目前的listening state立即发送Report。
MLDv2 Report的Destination 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_EX或TO_EX,则将它拆分成多个Multicast
Address Records。每个Multicast Address Record包含不同source
addresses的子集合,并在个别的Report message发送。
*
如果类型是IS_EX或TO_EX,这类的Multicast
Address Record仅能发送一个Report message,剩余的source
addresses不发送。虽然发送哪些source addresses并无限制,最好在每次后续的Report
message包含相同的source addresses,而不是每次发送的source
addresses内容不同。
评论
发表评论