Multicast Listener Discovery (MLD) 简介

Multicast Listener Discovery(简称MLD)是从IGMPv2Internet Group Management Protocol version 2)衍生而来,目的是让IPv6 router有能力发现每个连接的link上的multicast listener(聆听者),并且具体知道这些listener感兴趣的是哪些multicast地址,同时在每个link上建立个别的multicast列表。只要multicast列表发生变化,router就会透过Multicast Routing Protocol与其它邻近的routers交换这些讯息,以确保multicast封包能适当地传送(或阻断)到multicast listeners连接的link。(Multicast Routing Protocol不在本书的讨论范围内。)

《请注意》Router只需要知道link上哪些multicast addresslistener,不需要知道listener的身份地址,也不需要知道有多少listeners











MLD是一个非对称的协议,它分别指定multicast routermulticast listeners个别的行为。router也扮演listener角色时,router会同时执行协议的两个部分,包括自己两个角色间的讯息交换。

如果一个router有多个interfaces连接到同一个link,则只需要其中一个interface扮演MLDrouter角色。另一方面,如果listener有多个interfaces连接到同一个link,则每个interface都必须扮演MLDlistener角色。
《须知》每个listener可能落在internet上任何位置,multicast封包的listeners越多,则占用整个internet的带宽越巨。如何有效地管理这些multicast封包为routers首一要务。为了兼顾multicast封包流的管理以及满足客户端的实时服务需求,MLD乃基于以下2个基本原则而设计:
1.       实时处理第一个listener  当连接的link上任何multicast address出现第一个listener时,routers应该实时与邻近的routers交换信息, 尽可能迅速将listener欲接收的multicast封包流引导到此listener链接的link上。
2.        尽量减少带宽不必要的浪费  当有listener停止接收某个multicast封包时, router应该实时探测该listener链结的link上是否还有其它listener欲接收此multicast封包。 如果没有其他listeners存在,则应该实时与邻近的routers交换信息,尽速阻断此mutilcast封包流到该link,减少不必要的带宽浪费。


MLD Packet Structure

MLDICMPv6的子协议,也就是说,MLD是整个ICMPv6信息的子集合。MLD message封包由IPv6表头、Hop-by-Hop Options扩充表头及MLD message组成如下:




《注意》 MLD messages的目的地地址都是使用multicast地址来完成信息交换,因此包含Hop-by-Hop Options扩充表头是必要的。Hop-by-Hop Options扩充表头用来告知router必须对封包做进一步处理。Router Alert Option值为0Hop-by-Hop Options扩充表头告知router其为MLD message,藉此可跟一般的multicast封包流区隔。一般的multicast封包流不包含Hop-by-Hop Options扩充表头,router只依据multicast列表负责转送,不做其它处理。

由于MLD message的交换仅限于同一个link的范围,RFC 2710规定所有的MLD封包的IPv6来源地址必须为发送端的link-local地址,并且IPv6表头的Hop Limit字段必须设为1 MLD的接收者尤其是router必须检查这2个域值,不符合的封包则丢弃不处理。如此可防止MLD messages流窜到别的links,造成整个MLD机制大乱。

MLD Messages

MLD message共有3种类型:
Multicast Listener QueryICMPv6 Type 130
Multicast Listener ReportICMPv6 Type 131
Multicast Listener DoneICMPv6 Type 132

3种类型的message structure格式完全相同如下:









Code 域值固定设为0,接收端忽略其内容。
Checksum  ICMPv6的标准checksum值。
Maximum Response Delay  此字段只对Query message有意义。它指定listeners回报Report message的最大延迟时间,单位为毫秒。其它类型的MLD messages将此字段设为0,且接收封包者忽略此字段。变换此域值可让routers调谐“leave latence(离开延迟)”,即 -- 当有个listener通知停止聆听某个multicast封包流时,router侦测此multicast封包流不存在其它listener所需要的时间(请参考章节“List of timers and default valuesLast Listener Query Interval)。此字段亦可用来调谐突发性的MLD流量(请参考“List of timers and default valuesQuery Response Interval)。
Reserved  域值固定设为0,接收端忽略其内容。
Multicast Address  General Query messages中,此字段设为0。在Multicast-Address-Specific Query messages中,此字段设成routers欲查询的multicast address。在ReportDone messages中,listener利用Multicast Address字段来指明哪个Multicast Address需要聆听或者停止聆听。
其它字段  MLD信息的长度计算方法为:IPv6表头的Payload Length域值减去MLD信息前端的所有其它IPv6 extension headers长度。如果MLD信息的长度大于24 octets ,表示还有其它字段存在于MLD信息的后端 ,这可能被MLD的未来向后兼容的新版本所定义使用。仅实现MLD版本的node发送的MLD信息长度绝不可超过24 octets,对于收到的MLD信息超过24 octets的部分也必须忽略。在所有情况下,checksum域值的计算必须涵盖整个MLD信息,而非仅仅24 octets

Multicast Listener QueryType 130

Multicast Listener Query message细分2种类型:
-   General Query  Querier定期发送General Query来查询link上哪些multicast地址有listener
-   Multicast-Address-Specific Query  Querier接收到Done message时,立即发送Multicast-Address-Specific Query来查询link上是否还有nodes聆听同一个multicast地址。
2种类型是藉由Multicast Address域值来区分:General Query设为0Multicast-Address-Specific Query则设为欲查询的multicast address
IPv6表头中,来源地址设为发送端的link-local地址,Hop Limit字段固定设为1 General Query须向link上所有的nodes查询,其目的地址设为link-scope all- nodes address(即FF02::1)。 Multicast-Address-specific Query只需向此multicast addresslistener查询,其目的地址设为欲查询的multicast address

Multicast Listener ReportType 131

Listeners发送Report message的时机如下:
²  当接收到General Query时, 将所有聆听的multicast addresses利用Report message个别回报给routers
²  当接收到Multicast-Address-Specific Query messages时,listener只回报指定的multicast address
²  当有应用程序要求接收某个multicast address时,会立即发送Report message
Multicast Address字段设为要回报的multicast address
IPv6的目的地址设为要报告的multicast address,来源地址设为发送端的link-local地址,Hop Limit字段固定设为1

Multicast Listener DoneType 132

NodeDone message来告知routers停止聆听指定的multicast address
Multicast Address字段设为要停止聆听的multicast address
IPv6的目的地址设为link-scope all-routers address(即FF02::2),来源地址设为发送端的link-local地址,Hop Limit字段固定设为1

MLD协议说明

RFC 2710定义了下列协议行为。当读者细细品味其内容后,将不禁赞叹其设计之巧妙。
n  Router使用MLD Query message来查询每个link上哪些multicast address封包有listenerRouter的每个link各自维护一张multicast列表,从接收到的Report messages讯息中的multicast address记录在multicast列表里,同时每个multicast address配置一个定时器(此定时器的用途稍后会做解释)。请注意, router只需要知道link上哪些multicast addresslistener,不需要知道listener的身份地址,也不需要知道有多少listener
n  如果router有多个interfaces链接到同一个linkrouter会固定选择其中一个interfacelink-local地址为发送MLD信息的来源地址,并且将该interface设置为可接收所有的multicast addresses
n  每个link上的routers分成2种角色:Querier(查询者,负责发送Query message)或Non-Querier(非查询者,不发送Query message)。通常1link只有1Querier 所有的router刚启动时会预设自己为Querier 如果Querier接收到Query message,而且此messageIPv6来源地址的数值比自己的小,此时必须把自己切换为Non-Querier 如果在 Other Querier Present Interval】时间内,Non-Querier没收到任何来源地址的数值比自己小的Query message,则把自己恢复为QuerierNon-Querier会接收到所有的MLD messages,所以它将保持跟Querier同样的状况以及multicast列表。
n  Querier定期每隔【Query Interval】时间发送General Query,请求listener回报Report message。为了能快速有效地查询listener的存在,Querier刚启动时第一次发送的General Query应该以紧密的【Startup Query Interval】间隔时间重复发送,重复次数为【Startup Query count】。
n  node接收到General Query时,会对每个它所聆听的multicast address分别设置不同的定时器(不包含link-local all nodesscope 0以及scope 1multicast addresses),每个定时器的时间都是从 0 Maximum Response Delay】区间中随机取得且内容不同。当接收到General Query同时某些定时器正在运行中时,如果该定时器的剩余时间大于收到的General QueryMaximum Response Delay域值,则重新随机设置该定时器,否则继续倒数原来的定时器。如果General QueryMaximum Response Delay域值为0,则定时器设为0,立即执行定时器到期后的动作。
n  当接收到Multicast-Address-Specific Query时,如果node是此指定的multicast address listener,与处理General Query方式相同,对此multicast address随机设置定时器值。只要任何的定时器到期,就会个别发送对应的Report message,且其IPv6的目的地址为定时器到期的multicast address。如果node接收到其它node发出的Report(这代表两者希望聆听同一个multicast address),而且与此Report相同的multicast address的定时器在运转,则停止定时器且不发送该Report。如此可避免Routers重复接收到相同的Report
n  router从某个link上接收到Report,如果Report的地址不在此linkmulticast列表里,则添加Reportaddressmulticast列表里,并且设定其定时器值为【Multicast Listener Interval 。如果接收到的Reportaddress已经存在multicast列表里,则重新定时器值为【Multicast Listener Interval】。如果multicast 列表的address的定时器到期,则表示此address不再有listener,因此将它从列表删除。
n  node开始聆听某个multicast address,它应该马上发送该multicast addressReport 此时此node可能是link上该address的第一个listener,而且发送的Report有可能丢失,因此在【Unsolicited Report Interval】时间过后,Report应该重复发送1次或2次。(例如:发出第一次的Report后,同时当做接收到该multicast addressMulticast-Address-Specific Query,并设置适当的定时器值。)
n  node停止接收某个multicast address时,应该马上发送Done message,其multicast address字段设为欲停止聆听的地址,且IPv6目的地址设为link-scope all-routers address(即FF02::2)。如果此node最近的该multicast addressReport因为接收到其它node发出Report而被抑制没发送,则极可能有其它node仍在聆听此multicast address。此种情况下可以选择不发送Done message。如果这个优化功能被实现,其默认值应该设为打开。
n  Querier接收到Done message,而且Querier的同一个link上的multicast列表存在这个Done messagemulticast addressQuerier会发送Multicast-Address-Specific Query 询问link上是否还存在其它的listener 在特定的时间内如果没收到此addressReport,则表示此address不再有任何listener,因此该address从列表中删除。
n  处于 Non-Queriery状态的router必须忽略Done信息。
n  Non-Querier收到Multicast-Address-Specific Query信息,并且它的定时器的设置值大于Query信息中的Maximum Response Delay域值乘上常数【Last Listener Query Count】。此时,Non-Querier须将它的定时器的设置值更改成后者。
参考文獻

RFC 2710  Multicast Listener Discovery for IPv6

评论

此博客中的热门博文

DHCPv6 简介

Neighbor Discovery 简介

IPv6 簡介以及地址介紹

MLDv2 简介

Mobile IPv6 简介

ICMPv6

IP Security 簡介

IPv6 封包结构

IPv6 Address Autoconfiguration