组播侦听发现MLDv1协议详解RFC2710.docx
《组播侦听发现MLDv1协议详解RFC2710.docx》由会员分享,可在线阅读,更多相关《组播侦听发现MLDv1协议详解RFC2710.docx(16页珍藏版)》请在冰豆网上搜索。
组播侦听发现MLDv1协议详解RFC2710
中国地质大学江城学院
组播侦听发现(MLDv1)
协议详解_RFC2710
学部机械与电子信息学部
班级11计网本1
学号2320110102
姓名王青
指导教师辛玲
2013年11月16日
目录TableofContents
1MLDv1简介...................................................................................................................3
2消息格式.......................................................................................................................4
2.1代码(Code)........................................................................................................4
2.2校验和(Checksum)...........................................................................................4
2.3最大响应延迟(MaximumResponseDelay)......................................................5
2.4保留(Reserved).................................................................................................5
2.5组播地址(MulticastAddress)............................................................................5
2.6其他区域(Otherfields).....................................................................................5
3协议描述.......................................................................................................................5
4节点状态转换图...........................................................................................................7
5路由器状态转换图.......................................................................................................9
6定时器及其缺省值列表...............................................................................................13
6.1健壮性变量(RobustnessVariable)..................................................................13
6.2查询间隔(QueryInterval)................................................................................13
6.3查询响应间隔(QueryResponseInterval).......................................................13
6.4组播侦听者间隔(MulticastListenerInterval)..................................................14
6.5其他查询器存在间隔(OtherQuerierPresentInterval)....................................14
6.6启动查询间隔(StartupQueryInterval)............................................................14
6.7启动查询次数(StartupQueryCount).............................................................14
6.8最后侦听者查询间隔(LastListenerQueryInterval).......................................14
6.9最后侦听者查询次数(LastListenerQueryCount)........................................14
6.10主动报告间隔(UnsolicitedReportInterval)....................................................14
7消息目的地址..............................................................................................................14
文档标题
关键词Keywords:
IPv6、MLD、IGMPv2
本文档介绍了IPv6路由器所使用的一种协议,用以发现在其直连网络上的组播侦听者(即希望接收组播数据的节点)的存在,并且能明确发现这些邻居节点所感兴趣的组播地址。
这个协议就是组播侦听发现(MLD),MLDv1源于IPv4的IGMPv2。
二者之间一个比较重要的区别是:
MLD使用ICMPv6(IP协议号58)消息类型,不同于IGMP(IP协议号2)消息类型。
缩略语清单Listofabbreviations:
Abbreviations缩略
语
Fullspelling英文全名
Chineseexplanation中文解释
IPv6
InternetProtocolversion6IP
协议第6版
MLDv1
MulticastListenerDiscovery
version1
组播侦听发现版本1
IGMPv2
InternetGroupManagement
Protocol,Version2
互联网组管理协议版本2
●1MLDv1简介
MLD的目的是使能每个IPv6路由器发现在其直连网络上的组播侦听者(即希望接收组播数据的节点)的存在,并且能明确发现这些邻居节点所感兴趣的组播地址。
然后提供这些消息给路由器所使用的组播路由协议,以确保组播数据转发至存在接收者的所有链接。
MLD是非对称协议,明确了组播侦听者与路由器的不同行为。
对路由器本身正在侦听的组播地址来说,路由器扮演协议的两种角色,包括对自己的消息作出回应。
如果路由器有不止一个接口在同一网络上,它只需要在其中一个接口上运行此协议。
另一方面,对侦听者来说,则必须在所有接口运行此协议以便应用中或上层协议从接口接收所需要的组播数据。
●2消息格式
MLD是ICMPv6的一个子协议,也就是说,MLD消息类型是一系列ICMPv6消息的子系列,在IPv6报文中MLD消息以置下一报头值58作识别。
本文档描述的所有MLD消息发送时使用IPv6本地链路源地址,跳数限制值为1,并且在逐跳选项头中存在IPv6路由器告警选项(RTR-ALERT)(路由器要鉴别其本身不感兴趣的组播地址的MLD消息,必须使用路由器告警选项)。
MLD消息的格式如图1下:
图1
类型(Type)
MLD消息共有三种:
组播侦听查询(类型值=130)
可分为两种子类型:
普遍查询:
用于获得在所连网络上具有侦听者的组播地址。
特定组播地址查询:
用于获得在所连网络上对一特定组播地址是否存在侦听者。
组播侦听报告(类型值=131)
组播侦听离开(MulticastListenerDone)(类型值=132)
在本文档的剩余部分中,以上消息类型分别简称为“查询(Query)”、“报告(Report)”、
“离开(Done)”。
2.1代码(Code)
发送时设置为1;接收时忽略。
2.2校验和(Checksum)
标准的ICMPv6校验和,覆盖所有MLD消息以及IPv6首部区域中的伪首部。
2.3最大响应延迟(MaximumResponseDelay)
最大响应延迟值只在查询报文消息中有意义,它指定了发送响应报文的最大允许时间延迟,单位为毫秒。
在其他报文消息中,发送时设置为零,接收时忽略。
改变其值大小可以调整离开潜伏期(leavelatency)(即从链路上最后一个节点停止侦听某一特定组播地址开始,到路由协议发现不存在该地址的侦听者为止的时间)。
它也可以用来调整一个链路上MLD协议报文流量的大量发送。
2.4保留(Reserved)
发送者设为零;接收者忽略。
2.5组播地址(MulticastAddress)
在查询报文中,当发送普遍查询时,组播地址值设为零;当发送特定组查询时,设为特定的IPv6组播地址。
在报告或离开报文中,组播地址值分别设为报文发送者要侦听或者停止侦听的特定IPv6组播地址。
2.6其他区域(Otherfields)
接收到的MLD报文长度是这样计算的:
用IPv6负载长度值减去位于IPv6首部与MLD报文之间的任何存在的IPv6扩展头的长度值。
如果此长度值大于24字节,表明还有超出上面所描述的区域存在,可能属于将来用来向后兼容的MLD版本。
在本文档所描述MLD版本的实现不允许发送长度超过24字节的MLD报文,在接收MLD报文时,必须忽略任何超过前24字节的报文部分。
在所有情况中,MLD校验和的计算必须包含所有的MLD消息,而不仅仅是前24字节。
●3协议描述
本文档中,定时器的缺省值将在后面描述,定时器与计数器的名字出现在方括号中。
路由器使用MLD学习在其每个相连链路上有侦听者的组播地址。
每个路由器保存着一系列在每个相连链路上的具有侦听者的组播地址以及与组播地址相联系的定时器。
注意:
路由器需要知道的仅仅是在某一相连链路上某个组播地址存在侦听者;它不需要了解侦听者的标识(如单播地址)或者存在多少侦听者。
对每一个相连链路,路由器选择这个链接上的一个本地链路单播地址,用作在这个链路上发送的MLD报文的IPv6源地址。
对路由器上每一个运行MLD协议的接口,路由器必须配置此接口侦听所有IPv6组播产生的链路层组播地址。
例如:
一个以太网连接的路由器必须设置它的以太网地址过滤接收所有以3333[IPv6-ETHER]开始的以太网组播地址;如果以太网接口不支持组播范围地址的过滤,那么它必须配置接收所有以太网组播地址,以满足MLD的需要。
对于每一个相连的链路,路由器可以充当两种角色的一个:
查询器或非查询器。
每一个链路上通常只有一个查询器。
在每一个相连链路上,路由器都以查询器的角色开始。
如果一个路由器在某个链路上收到查询消息,并且查询消息的IPv6源地址小于此链路上选择的地址,那么在这个链路上,路由器就成为非查询器。
如果在【其他查询器存在间隔(OtherQuerierPresentInterval】的时间期间,非查询器在这个链路上没有收到更小地址的路由器查询,那么在这个链路上路由器又恢复为查询器角色。
在某个链路上,查询器周期性【查询间隔(QueryInterval)】发送普遍查询,以主动请求在此链路上所有感兴趣的组播地址的报告。
在启动时,一个路由器应该在所有相连链路上发送【启动查询计数(StartupQueryCount)】普遍查询,时间间隔为【启动查询间隔(StartupQueryInterval)】,以便快速可靠的发现在这些链路上组播侦听者的存在。
普遍查询发送至链路范围所有节点组播地址(FF02:
:
1),组播地址域值为零,最大响应延迟置为【查询响应间隔(QueryResponseInterval)】。
当一个节点收到一个普遍查询时,它为在这个收到查询的接口所要侦听的每个组播地址,设置一个延迟定时器,链路范围所有节点组播地址与范围0(保留)或者1(本地节点)的组播地址除外。
每一个定时器设为不同的随机值,选择范围是【0,最大响应延迟(MaximumResponseDelay)】,其中,最大响应延迟为在查询报文中指定。
如果对应某一组播地址的定时器正在运行,那么当所要求的最大响应延迟小于正在运行的定时器的剩余值时,此定时器才会重置为一个新的随机值。
如果查询报文设定最大响应延迟值为零,那么每一个定时器的值也设为零,定时器超时所要进行的动作就会立即执行。
当一个节点收到一个特定组查询,如果在收到查询的接口上它正在侦听所查询的组播地址,那么此节点就会为此组播地址的定时器设为一个随机值,选择范围是【0,最大响应延迟(MaximumResponseDelay)】,就像上面描述的那样。
如果此组播地址的定时器正在运行,那么当所要求的最大响应延迟小于正在运行的定时器的剩余值时,此定时器才会重置为一个新的随机值。
如果查询报文设定最大响应延迟值为零,那么此定时器的值也设为零,定时器超时所要进行的动作就会立即执行。
如果一个节点在某一特定接口的对应一特定组播地址的定时器超时,节点通过此接口发送一个报告;在报告报文的IPv6目的地址域与MLD组播地址域中,都携带要报告的组播地址。
IPv6的调数限制为1用来防止报文传输到超越所报告接口连接的链路的范围。
当一个节点从一个接口收到另一个节点的对应某一组播地址的报告时,如果此时此节点在同样的接口上也在运行对应相同组播地址的定时器,那么它就会停止此定时器,不会发送对应这个组播地址的报告,这样可以防止在一个链路上收到多份多份相同的报告。
如果一个路由器从某一链路上收到一个报告,如果报告的组播地址不在路由器的此链路具有侦听者的组播地址列表中,那么报告地址就会加入这个列表,对应组播地址的定时器设置为【MulticastListenerInterval】。
如果报告的组播地址已经在路由器的此链路具有侦听者的组播地址列表中,那么对应此组播地址的定时器重置为【MulticastListenerInterval】。
如果某一路由器上对应某一组播地址的定时器超时,就会认为在此链路上不再有此组播地址的侦听者存在,此组播地址就会从列表中删除。
当一个节点在某一接口上启动侦听某一组播地址时,它应该在此接口上立即主动发送此组播地址的报告,以免它是此链路上的第一个侦听者。
为了防备初始报告可能丢失或损坏,建议重复发送一至两次,每次时间间隔为【UnsolicitedReportInterval】。
当一个节点在某一接口上停止侦听某一组播地址时,它应该发送离开消息给链路范围所有路由器组播地址(FF02:
:
2),并且在其组播地址域携带要停止侦听的地址。
如果一个节点在发送报告消息前收到另外一个同样组播组的报告消息,它就会受到抑制而可以不发送此报告。
如果为优化起见,报告发送必须不受抑制,但缺省是受到抑制的。
当处于查询器状态的路由器从链路上收到离开消息时,如果要离开的组播报文地址在此链路上查询器的侦听者地址列表中,查询器就会发送【LastListenerQueryCount】次数组播地址特定查询,每次间隔时间【LastListenerQueryInterval】。
组播地址特定查询一般将【LastListenerQueryInterval】设定为【MaximumResponseDelay】,如果最后查询的响应延迟时间过后,没有此组播地址的报告在此链路上发送给查询器,因此此地址就从侦听者列表中删除,并且此地址的消失要通知给组播路由组件。
这个过程会持续直到完成(也是就直到收到一个报告或者最后特定组查询没有响应),在此过程中此链路上会忽略从查询器到非查询器的转变。
处于非查询器状态的路由器必须忽略离开消息。
当非查询器收到一个组播特定查询时,如果待查询组播地址定时器值大于【LastListenerQueryCount】x【MaximumResponseDelay】,那么它就将此定时器值置为后者的值。
●4节点状态转换图
节点的行为可以下面的状态转换图更加正式地描述。
一个节点可以处于以下三种状态之一:
"Non-Listener"状态
当在此接口上节点不在侦听组播地址(也就是没有上层协议或程序要求接收此组播地址的报文)。
这是所有接口对所有组播地址的初始状态。
节点不需要保存此状态。
"DelayingListener"状态
当节点在此接口上准备侦听此组播地址,同时运行此组播地址的报告延迟定时器。
"IdleListener"状态
当节点在此接口上侦听此组播地址,不在运行此组播地址的报告延迟定时器。
有五个重要事件能触发MLD状态的变化:
-"startlistening"
发生在节点开始侦听接口上的组播地址时,它只发生在Non-Listener状态。
-"stoplistening"
发生在节点停止侦听接口上的组播地址时,它只发生在DelayingListener与IdleListener状态。
-"queryreceived"
发生在节点接收到一个有效的普遍查询或者一个有效的特定组播地址查询。
查询报文要想有效,必须来自本地链路IPv6源地址,长度至少24字节,并且有一个正确的MLD校验和。
MLD消息中的组播地址域内容必须是零(普遍查询)或者一个有效的组播地址(组播地址特定查询)。
普遍查询应用于收到查询的接口上的所有组播地址。
特定组播地址查询应用于收到查询的接口上单个组播地址。
处于Non-Listener状态的节点忽略查询。
—"reportreceived"
发生在节点收到一个有效的MLD报告消息。
报告报文要想有效,必须来自本地链路IPv6源地址,长度至少24字节,并且有一个正确的MLD校验和。
在收到报文的接口上,报告报文只适用于报文中组播地址域中标识的组播地址。
在Non-Listener或者IdleListener状态,报告报文被忽略。
-"timerexpired"
发生在接口上某组播地址的报告延迟定时器超时时,它只发生在DelayingListener状态。
所有其他事件,例如接收到无效的MLD消息或者非查询或报告报文的消息类型,在所有状态下都被忽略。
基于以上事件,有七种可能的行为:
-"sendreport"
向接口上的组发送报告,报告消息发送给被报告的组
-"senddone"
向接口上的组发送离开报文,如果表明我们是最后发送报告节点的标志被清除,则不会发送组离开报文。
-"setflag"
若节点是此组最后一个发送报告的节点,则设置标志。
-"clearflag"
若节点不是此组最后一个发送报告的节点,则清除标志。
-"starttimer"
接口上的组按从【0,MaximumResponseDelay】中随机选出的延迟时间值启动一个定时器,其中MaximumResponseDelay在查询消息中指定。
若这是一个主动的组报告消息,则定时器将被置为一个范围在【0,UnsolicitedReportInterval】之间随机的延迟值。
-"resettimer"
重置组定时器,将定时器置为一个由starttimer中指定的,在【0,MaximumResponseDelay】范围内的统一值
-"stoptimer"
接口上的组停止定时器。
在下面的状态转换图(图2)中,每个状态转换弧上标明了触发状态转换的事件,括号中则标明了状态转换时将要采取的行为。
要注意状态转换总是由事件触发,即使行为在一定条件下才发生,也会进行状态转换。
图2
链路范围所有节点地址(FF02:
:
1)被作为特殊情况来处理。
在每个接口上主机初启时时处于状态,且不会变至其他状态,也不会为该组地址发送报告或离开消息。
MLD消息从不会发送给范围0(保留)或1(本地节点)的组播地址。
MLD消息发送给范围2(本地链路)的组播地址,包括请求节点组播地址[ADDRARCH],但链路范围所有节点地址(FF02:
:
1)除外。
●5路由器状态转换图
路由器的行为通过下面的状态转换图(图3)更加正式的表示出来。
路由器可能处于以下两种状态之一:
"Querier"
当此路由器在此链路上被指定为发送MLD查询报文。
"Non-Querier"
当此链路上其他路由器被指定为发送MLD查询报文。
下面的三种事件能触发路由器状态发生变化:
-"querytimerexpired"
发生在所设置的查询定时器超时,只有对处于查询器状态的路由器才有意义。
-"queryreceivedfromarouterwithalowerIPaddress"
发生在收到从相同链路上具有更小IPv6源地址的路由器发送的有效查询。
查询消息要想有效,必须来自本地链路IPv6源地址,长度至少24字节,并且有一个正确的MLD校验和。
-"otherquerierpresenttimerexpired"
发生在链路上用来记录具有更小IP地址查询器的定时器超时。
只有对处于非查询器状态的路由器才有意义。
基于以上事件,有三种可能的行为:
-"startgeneralquerytimer"
在相连的链路上启动普遍查询定时器。
-"startotherquerierpresenttimer"
在相连的链路上每隔【OtherQuerierPresentInterval】时间启动其他查询器存在定时器。
-"sendgeneralquery"
在所连接的链路上发送普遍查询,普遍查询向链路范围所有节点地址(FF02:
:
1)发送,且最大响应延迟间隔为【QueryResponseInterval】。
图3
在所有连接的链路上路由器开始处于初始状态,并迅速转换为查询器状态。
另外,为了跟踪哪些组有侦听者,在任何单一相连链路上,对应于任意一个IPv6组播地址,路由器可以处于以下三种状态之一:
-"NoListenersPresent"state
当链路上不存在发送报告侦听组播地址的节点时。
这是路由器上对应所有组播地址的初始状态。
路由器上不需要特意保存。
-"ListenersPresent"state
链路上有节点发送报告侦听此组播地址。
-"CheckingListen