PIM-DM的关键特性如下:

A:协议无关(使用单播路由表来进行RPF检查);

B:没有单独的多播路协议(按照DVMRP方式);

C:泛洪-剪枝行为(3分钟周期);

D:无类路由(只要使用的是无类单播路由);

下面对PIM-DM进行简单描述,包括邻居发现、源树、多播转发、剪枝、断言、嫁接和状态刷新;

1、PIM邻居发现

   PIM使用邻居发现机制来建立PIM邻居邻接关系,通过HELLO信息实现。每一个HELLO周期(默认是30S)内,PIM多播路由哭器在启用PIM的接口上多播一条PIM HELLO消息到所有PIM路由器多播地址(224.0.0.13)。PIM路由器会维护一张PIM邻居表项;

   HELLO消息包含一个保持时间HoldTime,用来告诉接收者,当在HoldTime内没有收到HELLO消息,将终站邻居关系,即把邻居从PIM邻居表项中删除。一般HoldTime=3*HelloTime;

  Hello消息除了用来邻居发现外,还可以用来在公享网络(即多路访问网络)中选举指定路由器(Designated Router,DR).DR 选举规则:PIM接口优先级最高者成为DR,如果优先级相同,则具有最高IP地址的路由器成为DR;

   在PIM-DM 版本1中没有DR这个角色,在V2版本中开始有DR角以,主要是用来发送IGMP Query。

   PIM-SM中DR就非常重要,在SM中会说明;

2.PIM-DM源分发树

    在PIM-DM中,最短路径树(SPT)或源分发树是网络中将多播转发到接收者的唯一方式。只要多播流量一开始发送,就立即通过泛洪-剪枝机制建立SPT。

   PIM-DM用邻居信息来构建源分发树SPT。最初将邻居看作是在SPT上,而且入向接口看作是源方向上的接口(基于单播路由表),所有其他PIM-DM邻居看作是该源的下游。该SPT最初形式称广播树,因为路由器以一种类似广播的形式来发送多播流量到所有下游邻居。

3.PIM-DM多播转发

   当PIM-DM路由器最初接收到多播数据包时,对数据包进行RPF检查,以确保数据包是从源方向上的正确接口抵达,即确保数据包是从上游接口收到。在PIM中,RPF检查使用单播路由表中的信息来执行。PIM-DM路由器搜索单播路由表,以查找能最长匹配数据包中源IP地址的路由,并使用该信息来决定多播流量的入向接口。如果在单播路由表中,存在多条路由(ECMP路由),路由器只能选择一个接口,这时,具有最高下一跳IP地址的路由用作RPF检查以及入向接口中。

  RPF检查通过之后,才会把多播数据包转发到需要的PIM邻居;否则丢弃多播数据包;

 PIM路由器第一次收到组播数据流是往有下游邻居广播,之后只往向存在接收者的邻居转发。

4.PIM-DM剪枝

  PIM-DM中Prune消息是告诉上游邻居不要再发送组播数据给自己。在下列情形下发送剪枝消息:

      A.流量到达非RPF点对点接口;

     B.没有直连接收者的叶节点路由器;

    C.位于点对点链路上的非叶子节点路由器从其邻居收到了前枝消息;

    D.LAN网段(没有直连接收者)上的非叶子节点路由器从其邻居(也位于该LAN上)接收到了剪枝消息,而且LAN网段上的其他邻居没有取代(override)该剪枝消息;

  Join消息-----OverRide:剪枝否决(也称剪枝覆盖)机制

     假设在共享网络中,有PIM路由器A通过二层Switch与路由器B、C相互连接,路由器B有PC需要接收组播数据流,但C不需要接收组播数据流。

      现在路由器A第一次收到组播数据流,往下游邻居广播组播数据流,邻居B、C都收到组播数据流。C不需要接收组播数据流,所以C会向上游邻居A发一个Prune消息(目的IP:224.0.0.13),按正常处理就是A立即停止向下流发数据流,这样C是不会再收到数据流,但B也无法收到了。于是用OverRide机制来处理这种情况。C向上游邻居A发一个Prune消息时,B也能同时收到这条Prune消息,知道自己需要接收组播数据流,所以B立即发一个Join信息,这样路由器A收到Join后,就继续向下发送多播数据流量。这里还有一个需要注意的点就是,路由器在收到Prune信息后,会等待3S,再决定下一步处理;这个3S称剪枝延迟,如果这个3S内收到Join信息,则继续转发组播数据流量,否则就停止转发;在一个大型网络中,剪枝延迟积累是比较大的。

 注:在PIM-DM中,唯一用到Join 消息的时似就是OverRide 机制,其他时候都不需要join消息。因为在PIM-DM中,默认是认为下游邻居已经join的。

5.PIM-DM Assert (断言)

 

 

PIM-DM基本处理流程_第1张图片

 

   在以上组网中,路由器A、B同时从各自的接口S0收到组播流量后,都会往E0转发,这样A、B会想互收到从对方E0发出的同一组播数据流。

     为了处理上述情况,PIM-DM中引入断言ASSERT机制:如果路由器通过位于外出接口列表中的一个接口收到了多播数据包,它将通过该接口发送一条PIM断言消息,来决定哪一台路由器继续转发该组播数据流。

   当断言机制在接口上触发时,PIM路由器发送一条包含其度量值的PIM断言消息到源。网络上所有的PIM路由器检查PIM断言消息中的度量,来确定哪台路由器具有返回多播源的最佳度量。具有最佳度量的路由器继续将来自源的流量转发到网络上,而其他PIM路由器则剪枝掉他们的接口。如果存在路由器的度量相同的情况,则根据路由器的IP地址来选择,具有最高IP地址的路由器成为转发器。

   所以在以上组网中,路由器A、B在从外出接口E0收到组播流量后,会从E0发包含去往组播源度量信息的Assert消息。最终会有一台路由器作为转让器继续转发组播数据流,另一台则剪枝掉它的E0接口。

6.PIM-DM Graft嫁接  

   PIM-DM嫁接就是将先前剪枝下来的分支嫁接回SPT分发树,以便在最短的延迟内重新接收多播流量。比如,路由器D在第一次收到组播数据流时,因没有直连成员和下游邻居需要接收数据流,所以向上游邻居发送了Prune 消息,上游路由器在一个prune消息生命周期3m内,不再向路由器D发送组播数据流。此时,如果路由器突然收到直连成员的IGMP  report 消息,则路由器D立即向上游路由器发送一个Graft消息,上游路由器收到Graft 消息后,立即转发组播数据流到路由器D。

7.PIM-DM 状态刷新(SRM)消息

    只要源S仍然在向组G发送流量,状态刷新就可以由第一跳路由器没着初始的广播树定期向下发送一条(S,G)状态刷新消息来完成。

组网如:

     组播源(S,G)---(s0)A(s1)-----(s1)B(s2)----(s2)D(s3)----

        在以上组网中,假设只有路由器B s1接口有直连成员,路由器C都无需要接受组播流量。并已向上游邻居发送了Prune消息。在路由器B中s2接口是prune状态,这个状态是3m生命周期。也就是说,每隔3m,路由器D会重新收到组播数据流,路由器D不得不再次发Prune消息。这样周而复始的进行。

       SRM状态刷新机制就是为了避免出现路由器D总是收到组播数据流量。只要路由器A还收到(S,G)的数据流,每隔一个SRM周期(1M),路由器A就会向所有PIM邻居发送SRM消息,当路由器B收到SRM消息后,就重新初始化s2接口是prune状态( 即把S2的prune状态重置成3m)。在对因为断言过程而剪枝的接口而言,SRM消息优势更突然,这样就不需要再进行断言选择转发机制了。

总结:在PIM-DM 中是用有源树SPT转发,收到数据流必须进行RPF检查。初次收到组播数据流量是向所有PIM下游邻居广播。PIM-DM中用到消息有:Hello、Prune、Join、Assert、Graft 、Srm ;