5.3 DVMRP 操作

DVMRP(Distance Vector Multicast Routing Protocol,距离矢量多播路由协议)利用广播/剪除技术为每个多播源构建一个独立的有源树,由于其使用RIP的一个变体来发现到多播源的最短路径,因而被命名为距离矢量多播路由协议。每个多播树的维护过程都是动态变化的,当组成员离开和加入多播组时,都要对多播树进行剪枝和嫁接。

DVMRP使用以下7种类型的数据包。

• DVMRP Probe(探测)

• DVMRP Report(报告)

• DVMRP Prune(剪除)

• DVMRP Graft(嫁接)

• DVMRP Graft Acknowledgement(嫁接确认)

• DVMRP Ask Neighbors 2(询问邻居2)

• DVMRP Neighbors 2(邻居2)

这些数据包的目的地址都是224.0.0.4,该地址被保留用作All DVMRP Routers(全部 DVMRP路由器)地址(详见表5-1)。以下各小节将详细描述这几种数据包的使用情况,5.3.4小节还将详细描述这些数据包的包格式。

目前有多种DVMRP版本,RFC 10758描述的是版本1,版本3及最近的版本请参见 Internet草案。需要注意的是,DVMRP的早期版本在功能和包格式上都有所不同,本章将尽力说清楚DVMRPv3与早期版本之间的差异,但由于篇幅所限,要完整地说清楚所有差异则难以实现。除非特别指出,否则本章所说的DVMRP指的都是DVMRPv3。如果读者正在与早期版本打交道或者对其感兴趣,可以读一读RFC 1075或支持早期版本的路由器提供的软件文档。


注意: MBone上的大多数路由器都运行了DVMRP,这其中,多数路由器运行的是mrouted或mgated版本。


虽然Cisco IOS Software不支持DVMRP的完整实现,但支持到DVMRP网络(如MBone)的连接。

5.3.1 邻居发现和维护

DVMRP路由器被激活后的第一件事就是利用Probe包发现其邻居。每个Probe包都包含以下信息。

• 一组描述发信路由器DVMRP能力的标记,这些标记被用来确定与早期协议版本的后向兼容性;

• 一个阶段(Generation)ID,用来检测邻居状态的变化;

• 一个邻居地址列表,发信路由器从这些地址接收到Probe包。

上述信息中最重要的信息就是邻居地址列表。当DVMRP路由器接收到Probe包后,会记录发信路由器的地址和接收到Probe包的接口。前面说过,接收路由器永远也不会转发目的地址位于224.0.0.0/24地址段的数据包,一方面,由于Probe包的目的地址是224.0.0.4,另一方面,路由器在发送Probe包时设置的TTL值为1,因而DVMRP接收路由器知道发送方是一个直连邻居。当路由器发送自己的Probe包时,会列出所有从子网(在该子网上发送Probe包)上学习到的邻居地址,一旦路由器发现自己的IP接口地址位于邻居的Probe包中,那么就知道已经与邻居建立了双向通信连接。

DVMRP路由器发现邻居之后,仍然使用Probe包来保持激活状态,每隔10秒发送一次Probe包,如果在35秒之内都没有收到Probe包,那么就宣告邻居已经断开。

早期的DVMRP版本不使用Probe包,而是在接收到来自邻居的路由宣告消息之后,就认为已发现邻居。

在邻居发现进程中,如果在拥有组成员的子网中发现了多台路由器,那么早期版本的 DVMRP会选择一台指派路由器——将该子网上IP地址最小的路由器设置为指派路由器。指派路由器是子网上惟一可以向子网发送多播会话包和IGMP查询消息的路由器。对DVMRPv3来说,是通过IGMPv2查询选举进程(而不是从接收到的路由宣告消息中读取源IP地址)来确定指派路由器的。

如前所述,广播/剪除多播路由协议必须存储剪除状态,但是当路由器重启后,将无法知道发送或接收了哪些剪除信息。如果该路由器必须等待下一周期到达的路由更新,那么就需要花费较长的时间来重新建立多播转发,此时就需要利用阶段ID来解决这个问题。阶段ID是一个非递减的32bit数,衍生于某些变化基准(如time-of-day时钟)。当DVMRP路由器重启时,其阶段ID会发生变化,当邻居路由器在该路由器的Probe包中发现变化后的阶段ID之后,就会清除先前从该路由器接收到的全部剪除信息,还会立即将自己的路由表拷贝发送给邻居。由于已经清除了剪除状态,因而重启后的路由器能够重新转发多播数据,并重新决定是留在多播树中还是将自己从多播树中剪除出去。

5.3.2 DVMRP路由表

DVMRP路由表的主要作用是确定每个多播源的上行接口。前面的章节中已经解释过,该进程对环路避免来说非常重要,如果在除上行接口(该接口最靠近源)外的其他接口上接收到一个来自源的数据包,那么就必须丢弃该数据包。

DVMRP使用了一个RIP变体来宣告完整的路由表以及所有直连的启用多播的子网,路由信息是通过DVMRP Report(报告)消息进行宣告的,利用All DVMRP Routers(全部DVMRP路由器)地址224.0.0.4发送给所有邻居。路由更新每60秒发送一次,该周期被称为路由报告间隔(Route Report Interval)。当通过探测进程发现一个新邻居时,就不会遵循该规则,而是立即以单播方式向新邻居发送路由表。这种立即发送更新消息的机制也能用于缩短路由的重新收敛时间。

与每台路由器相关的度量值是跳数,跳数限制被明确定义为32跳,但是一条路由的度量值取值范围可以是1〜63。其中,度量值1〜31被用来表示可达的源,而33〜63则被用来表示路由相关性(route dependencies)。

为了正确进行剪除工作,DVMRP路由器必须感知其下游邻居(依靠其从特定多播源转发数据包)。对每个源网络来说,下游路由器通过向上游路由器发送毒性反转路由(其度量值是被宣告路由的度量值加上无穷大),来向上游路由器通告路由的相关性。例如,假设路由器A将网络172.16.1.0/24宣告给路由器B(跳数为3),路由器B确定路由器A是去往该子网的上游路由器,则路由器B必须告知路由器A,需要依靠路由器A将多播流量从源转发到本子网。因而,路由器B将172.16.1.0/24宣告给路由器A时携带的度量值为35(3+32),路由器A将该路由宣告识别为路由相关性。

DVMRP路由表的另一个功能是选举指派转发路由器(designated forwarder)。当多台上游路由器连接到同一个多路接入(multiaccess)网络(如图5-24)中时,只有指派转发路由器负责将多播包转发给下游路由器,从而避免了将多份数据包拷贝转发到该多路接入网络中。当多路接入网络中的两台或多台路由器进行路由交换时,可以说明哪台路由器最靠近多播源。如图5-24所示,由于上游路由器B距多播源仅有一跳,而上游路由器A为两跳,因而上游路由器B是图中所示多播源的指派转发路由器。如果有多台路由器到多播源的距离都相等,那么该共享网络上IP地址较小的路由器就成为指派转发路由器。

img331

图5-24 当多台上游路由器都通过相同的数据链路连接到多播源时,需要选举一台指派转发路由器

5.3.3 DVMRP包转发

当路由器第一次从某特定多播源接收到一个多播包之后,会使用路由表来执行RPF检查(RPF Check),以验证该数据包到达的是相对于数据包源的上行接口。如果数据包到达的是其他接口,那么就会被丢弃;如果数据包到达的是上行接口,那么就会在转发表中记录(S,G),并且将数据包拷贝转发给所有下游相关邻居。路由器也会利用IGMP来查询其每个叶子网络(即没有邻居的网络)中的组成员情况,并将多播包拷贝转发给所有包含了组成员的叶子网络。

如果没有下游相关邻居,没有包含组成员的叶子网络,那么路由器将会向上游路由器发送一条剪除消息。如果上游路由器也没有本地组成员,而且从其下游相关邻居接收到了一条剪除消息,那么该路由器将会向其上游邻居发送一条有关自己的剪除消息。这样一来,多播树就会被动态剪枝,而仅保留拥有活动组成员的树枝。

剪除消息中包含一个剪除生存期(prune lifetime),表示上游路由器重新从多播源向被剪除路由器转发多播包之前应该保持剪除状态的时间,默认的剪除生存期是2小时。如果接收剪除消息的路由器就是向上游邻居发送剪除消息的路由器,那么剪除生存期将被设置为2小时或已接收到的关于同一个(S,G)的所有下游剪除消息中剩余生存期这两者的最小值。

如前所述,主机可以在任何时刻通过向其本地路由器发送IGMP成员报告消息来表达自己加入多播组的意愿,如果该路由器先前将自己从该多播树(从该多播组传送多播包)中剪除出去了,那么就必须将自己重新嫁接到这个多播树上。这可以通过向上游邻居发送DVMRP Graft(嫁接)消息来实现,该嫁接消息会逐跳向上游传送,直至发现该多播树的一个有效树枝。

如果路由器发送了嫁接消息,且未开始从所请求的多播组接收流量,那么就必须有某种机制来了解多播源是否已停止发送多播流量或者嫁接消息是否已丢失。因而对每一跳来说,要求每个上游路由器在接收到嫁接消息之后都要向其下游邻居发送一条Graft Ack(嫁接确认)消息作为确认。此外,嫁接消息的发起路由器还会启动一个嫁接重传(Graft Retransmission)定时器,如果在定时器到期时仍未收到嫁接确认消息,那么就会重新发送一条嫁接消息并重置定时器。最初的嫁接重传定时器周期为5秒,之后的定时器周期则采用二进制指数回归算法来计算。

5.3.4 DVMRP消息格式

DVMRP包的IP头部指定的协议号是2,请注意,该协议号与IGMP相同(最初DVMRP是IGMP协议的一个子集)。本小节将描述DVMRPv3的消息格式,有关早期版本的消息格式请参见RFC 1075或其他相关文档。

1.DVMRP消息头

图5-25显示了DVMRP消息头的格式,是每条DVMRP消息的起始部分。

img332

图5-25 DVMRP消息头

DVMRP消息头的字段信息如下。

• 类型(Type):IGMP类型号,对DVMRP消息来说均是0x13。RFC 1075在该位置指定了一个4bit版本字段和一个4bit类型字段,其中,版本字段为0x1,类型字段为0x3。请注意,版本1消息头的8bit结果为0x13,与版本3相同,因而版本3具备后向兼容能力。实际的DVMRPv3版本是在主版本(Major Version)字段中指定的。

• 校验和(Checksum):一个标准的IP式校验和,长16bit,是DVMRP消息的反码的反码。

• 次版本(Minor Version)和主版本(Major Version):对所有DVMRPv3消息来说,它们被分别设置为0xFF和0x03。

• 代码(Code):指定DVMRPv3的消息类型。表5-7列出了代码字段的各种可能值以及相应的消息类型。

img333a

表5-7 代码值指定的DVMRP消息类型/MRP消息类型

Ask Neighbors(代码3)和Neighbors(代码4)已分别被Ask Neighbors 2(代码5)和 Neighbors 2(代码6)所代替。到现在为止还没有讨论过上述消息,它们常被用于mrinfo和 mstat等故障诊断命令,将在第6章的故障检测与排除中进行详细说明。

2.DVMRP Probe(探测)消息格式

DVMRP Probe消息可以提供以下功能。

• 路由器之间可以通过侦听所有DVMRP发言路由器(由发信路由器在发信接口上检测)来进行相互定位;

• 让DVMRP路由器之间交换各自的能力信息;

• 在去往同一个下游组成员存在多条路径时,可以选举一台指派转发路由器;

• 通过每10秒发送一次来提供保持激活功能,如果35秒之内仍未接收到来自邻居的探测消息,那么就断定该邻居已断开。

图5-26显示了Probe消息的格式。

img333b

图5-26 DVMRP Probe消息格式

DVMRP Probe消息的字段信息如下。

• 能力(Capabilities):将头部中的8个保留bit用作能力标记,Probe消息是惟一一个修改头部字段的DVMRP消息。表5-8列出了能力标记及其含义,如果标记被设置为1,那么发信路由器就支持相应的能力。

img334a

表5-8 DVMRP能力标记

• 阶段(Generation)ID:一个非递减的32bit数,在路由器重启后,利用该字段可以无需等待整个报告间隔即可检测邻居状态的变化情况。当检测到阶段ID发生变化后,所有来自发信路由器的剪除信息都被视为无效且被清除。如果剪除信息已经被发送给上游邻居,那么就会发送一条嫁接消息,这样一来,重启后的路由器就被认为是多播树上的一台新路由器,重新进行广播/剪除进程。

• 邻居地址(Neighbor Address):列出了邻居情况,发信路由器在发信接口上从这些邻居接收到Probe消息。

3.DVMRP Route Report(路由报告)消息格式

如图5-27所示,Route Report消息每60秒发送一次,该消息包括一个或多个网络掩码列表以及一个或多个源网络地址及相关联的度量值(与网络掩码相对应)列表(对每个网络掩码来说)。虽然图5-27中的源网络长度为3个8位组,但实际长度可变(如本小节所述)。

img334b

图5-27 DVMRP Route Report消息格式

DVMRP Route Report消息的字段信息如下。

• 掩码(Mask):网络掩码,总是假定网络掩码的第一个8位组为255,因而掩码字段中仅包含最后3个8位组。该假定意味着DVMRP路由不能被聚合到前缀长度小于8的地址中。

• 源网络(Source Net):一个前缀长度与前面网络掩码相对应的源网络地址,源网络字段的长度随网络掩码的变化而变化。例如,如果网络掩码字段为255.0.0,该掩码字段描述的掩码是255.255.0.0(因为第一个8位组总是被假定为255),那么跟在该网络掩码之后的源网络字段是2个8位组(与所指定的前缀长度相对应)。

默认路由器的网络掩码为0.0.0,一个8位组源网络为0,DVMRP路由器总是将其解析为0.0.0.0/0,而不是0.0.0.0/8。

• 度量值(Metric):发起报告消息的路由器与源网络之间接口度量值之和。度量值以跳数为单位,32表示无穷大,但度量值取值范围是1〜63。如5.3.2小节所述,路由器通过向上游路由器宣告一条毒性反转路由(其度量值是接收到的度量值加上无穷大(32)),来向上游路由器通告路由相关性,因而度量值33〜63表示下游相关性。

4.DVMRP Prune(剪除)消息格式

图5-28显示了Prune消息的格式。

img335

图5-28 DVMRP Prune消息格式

DVMRP Prune消息的字段信息如下。

• 源主机地址(Source Hosting Address):发信主机的IP地址。

• 组地址(Group Address):被剪除多播组的地址。

• 剪除生存期(Prune Lifetime):上游邻居保存剪除信息的时间(以秒为单位),等于该组地址所接收到的下游剪除消息的最小剩余生存期,如果没有下游剪除消息,就等于默认剪除生存期2小时。

• 源网络掩码(Source Network Mask):被剪除多播组的源网络的网络掩码。该字段为可选字段,仅当上游邻居在其Probe消息中表明其理解网络掩码时才包括此字段。

5.DVMRP Graft(嫁接)消息格式

图5-29显示了Graft消息的格式。

img336a

图5-29 DVMRP Graft消息格式

DVMRP Graft消息的字段信息如下。

• 源主机地址(Source Hosting Address):发信主机的IP地址。

• 组地址(Group Address):被嫁接多播组的地址。

• 源网络掩码(Source Network Mask):被嫁接多播组的源网络的网络掩码。该字段为可选字段,仅当上游邻居在其Probe消息中表明其理解网络掩码时才包括此字段。

6.DVMRP Graft Acknowledgement(嫁接确认)消息格式

图5-30显示了Graft Acknowledgement消息的格式。除了头部中的代码字段之外,该消息的格式与正在被确认的Graft消息完全一致。

img336b

图5-30 DVMRP Graft Acknowledgement消息格式

7.DVMRP Ask Neighbors 2(询问邻居2)消息格式

DVMRP Ask Neighbors 2消息是用于故障检测与排除的两条消息中的一条(另外一条是下一节将要描述的Neighbors 2消息),此处的数字“2”是为了区分已被废弃的Ask Neighbors消息。如图5-31所示,Ask Neighbors 2消息采取单播方式被传送给目的地,当路由器接收到一条Ask Neighbors 2消息之后,需要以单播方式向发信方响应一条Neighbors 2消息。从图中可以看出,该消息仅仅是将代码字段设置为0x5的DVMRP消息头。

img336c

图5-31 DVMRP Ask Neighbors 2消息格式

8.DVMRP Neighbors 2(询问邻居2)消息格式

DVMRP路由器以Neighbors 2消息来响应Ask Neighbors 2消息(如图5-32所示)。该消息是以单播方式传送给Ask Neighbors 2消息的发起者,指示发送方的DVMRP能力,并列出发送方的逻辑接口地址,对每个所列接口来说,均指定该接口的DVMRP参数,并列出在该接口上发现的DVMRP邻居。

img337a

图5-32 DVMRP Neighbors 2消息格式

DVMRP Neighbors 2消息的字段信息如下。

• 能力(Capabilities):指定发信路由器的DVMRP能力,该字段与Prune消息的能力字段一样,其取值情况详见表5-8。

• 本地地址(Local Address):路由器上的接口地址,如果接口处于无效或禁用状态,那么只有一个邻居表项与该接口相关联,且邻居表项的地址为0.0.0.0。

• 度量值(Metrics):指定接口的DVMRP度量值。

• 阈值(Threshold):指定接口的管理性定界阈值。

• 邻居计数(Neighbors Count):指定该接口所列出的邻居数量。

• 邻居(Neighbor):该接口所知晓的DVMRP邻居的IP地址。

• 标记(Flags):一串描述接口操作参数的bit,表5-9列出了该字段的bit取值情况以及每个标记bit的含义。

img337b

img338