关于PIM(摘自cisco官方文档):
发送者和组成员可能在远程网络那么这样一来,发送者发出的数据,必须
经过路由器才能到达组成员的网络,所以要使组播数据准确地被转发到组成员的网
络,就必须让中间的路由器也知道组成员网络的位置所在。两个不同网络的主机使
用单播通信时,数据可以被中间路由器准确地转发,是因为路由器的单播路由表中
能够找到目标网络的位置,如果要让路由器也能像转发单播数据一样,将组播根据
路由表来精确地转发到目的地,那就需要让路由器拥有像单播路由表一样的组播路
由表,从而让路由器在收到组播时,就像查单播一样,去查组播该从什么样的接口
被发出去才能到达目标网络。要让路由器生成一张功能完全的组播路由表,就需要
在路由器之间运行一种协议,这种协议可以让组播源和目的之间的路由表生成单播
表一样地生成组播表,最后路由器根据这张组播路由表来完成组播的转发。这个协
议就是 PIM (Protocol Independent Multicast)。其实要让路由器知道目标组
员的位置,完全可以依靠单播来找到组员,所以只要组播的源和目的之间单播是通
的,那么组播路由表就能建立,而不用管单播运行的是动态路由协议还是静态路由
协议,但是前提是 PIM 必须依靠单播路由表才能生成。 查看:show ip mroute
show ip mroute 224.1.1.1
组播树
因为在需要将一份数据同时发给多个接收者时,而开发了组播技术,所以组播的发
送者通常面临着要将数据发向多个接收者,并且这些接收者可以分布在任意网络的
任意位置。如果接收者在远程网络,那么就需要路由器提供组播转发,所以要保证
接收者能够正常收到组播,就必须让路由器知道自己该将组播从什么样的接口发出
去,当组播到达下一跳路由器后,下一跳路由器同样也必须知道该将组播从什么样
的接口发出去,即使接收者不是与自己直连的,只有这样让路由器之间协同工作,
都能够记住组播的出口,最终在发送者与接收者之间形成一条连线,这样才能完成
组播的转发。当多个网络存在接收者时,那么这样的连线就会有多条,组播发送者
到接收者之间的这些转发线路,被称为组播转发树,而组播发送者就好比是组播树
的树根,组播总是从根发向接收者。
总结:记住组播的出口信息,这就是组播路由表的工作。
组播反向路径转发
路由器不小心或者由于各种原因再将组播发送回来,对于这样已经出现环路的数据,
如果路由器收到后,再次将组播转发出去,那么只会形成组播风暴,最终危害整个网络。
结论:必须只将数据往接收者的方向转发,而绝不能往发送者的方向转发
组播反向路径转发(mRPF),让组播路由器只将数据往接收者的方向转发,而不能往发送者的方向转发,也是组播路由器必须遵循的机制。
结论:组播路由器在收到组播数据后,都要对数据进行 RPF 检测,只有从源的方向发来的数据才能被转发,从其它接口过来的数据被认为是无效的。
PIM-DM(密集模式)
要形成组播树,路由器需要知道哪些接口出去能够到达接收者,并记录下来,然后
再记录到发送者的 RPF 口。要让路由器知道哪些接口存在接收者,有两种方式,
第一种方法是接收者主动向路由器报告,第二种方法是路由器主动向网络中发出查
询,而 PIM-DM 模式中,采用的方法为路由器主动向网络查询是否有接收者。
3个接口状态:
forwarding RPF 接口 pruning
3个接口状态: forwarding RPF 接口 pruning
PIM-SM(稀疏模式)
1.建立组播树时,PIM-SM并不会让路由器发送查询数据包去查询组成员,而组成员的发现是靠组成员自己主 动向路由器发送报告数据包
2.记录路由表的方式也不一样,例如网络中有一个组,地址为:224.1.1.1,发送者为 100.1.1.1,
PIM-SM 模式记录为(*,G),不关心组播的源地址,而统统将源地址使用星号*来表示,
称为(*,G) ,其中*就是组播源地址,G 就是组地址。
3.2个接口状态:forwarding和RPF 接口,不记录pruning状态的接口,节省资源。
RP
(*,G)造成路由器不知道组播发送者的 IP 地址是什么,也就无法完成 RPF 反向路径检测。
在这种情况下, PIM-SM 在网络中选出一个组播会聚点,即Rendezvous Point (RP),
结论:
1.RP 就是组播网络的核心,发送者统一将组播数据发送到RP,然后 RP 再将数据发到接收者。 2.RP的地址,就是组播源的 IP 地址
3.RP 就是组播源,最后 PIM-SM 中的组播树,即(*,G)形式的树被称为共享树(RPT)。
4.RP是SPT和RPT的汇聚点(像一个中介,不管你买房还是卖房,都要通过中介)
PIM中的消息
PIM-DM使用5个PIMv2消息: 1. Hello
a) 使用hello消息来发现邻居,一旦PIM路由器启动,他就周期性地在每个配置PIM的接口上发送hello消息。 b) PIMv1路由器有相同的功能,但他们采用query消息。 c) Hello消息中有一个保持时间,这个时间定义了邻居等待下一个消息的最长时间,如果没有等到这个消息,
邻居就宣布这个发起路由器已经死亡。
Hello默认为30s,可以用ip pim query-interval命令加以改变,保持时间自动设为hello消息间隔的3.5倍---105s 。
2. Join/prune(加入/剪除)
a) Prune消息的目的地址为224.0.0.13,上游路由器的地址封装在这个消息中。 b) 组播源开始向所有邻居发送查询消息,邻居会再向自己的邻居
发送查询消息,如果有路由器连接着组成员,那么
就会向上一跳邻居发送 join 数据
包,用来通告自己需要接收组播,从而将自己接入组播树。其它没有连接组成员或
不需要接收组播的路由器则向上一跳邻居发送 prune 数据包,用来通告自己不需要
接收组播,状态被标为 prune,而不是 forward。
3. Graft(嫁接)
a) 该消息是以单播方式传送到上游邻居,当上游路由器受到Graft消息,就把收到
这个消息的接口加到他的 输出接口列表中。这个接口设为前传状态,并且马上 用单播方式给新的下游邻居发送一个graft ack消息。
b) 如果路由器已经把自己从多播树中剪除,那么他必须向自己的上游路由器发送一个 graft消息,不能发送 join 数据包
c) 当路由器发送了graft消息,就会等待graft-ack消息,等待时间为3s,如果在这段
时间内没有收到确认信号, 路由器就重新发送graft消息
4. Graft-ack(嫁接确认) a) 参考上面
5. Assert(声明)
a) 选举指定前转器,Assert 是用来选举 PIM 前转器的,当从源到组成员有多条
路径可走时,则选择其中唯一的一条路径,被选中的路由器称为 PIM 前转器。
b) Assert 消息中包括源和组地址,以及到源的单播路由 AD 值和 metric 值,
先选AD 值低的,其次是 Metric,最后是最高IP 地址,落选的把自己的出口剪除。
Assert机制
主要为了防止复制包问题(选举转发路由器)
过程:
如果是以上这个图的情况,R1和R2收到组播包后都会向PC发送组播包,这时PC端将会收到2个同样的组播包。
解决这种复制包问题的方法就是Assert机制:当一个组播路由器从一个OIL接口收到组播包后表示除了自己之外,还有别的组播路由器在转发这个组播流量。这时如果路由器在接口上启动了assert机制,就会发送assert包带上distance,metric,这个distance,metric是指单播路由表中组播包源的路由的管理距离和度量值。用于选举出一个路由器来转发这个组播包,选举失败的路由器会停止转发组播包,并向源prunes。
选举机制如下:首先比较distance,然后比较metric,选小的;如果都一样,就比较发送assert包的接口地址,选大的。
剪除覆盖
过程:R2向R1发送一个prune消息,R1的地址是封装在这个消息中的,目的地址为224.0.0.13,
当R1受到这个消息,并不立即剪除这个接口,而是设置一个3s的计时器,同时,因为prune消息
的目的地址是多播地址,R3也受到这个消息,他看到这个要剪除的组时他要继续接收的那个,
而这个消息也已经发送到了他的上游邻居处,因此,R3向R1发送一个join消息,如上图所示,
这样R3发出的join消息就覆盖了R2发出的prune消息,只要R1在3s定时结束前收到这个join消息, 流量就不会中断。 口诀:3s,join覆盖prune
PIM-SM:
PIM-SM采用了7种PIMv2的消息 1. Hello—邻居的建立与维护
2. Bootstrap(引导)—用于RP的选举 a) BSR每隔60s发送一次
b) 自举计时器为130s(类似于死亡时间) c) 多播地址为224.0.0.13,TTL为1
3. Candidate-RP-Advertisement—用于RP的选举 (后选RP宣告)
C-RP单播向BSR发送,该消息含有C-RP的地址和优先权 4. Join/prune(加入/剪除) 5. Assert(声明) 6. Register(注册)
7. Register-stop(注册终止)
其中hello、join/prune和Assert 3条消息在PIM-DM中也有,其余4条就是其特有消息
RPF 检测失败
在 PIM-SM 中,因为(*,G)形式的记录中不知道组播源的地址,也就无法完成 RPF
检测,但是又由于接收者收到的数据,都应该是 RP 发来的,路由器也就认为 PIM-SM
中的组播源地址,就是 RP 的地址,在这种情况下,路由器会以 RP 的地址为源地址
做 RPF 检测,但是在下面的拓朴中,就会出现问题:
如上图所示,当所有路由器都认为 RP 地址 23.1.1.3 就是组播源地址时,这样去
做 RPF 检测,在 R4 上检测时,因为 R4 的路由表中会显
示从接口 S 0 /0 出去可以到达
23.1.1.3,所以组播从 R4 的 S 0 /0 被发进来时,则 RPF 检测可以通过,所以在 R4 上 没有任何问题。
当在 R2 上做RPF 检测时,因为 R2 的路由表中显示到达 23.1.1.3 应该从接口 F0/1
出去,所以 R2 只会接收从接口 F0/1 发进来的组播,从其它接口发进来的,都会被
认为是环路而被丢弃。因此在真正的源 12.1.1.1 将组播从 R2 的 F 0 /0 发进来时,R2
会因为 RPF 检测失败,从而丢弃所有的组播数据,这样一来,组播也就无法通信了。 PIM DR
在 PIM-SM 中,组播源没有机制用来宣告自己的存在,又因为 PIM 路由器都认
为 RP 才是组播源,而当直接的组播源向 RP 发送组播时,会导致某些路由器 RPF 检
测失败,因此在 PIM 网络中,真正的源需要向 RP 发送注册消息,以宣告自己的存
在,而发送注册消息在多路访问的网络中则是由 DR 来代为完成的。真正的源向 RP
发出第一个组播包时,DR 将此包封装在单播中发向 RP,这
称为注册,发送的注册
消息会从 DR 到 RP 之间建立一条源树,也就是(S,G)的记录,这样,在源到 RP
之间创建的源树就可以帮助避免 RPF 检测失败,当 RP 和真正的源之间创建(S,G)
条目之后,就会通知 DR 停止以单播发送,从而转回发送真正的组播。
PIM DR 路由器在 IGMP v1 中充当IGMP 查询器的功能,来向主机发送 IGMP 查询。
选举:
1.优先级(if)#ip pim dr-priority 100 修改接口下pim dr优先级 2.IP地址
选择 DR 的数据包为 30 秒一次,105 秒保持时间,如果过了保持时间没有收到
DR 的数据包,则会重新选举 IP 地址最高的为 DR。
Register
DR 功能,在前面已经提到过,就是在 PIM-SM 中,因为 PIM 路由器都认为 RP
才是组播源,而当直接的组播源向 RP 发送组播时,会导致中间路由器 RPF 检测失
败,因此在 PIM-SM 网络中,真正的源需要向 RP 发送组播,就应该建立一条(S,G)
的记录来避免 RPF 检测失败。当真正的源向RP 发出第一个组播包时,DR 将此包封
装在单播中发向 RP,这称为注册,也就是 Register 消息,发送的注册消息会从 DR
到 RP 之间建立一条源树,也就是(S,G)的记录,这样,在源到 RP 之间创建的源
树就可以帮助避免 RPF 检测失败,当 RP 和真正的源之间创建(S,G)条目之后,
就会通知 DR 停止以单播发送,从而转回发送真正的组播。
Register-Stop
因为 PIM-SM 中真正的源需要向 RP 发送 Register 消息来注册,从而建立(S,G)
条目,将组播正常发向 RP,当 RP 和真正的源之间创建(S,G)条目之后,就会发
送 Register-Stop 通知对方停止发送单播,从而转回发送真正的组播。
关键问题是如何选举RP 2.有3中方法选举RP:
a) 静态指定:注意点是所有的路由器都需要指定;
b) Auto-RP:思科私有;
c) BootStrap(自举协议):共有的。
关于静态指定:注意点是所有的路由器都要指定 Ip pim rp-address 2.2.2.2 //配置静态RP 静态RP缺点:
1.因现有的RP的地址改变或安装了新的RP,RP的地址必须改变;
2.RP产生故障,静态配置的PIM域不会简单选择备用的RP。
BootStrap
网络中配置多个 RP,起到备份的作用当正在使用的RP 失效后,
协议可以立即重新选择其它路由器成为活动 RP。自举协议 BSR 的工作
方式为在网络中配置多个 RP,称为候选 RP(C-RP),但只有一个 RP
是正在使用的活动 RP。 RP选举规则:
1. 比较优先级(低) 2. 比较哈希值(高) 3. 比较C-RP IP地址(高)
BSR
R3 和R4 都配置为 C-RP,因为某些原因,R3 发出的 RP 竟选消息只被 R1
和 R2 收到,而R4 发出的RP 竟选消息只被R5 和R6 收到,那么R1 和R2 都会认为
R3 是 RP,而R5 和R6 都会认为R4 是RP,那么这样一来,网络中路由器得到的 RP
信息就变的不一致,从而导致组播故障。
解决方法:在网络中选举出一个 RP 裁判,称为 BSR。 所有 C-RP 将自己竟选 RP 的消息统一发送到 BSR,是通过单播发向 BSR 的,
最后由BSR 从收到的竟选消息中,选择出活动 RP,再将活动 RP 的地址统一 发给网络的每台路由器
C-RP:一台C-RP配置一个RP-IP地址和0-255之间的优先级, 单播向BSR发送Candidate-RP-Advertisement消息,用于竞选RP
BSR选举规则:
1. 比较优先级(0-255,默认是0)(低) 2. 比较BSR IP地址(高)
Ip pim bsr-candidate lo0 Ip pim rp-candidate lo0 Show ip pim bsr-route
Auto-RP协议
Auto-RP 的工作过程与 BSR 相同,同样是在网络中配置多个
//设置C-BSR //设置C-RP //看谁选举为bsr
候选 RP和 RP 裁判,
候选 RP 向 RP 裁判发送竟选消息(RP-Announce),最后 RP 裁判从候选 RP 的竟选消息
中选出 IP 地址最高的为活动 RP,然后发送 RP-Discovery 通告给每台路由器
Mapping Agent(映射代理)—RP 裁判:
1.手工指定,可以指定多个,每个Mapping Agent都有效, Mapping Agent发送选举出的RP,而BSR只有一个 2.向地址224.0.1.40发送RP-discover消息:60s一次
CRP(候选RP):
1.向地址224.0.1.39发送RP-Announce消息:60s一次,(死亡时间为180s,总是其3倍),
2.Mapping Agent默认是属于224.0.1.39这个组的 3.选举规则:只比较最大的IP地址,没有优先级了
第二十二条军规 出现原因:
如果在上图网络中仅运行 SM 模式,并且使用 Auto-RP 来选举 RP,当配置 R4 为
C-RP,配置 R2 为 RP-mapping agent 时,R4 必须发送 Announce 来竞选 RP,当 R2 收
到 R4 的 Announce 后,才能得到最后的结果。配置 SM 模式时,在没有 RP 的情况
下,组播是不通的,所以 C-RP 要发送 Announce 将 RP 选出来,但是 C-RP 在发送
Announce 时使用的目的地为 224.0.1.39,这也就意味着 C-RP 发出的 Announce 是到
达不了远程 RP-mapping agent 的,因为没有 RP,所以最终导致没有RP 的情况下,
组播就不通,组播不通就选不出 RP,结果是组播永远通不了,要解决这个问题,就
是要在 RP 没选出来的情况下就要让组播能够通信,这种情况
下,就可以将 PIM 模
式配置为 sparse-dense-mode,因为这种混合模式下,在没有 RP 时,可以走 SPT 从
而连通组播,这样目的地为224.0.1.39的Announce也就能够正常发送到RP-mapping agent,就能选出RP 了。
注意点:由于“第二十二条军规”,所以要用ip pim saprse-dense-mode
所以,潜规则:anto-RP一定要和saprse-dense-mode配对。 Ip pim send-rp-discovery loopback0 scope 255 //mapping agent
Ip pim send-rp-announce loopback0 scope 255 //设置C-RP
Autorp listener
Autorp listener 同样是用在没有 RP 的情况下需要连通组播,因为在 SM 模式下,
Auto-RP 需要让 C-RP 向 RP-mapping agent 发送 Announce 来选举 RP,而因为发送
Announce 时所使用的就是组播,当 RP-mapping agent 在远程网络时,是收不到 C-RP
设
置
发来的 Announce 的,那么在这种情况下,就可以从 C-RP 到 RP-mapping agent 的中
间路由器配置 Autorp listener,命令为在全局模式下输入 ip pim autorp listener,并且
只是在SM模式下需要配置Autorp listener,除此之外,也可以使用sparse-dense-mode 来解决。
命令:
全局模式下ip pim autorp listener
Pim sparse-dense-mode
组播路由器在运行 PIM 时,可以运行在 SM 模式下,也可以运行在 DM 模式下,
当运行在 SM 模式下时,必须有 RP,否则网络不通,而运行 DM 时,不需要 RP 组
播就能通信。但 PIM 路由器可以同时运行两种模式,即 sparse-dense-mode,当同时
运行这两种模式时,如果一个组有 RP 时,则使用共享树,但是当 RP 失效时,则可
以使用最短路径树来保证组播的通信。
当一个接口配置成这个模式时,他在知道组RP的位置时
使用稀疏模式,如果不知道RP的位置,他使用密集模式。