PIM-DM协议
基本原理
PIM-DM使用“推(Push)模式”转发组播报文,一般应用于组播组成员规模相对较小、相对密集的网络。在实现过程中,它会假设网络中的组成员分布非常稠密,每个网段都可能存在组成员。当有活跃的组播源出现时,PIM-DM会将组播源发来的组播报文扩散到整个网络的PIM路由器上,再裁剪掉不存在组成员的分支。PIM-DM通过周期性的进行“扩散(Flooding)—剪枝(Prune)”,来构建并维护一棵连接组播源和组成员的单向无环SPT(Source Specific Shortest Path Tree)。如果在下一次“扩散-剪枝”进行前,被裁剪掉的分支由于其叶子路由器上有新的组成员加入而希望提前恢复转发状态,也可通过嫁接(Graft)机制主动恢复其对组播报文的转发。
PIM-DM的关键工作机制包括邻居发现、扩散、剪枝、嫁接、断言和状态刷新。其中,扩散、剪枝、嫁接是构建SPT的主要方法。
PIMv2报文头格式
版本:版本字段标识版本信息,当前为2。(目前也只有2)
类型:
0:Hello
3:加入/剪枝
5:Assert
6:嫁接
7:嫁接回应
9:状态刷新
邻居发现Hello报文
PIM路由器上每个使能了PIM协议的接口都会对外发送Hello报文。封装Hello报文的组播报文的目的地址是224.0.0.13(表示同一网段中所有PIM路由器)、源地址为接口的IP地址、TTL数值为1。
Hello报文的作用:发现PIM邻居、协调各项PIM协议报文参数、维持邻居关系。
-
发现PIM邻居
同一网段中的PIM路由器都必须接收目的地址为224.0.0.13的组播报文。这样直接相连的PIM路由器之间通过交互Hello报文以后,就可以彼此知道自己的邻居信息,建立邻居关系。
只有邻居关系建立成功后,PIM路由器才能接收其他PIM协议报文,从而创建组播路由表项。 -
协调各项PIM协议报文参数
Hello报文中携带多项PIM协议报文参数,主要用于PIM邻居之间PIM协议报文的控制。具体如下:
DR_Priority:表示各路由器接口竞选DR的优先级,优先级越高越容易获胜,优先级相同则比较IP地址,越大越好。(在IGMPv1中充当查询器,因为IGMPv1没有选举机制)
Holdtime:表示保持邻居为可达状态的超时时间。如果在超时时间内没有收到PIM邻居发送的Hello报文,路由器则认为邻居不可达。 -
维持邻居关系
PIM路由器之间周期性地发送Hello报文。如果Holdtime超时还没有收到该PIM邻居发出的新的Hello报文,PIM路由器就认为该邻居不可达,将其从邻居列表中清除。
PIM邻居的变化将导致网络中组播拓扑的变化。如果组播分发树上的某上游邻居或下游邻居不可达,将导致组播路由重新收敛,组播分发树迁移。
扩散
在该PIM-DM网络中,RouterA、RouterB和RouterC之间通过发送Hello报文建立了PIM邻居关系。HostA通过RouterA与HostA之间运行的IGMP协议加入了组播组G,HostB没有加入任何组播组。
扩散过程如下:
1.组播源S开始向组播组G发送组播报文。
2.RouterC接收到源发送的组播报文后,根据单播路由表进行RPF检查。RPF检查通过,创建(S,G)表项,下游接口列表包括与RouterA和RouterB相连的接口,后续到达的报文向RouterA和RouterB转发。
3.RouterA接收到来自RouterC的组播报文,RPF检查成功,在本地创建对应(S,G)表项,下游接口列表添加与组成员HostA相连的接口,后续到达的报文向HostA转发。
4.RouterB接收到来自RouterC的组播报文,由于与RouterB相连下游网段不存在组成员和PIM邻居,执行剪枝。
(扩散过程每三分钟重复一次,如果路由器下面没有接收者那么就要进行剪枝,对资源消耗比较大,因此适合比较稠密的网络,就是接收者比较多的网络。)
剪枝
剪枝过程如下:
1.RouterB向上游RouterC发送Prune报文,通知RouterC不用再转发数据到该下游网段。
2.RouterC收到Prune报文后,停止该下游接口转发,将该下游接口从(S,G)表项中删除。由于RouterC上还存在其他处于转发状态的下游接口,剪枝过程停止。后续到达的报文只向RouterA转发。
当下游接口被剪枝后:
- 如果下游叶子路由器有组成员加入,并且希望在下次“扩散-剪枝”前就恢复组播报文转发,则执行嫁接动作。
- 如果下游叶子路由器一直没有组成员加入,希望该接口保持抑制转发状态,则执行状态刷新动作。
嫁接
嫁接过程如下:
- RouterB希望在下一次“扩散-剪枝”来临前恢复对HostB组播报文的转发,向上游路由器RouterC发送Graft报文,请求恢复相应出接口转发组播报文。
- RouterC收到Graft报文后,恢复该接口转发,将该接口添加到(S,G)表项中的下游接口列表中。由于RouterC上有组播报文到达,嫁接过程停止。后续到达的报文向RouterB转发。
断言
当一个网段内有多个相连的PIM路由器RPF检查通过向该网段转发组播报文时,则需要通过断言机制来保证只有一个PIM路由器向该网段转发组播报文。PIM路由器在接收到邻居路由器发送的相同组播报文后,会以组播的方式向本网段的所有PIM路由器发送Assert报文,其中目的地址为永久组地址224.0.0.13。其它PIM路由器在接收到Assert报文后,将自身参数与对方报文中携带的参数做比较,进行Assert竞选。竞选规则如下:
- 单播路由协议优先级较高者获胜。
- 如果优先级相同,则到组播源的开销较小者获胜。
如果以上都相同,则下游接口IP地址最大者获胜。
根据Assert竞选结果,路由器将执行不同的操作:
- 获胜一方的下游接口称为Assert Winner,将负责后续对该网段组播报文的转发。
- 落败一方的下游接口称为Assert Loser,后续不会对该网段转发组播报文,PIM路由器也会将其从(S,G)表项下游接口列表中删除。
Assert竞选结束后,该网段上只存在一个下游接口,只传输一份组播报文。所有Assert Loser可以周期性地恢复组播报文转发,从而引发周期性的Assert竞选。
断言过程如下:
- RouterB和RouterC从各自下游接口接收到对方发来的组播报文,RPF检查都失败,报文被丢弃。同时,RouterB和RouterC分别向该网段发送Assert报文。
- RouterB将自身的路由信息与RouterC发来的Assert报文中携带的路由信息进行比较,由于自身到组播源的开销较小而获胜。于是后续组播报文仍然向该网段转发,RouterC在接收到组播报文后仍然由于RPF检查失败而丢弃。
- RouterC将自身的路由信息与RouterB发来的Assert报文中携带的路由信息进行比较,由于自身到组播源的开销较大而落败。于是禁止相应下游接口向该网段转发组播报文,将其从(S,G)表项的下游接口列表中删除。