组播组信源开始发送流量:
如果此时是源树,第一跳路由器A收到组播组流量,我会第一个考虑把报文转
发给接收者。
如果此时是共享树,第一跳路由器A收到组播组流量后,我不是第一时间往接收 者转发,而是把信源发送过来的流量全部转发到RP上,在RP上所有组播流量集个 和,在由RP把组播流量下放给下游的路由器,直到最终的接收者。
这样做得好处是什么?
对于下游路由器C和E而言,我收到的组播流量是Source 1还是Source 2发 来的,对于C和E路由器来说不重要,因为不管你是哪个源给我发的,都是由RP 给我转发过来的。
此时C和E路由器在组播路由表项中,不再需要(S,G)表项。因为C和E根 本不会关心Source在哪里。
所以好处节约在由RP到接收者那块网络所有路由器上,他们收到组播流量的时 候,路由表项中只会形成(*,G)。 * = All Sources G = Group (*,G)用来表示我不关心源在哪里,只关心流量发给哪个组播组。
在一个组播域内使用共享树,那这个共享树是哪到哪?
答:共享树是从RP到达接收者,而信源达到RP依旧是源树!!!
共享树优势:
就是节省了RP下游所有路由器路由表项资源 共享树劣势:
从信源发送流量到达接收者,使用的不再是最优路径,使用的是次优路径。会 导致高延迟,高抖动。 怎样解决这劣势呢?
PIM协议有方式解决这个问题,当我们使用共享树的时候,只有第一个组播报 文会实现这种次优路径转发。
而当我们实现了树形结构切换之后,从第二份组播报文开始,我们的流量依据 会使用最短路径去转发。
至于怎么实现,一会去谈。
PIM(Protocol Independent Multicast)协议
当前有两个版本,v1和v2,当前使用最多的是PIMv2版本。该版本是一个业界标准协议。这个协议分为两种模式,Sparse Mode和Dense Mode。
而当今社会上使用最多的是第三种模式,Sparse-Dense-Mode。
1.PIM Neighbor Discovery
PIM是四层协议,协议号为 13 。
注意:路由器之间运行了PIM,在我们能够传递组播报文之前,先要关注PIM邻接关 系是否正确建立。这个邻接关系就是通过Hello报文来建立的。 Hello报文也是组播发送,目标组播地址为224.0.0.13。
Hello: 30s Hold: 3.5 X 30s
运行PIM的路由器想要建立邻接关系,必须是直连建立邻居。但是,我们的连接有两 种类型,一种是point-to-point,一种是MA网络。
PIM协议可能是学习OSPF协议,在MA网段建立邻接需要选举DR(指定路由器)。 DR的选举:
a.该网段内所有接口的PIM的优先级,优先级越高越优,缺省接口优先级都为1 b.看接口的IP地址,越大越优 DR的作用:
在IGMPv2中有查询者的概念,而IGMPv1中没有查询者。IGMPv1在一个MA网段内 如果选不出查询者,这个时候就由PIM的DR来充当查询者。
由于IGMPv2有查询者,所以对于PIM协议的DR这个概念来说,只适用于IGMPv1。
注意:
A. PIM协议下,只有DR,没有BDR。相对于OSPF协议来说,一旦DR选举出来,该 网络DR的角色不会随着新加入的路由器而会改变。
相对于PIM协议而言,DR是时时选举的。任何时候一台路由器连接到这个网段, 只要把接口PIM的优先级改高,我都可以抢占DR的角色。
B. 在OSPF协议中,DR是接口概念
而在PIM协议中,DR也是一个接口概念。每个MA网段都要选举出一个DR。
C. 在OSPF协议中,如果一个接口优先级为0,则表示放弃选举DR的能力 在PIM协议中,如果一个接口优先级为0,仍然可以参与DR的选举
注意:
PIM建立邻居后,是不会传递路由的。只有当收到数据层面的组播报文的时候,我才会形成路由表项。 问题:
既然PIM不传递路由,那运行PIM协议有什么用?有个重要原则跟大家提一下 答:
运行PIM后,路由器接口的工作改变
a.对于First hop Router的接收组播流量接口,如果该接口没有启用PIM,则 无论收到什么组播报文,都会本地拆包后将报文丢弃。 b.对于 List hop Router连接接收者所在网段的接口,如果该接口没有启用PIM, 则路由器不会周期性的发送IGMP Query报文。
c.对于中间路由器彼此互连的物理接口,如果没有启用PIM,这些路由器不会通 过任何接口转发任何组播报文。
下面对于Dense Mode和Sparse Mode在运作的时候注意的一些细节 1.Dense Mode
在这个Dense Mode下被开发的PIM时,初期我们的开发者这样定义该模式。他会假象 什么情况下需要使用该模式?
在整个路由选择域内,95%以上的PC都是组播组流量的接收者时,这个时候使用Dense
Mode。在这种情况下,我们的Dense Mode是基于一个Push model(推模型)来运作的。
先不提Push model,先把Dense Mode和Push model以及分发树来做一个对应。
此时看一下Push model是一个怎样的工作原理?
这里涉及到一个初始泛洪(Initial Flooding),如图,此时在所有的路由器上部署了PIM-DM之后,等邻接关系建立完毕,协议收敛完成。Source开始发送组播流量,这个组播流量到达第一跳路由器,第一跳路由器会通过所有的接口把这个流量泛洪下去。所有受到该泛洪流量的路由器呢,会通过其他接口在把该流量依次的泛洪下去。这个就是初始泛洪,也就是Push原理。
Push就是,只要组播组信源开始发送组播组流量,我不管下游有没有接收者,我都一股脑的把该流量给泼下去。
这种无谓的把流量泼下去,不知道接收者在哪。这样做仅仅浪费带宽。
对于该情况,Dense Mode该怎么补救呢?
这个补救方式如图,如果一台路由器判断它的下游,没有组播组的成员,我会通过接收组播流量的RPF接口,反向发送一个Prune Messages报文。
该报文的目的就是,该路由器告诉上游转发组播流量的路由器,本地没有接收者,请你不要在通过这个接口给我发送组播流量。
修剪最后的结果就是,只有接收者的那条链路会传递组播组报文。
注意:
一个接口收到Prune报文之后,会停止转发组播流量,但我不会永远停止发送组播组流量。因为如果永久停止发送组播组流量,不符合DM的设计原理。 DM的设计原理就是:全网95%以上都是组播组成员,谁又能知道当该接口被阻塞之后,多久之后,该邻居又会连接组播组成员呢。
重点:当一个接口收到Prune报文之后,我会在该接口开启一个计时器,该计时器缺省值180s。也就是一个接收收到Prune报文后,在该180s内该接口不会转发任何的组播流
量。但180s计时器一旦过期,立即通过这个接口在发送组播流量。以此循环。 PIM-DM的Push model工作总结:
初始情况下,只要PIM邻接关系建立完毕,只要信源发送组播流量。每台路由器收到之后,都会默认通过所有其他启用PIM的接口泛洪该组播流量。而此时会导致,大量的链路带宽被浪费。
此时,如果一台路由器发现自己下游并没有连接组播组成员,该路由器会通过RPF接口反向发送Prune报文,邻居路由器只要通过接口收到Prune报文,会开启一个1180s的倒计时计时器。
在这个计时器到期之前,该接口无法在转发组播流量。当该计时器过期,我会在通过这个接口发送组播组流量。
这就是每3分钟一次的泛洪与修剪过程。
问题:
路由器是怎么发现下游有没有组播组成员? 答:
通过IGMP协议,只要收到Report报文就是由组播组成员。
PIM-DM实验举例:
如图:R3是组播源,发送去往224.1.1.1组播组的流量。R2为接收者,也就是PC。R1、
R4、R5、R6为组播路由器。全网运行PIM-DM。
配置:
第一步:如图所示,先把各个接口配置上IP地址,起个Loopback接口。
第二步:做一个单播IGP路由协议,如果不做,其他路由器RPF校验失败。也就是在组播路 由选择协议之前,单播路由选择协议已经收敛完成。
(此时做IGP,R5要不要把35网段宣告进来?一定要,如果没宣告进来,R1及后 面的路由器的IGP表里没有35网段,就没法访问源,访问不了源地址,RPF校 验就失败。
此时R4要不要把24网段宣告进IGP?这就没有必要了,因为Source发送组播 组流量给目的地,Source不需要知道目的地在哪吧。因为只要我向这个组播地 址发,我的接收者只要加入这个组播组,接收者就能收到该组播组的流量。)
所以24网段可宣告可不宣告,35网段必须宣告进IGP。 全网运行OSPF协议
第三步:启用PIM协议 命令:
R(config)#ip multicast-routing distributed //该红色单词在三层交
换机上开启组播路由功能时才需要添加,路由器上不会添加该单词 R(config)#int f0/1
R(config-if)#ip pim dense-mode
Neighbor:直连PIM邻居的接口IP地址 Interface:本地连接邻居的接口
Uptime:邻接关系从建立开始计时,已经多久了
Expires:超时时间,也就是Hold time,默认3.5 X 30s Ver:PIM版本 Prio:优先级
Mode:描述邻居的角色,S代表状态可刷新
状态可刷新:对于一些早期设备,它启用PIM后,选举DR角色只看接口IP地址, 不识别优先级。如果该设备识别优先级,就打S,不识别优先级呢就打N。
第四步:R3为组播组信源,先把他模拟为PC 命令:
R3(config)#no ip routing
R3(config)#ip default-gateway 35.1.1.5 R2(config)#no ip routing R2(config)#int f0/1
R2(config-if)#ip igmp join-group 224.1.1.1
此时,由于没有产生组播流量,所以组播路由表是空的 但是R4组播路由表中有表项