组播之PIM-DM

289 阅读16分钟

组播路由协议基础概念

在一个组播网络中,组播路由协议的主要作用如下:

  • 在每台路由器上确定朝向组播源(或者RP)的接口,该接口称为上游接口。在每台组播路由器的每一个组播路由表中,如果存在上游接口,那么上游接口只会有一个,只有在该接口上到达的组播流量才被视为合法的
  • 在每台路由器上确定朝向组播接收者的接口,该接口称为下游接口。当组播流量在上游接口到达时,组播路由器负责将流量从下游接口转发出去。组播流量永远不会从上游接口转发出去,因为这有可能在网络中造成环路。在一个组播路由表项中,下游接口列表中可能包含0、1或多个接口
  • 维护组播路由表项。每一个组播路由表项都以一对二元组(组播源及组播组)进行标识,而且每一个组播路由表项都包含上游、下游接口信息。从宏观的层面看,组播路由协议的工作成果是在网络中构建一棵无环的“树”,组播流量沿着这棵无环树从上游向下游转发,最终到达接收者所在的网段,而网络中的每一台组播路由器,便是这棵树上的节点

组播分发树(Multicast Distribution Tree)

SPT(Shortest-Path Tree,最短路径树)

也称为源树,是以组播源为树根的组播分发树,而组播组的接收者则可以看作是这棵树的树叶。组播流量从树根(源)出发,沿着枝干传播,最终到达树叶(接收者所在的终端网络)

组播路由表包含多个表项,每个表项都存在四个关键信息:组播源地址、组播组地址、上游接口以及下游接口。分为两种类型:(S,G)和(*,G),其中S表示具体的某个组播源IP地址,G表示具体的某个组播组IP地址,*表示任意的组播源

对于SPT而言,使用的是(S,G)表项,每一个(S,G)表项在网络中都对应了一棵独立的SPT

RPT(Rendezvous Point Tree,共享树)

与SPT不同,共享树以RP(Rendezvous Point)为根。RP类似于一个汇聚点的概念,在一个典型的组播网络中哦,通常是一台性能较好的网络设备。多个组播组可以共用一个RP,期望接收组播流量的路由器通过组播路由协议在自己与RP之间建立一段RPT的分支。组播流量首先需要从源发送到RP,然后再由RP将组播流量分发下来,组播流量顺着RPT最终到达各个接收者所在的终端网络

RPT主要使用的是(,G)表项,其中""表示的是任意的组播源。对于RPT而言,路由器对于每个组播组仅需维护一个(*,G)组播路由表项,无论有多少个组播源在向该组播组发送组播流量

//查看igmp组表
display igmp group

//查看igmp路由表
display igmp routing-table

//查看PIM组播协议路由表
display pim routing-table

//查看组播路由表
display multicast routing-table

//查看组播转发表
display multicast forwarding-table

RPF(Reverse Path Forwarding,反向路径转发)

该机制实现组播报文转发的无环化,确保组播报文在正确的接口到达,只有这些组播报文才会被路由器沿着组播分发树进行转发,如果报文在错误的接口到达,路由器将丢弃这些报文,因此RPF确保了组播流量转发路径的唯一性,所谓的正确的接口,就是RPF接口(通过RPF检查的接口),也就是上游接口

通常情况下,采用单播路由进行RPF检查。当设备收到一个组播报文时,它将在其单播路由表中查询到达该报文的源IP地址的路由,也就是查询到达组播源的单播路由,并检查该单播路由表项的出接口与接收该报文的接口是否一致,如果不一致,则认为报文未通过RPF检查并将其丢弃;如果一致,则认为报文通过RPF检查并对其进行转发

当组播路由器在SPT上接收组播流量时,将使用组播报文的源IP地址,也就是组播源的IP地址进行RPF检查,因为组播源是SPT的树根。当组播路由器在RPT上接收组播流量时,将使用RP的IP地址进行RPT检查(在单播路由表中查询到达RP的路由表项,并将该路由表的出接口指定为RPF接口),因为RP是RPT的树根

PIM(Protocol Independent Multicast,协议无关组播)

PIM-DM(PIM Dense Mode,密集模式)

PIM-DM开始工作后,假定网络中的每一个分支均存在组播接收者,因此当源开始发送组播流量后,组播流量首先被扩散(Flood)到全网各个分支,此时PIM-DM所形成的组播分发树(PIM-DM使用的组播分发树是SPT)将覆盖全网。完成组播流量的全网扩散后,存在组播接收者的分支自然会立即收到所需的组播流量,然而网络中也可能存在没有任何接收者的分支,它们对这些组播流量并不感兴趣,此时不需要这些组播流量的网络设备采用一种剪枝(Prune)的方式将自己从组播分发树上剪除

协议报文

PIM的协议报文直接采用IP封装,在IP报文头部中协议号字段的值为103

报文类型描述
Hello用于PIM邻居发现、协议参数协商,以及PIM邻居关系维护等
Join/Prune(加入/剪枝)加入报文用于加入组播分发树,剪枝报文则用于修剪组播分发树。加入及剪枝报文在PIM中使用相同的报文格式,只不过报文荷载中的字段内容有所不同
Graft(嫁接)用于将设备所在的分支嫁接到组播分发树
Graft-ACK(嫁接确认)用于确认嫁接报文
Assert(断言)用于断言机制

邻居关系

当路由器的接口激活了PIM后,该接口便开始周期性发送PIM Hello报文,报文的源IP地址为路由器的接口IP地址,而目的IP地址是组播IP地址224.0.0.13(所有PIMv2路由器组播地址)。缺省时,Hello报文的发送间隔是30秒,该时间间隔可以通过pim timer hello命令修改。路由器通过Hello报文发现直连链路上的PIM邻居,也依赖Hello报文维持PIM邻居关系。此外,PIM的DR选举也是依赖Hello报文的交互来完成的。当路由器通过Hello报文发现了一个PIM邻居后,会为该邻居启动一个计时器,该计时器的时间设置为对方的Hello报文中所携带的Holdtime(缺省为105秒),如果在计时器超时之前再次收到了该邻居发送的Hello报文,则刷新该计时器,如果一直未收到邻居的Hello报文,导致该计时器超时,则该邻居将立即被删除

Holdtime指的是路由器等待接收其PIM邻居发送的Hello报文的超时时间,可以使用pim hello-option holdtime命令修改

image.png

如图,首先在每台路由器上部署OSPF,使得能学习到去往各个网段的路由。随后路由器分别在各自的接口上激活了PIM。以AR1为例,将在G0/0/1、G2/0/0和G2/0/1接口上分别发现PIM邻居AR2、AR3和AR4。AR2和AR4都在其连接终端网段的接口上激活了IGMPv2

扩散过程

MCS1开始向组播组239.1.1.15发送组播流量,源IP地址为10.1.1.1,目的IP地址为239.1.1.15。当组播报文到达AR1的g0/0/0口时,AR1首先对报文进行RPF检查,由于报文的源IP地址10.1.1.1与AR1的g0/0/0口直连,因此该接口到达的组播报文通过RPF检查。AR1在其PIM路由表中创建一个(10.1.1.1,239.1.1.15)表项,,并将直连MCS1的G0/0/0接口指定为该表项的上游接口,同时将所有连接PIM邻居的接口(G0/0/1、G2/0/0、G20/0/1)都指定为该表项的下游接口。然后AR1将组播报文拷贝并从下游接口转发出去

注意:AR1并不是每次在G0/0/0接口上收到组播报文都执行RPF检查,那样效率太低,而且也增加了AR1的负担。实际上,当首个(10.1.1.1,239.1.1.15)组播报文到达G0/0/0接口时,AR1将会执行RPF检查,检查通过后创建(10.1.1.1,239.1.1.15)表项,并在该表项中标记上游接口G0/0/0,后续的(10.1.1.1,239.1.1.15)组播报文到达AR1的G0/0/0接口后,AR1将首先查询组播转发表,由于这些报文就是在(10.1.1.1,239.1.1.15)表项的上游接口到达的,因此AR1直接根据该表项的指引从下游接口转发出去,而不进行RPF检查

AR2在G0/0/0接口收到(10.1.1.1,239.1.1.15)组播流量后,首先进行RPF检查,通过查询OSPF路由表,AR2发现到达组播源10.1.1.1的出接口是G0/0/0,因此从该接口到达的组播流量被认为通过RPF检查。于是AR2在PIM路由表中创建(10.1.1.1,239.1.1.15)表项,将G0/0/0指定为上游接口,同时将所有连接PIM邻居的接口都指定为该表项的下游接口,在本例中,AR2除了G0/0/0接口上维护PIM邻居之外,没有其他的接口发现PIM邻居,但是本地IGMP路由表中存在(*,239.1.1.15)IGMP路由表项,而且该表项中包含下游接口G0/0/1,于是AR2将G0/0/1接口添加到组播路由表项(10.1.1.1,239.1.1.15)的下游接口列表中。然后,AR2将(10.1.1.1,239.1.1.15)组播流量从G0/0/1接口转发出去,如此,PC1就获得该组播流量。AR4操作过程与AR2一样

AR3的G0/0/0接口收到(10.1.1.1,239.1.1.15)组播流量后,首先进行RPF检查,通过查询OSPF路由表,AR3发现到达组播源10.1.1.1的出接口是G0/0/0,因此通过RPF检查,于是AR3在PIM路由表中创建(10.1.1.1,239.1.1.15)表项,将G0/0/0接口指定为上游接口,同时将所有连接PIM邻居的接口都指定为该表项的下游接口,本例子中,AR3的G0/0/1接口将被添加到(10.1.1.1,239.1.1.15)表项的下游接口列表中,然后AR3将(10.1.1.1,239.1.1.15)组播流量从G0/0/1接口转发出去

以上,当MCS1向网络中发送组播流量后,这些流量在初始时被PIM-DM扩散到了全网

剪枝过程

如图,PC1和PC2需要这些组播流量,然而AR5并不直连任何239.1.1.15组成员,因此它并不需要这些流量。此时AR5的(10.1.1.1,239.1.1.15)表项的下游接口列表为空,它将通过向上游PIM邻居发送PIM剪枝报文,将自己从SPT上剪除,报文的源IP地址是AR5的G0/0/0,目的IP地址是224.0.0.13,报文中填充(10.1.1.1,239.1.1.15)的信息。AR3在G0/0/1口收到该剪枝报文后,在其(10.1.1.1,239.1.1.15)表项中将G0/0/1从下游接口列表中移除,同时为G0/0/1接口的剪枝状态启动一个计时器,当该计时器超时的时候,接口的剪枝状态将被取消,然后AR3又将继续从G0/0/1下发(10.1.1.1,239.1.1.15)组播流量,在计时器超时之前,如果再次收到AR5发送来的剪枝报文,那么计时器将会被重置。因此,AR5将周期性向AR3发送剪枝报文,以便持续刷新AR3的G0/0/1接口的剪枝状态

由于此时AR3的(10.1.1.1,239.1.1.15)表项中下游接口列表为空,因此AR3意识到自己并不需要(10.1.1.1,239.1.1.15)的组播流量,于是AR3将从上游接口向上游PIM邻居发送剪枝报文,AR1在G2/0/0接口上收到AR3发送的剪枝报文后,将G2/0/0从(10.1.1.1,239.1.1.15)表项的下游接口列表中移除,完成修剪后,AR1只会将(10.1.1.1,239.1.1.15)组播流量转发给AR2和AR4,而AR3和AR5则不会再收到该组播流量

嫁接过程

image.png

如图,此时AR5直连PC3属于239.1.1.15成员。AR5通过PC3的IGMP成员关系报文发现直连网络中出现了组239.1.1.15的成员,于是向上游邻居AR3发送一个单播嫁接报文,该报文源IP是AR5的G0/0/0,目的IP地址是AR3的G0/0/1,报文中填充着(10.1.1.1,239.1.1.15)的信息,AR5为上游接口G0/0/0启动一个嫁接计时器(缺省3秒),如果在该计时器超时后依然没有收到上游邻居发回的PIM嫁接确认报文则继续发送嫁接报文

AR3在其G0/0/1接口收到AR5发送的嫁接报文,由于该接口当前处于剪枝状态,因此AR3将G0/0/1切换到转发状态,并将G0/0/1添加到(10.1.1.1,239.1.1.15)表项的下游接口列表中,然后向AR5发送一个嫁接确认报文。此时由于AR3自己并未接收到(10.1.1.1,239.1.1.15)的组播流量,因此它需要继续往自己的上游AR1发送嫁接报文。AR3的上游接口G0/0/0从剪枝状态切换到转发状态,并从该接口发送单播的嫁接报文给AR1,AR3为G0/0/0启动嫁接计时器,并等待AR1的嫁接确认报文

AR1的G2/0/0口收到了AR3发送的嫁接报文后,它将原来处于剪枝状态的G2/0/0从剪枝状态切换到转发状态,并将G2/0/0添加到(10.1.1.1,239.1.1.15)表项的下游接口列表中,然后向AR3发送一个嫁接确认报文;由于此时AR1已经获得了(10.1.1.1,239.1.1.15)组播流量,因此AR1直接将组播流量拷贝到下游接口G2/0/0

以上,新的SPT构建完成,组播流量沿着新的SPT从源转发到接收者

断言机制

image.png

路由器到各个网段使用OSPF来路由。AR1、AR2、AR3和AR4四个路由器都运行了PIM-DM,其中AR2、AR3和AR4各自有一个接口连接到同一台二层交换机上,PC1是组播组239.1.1.62成员,当组播源MCS1开始向239.1.1.62发送组播流量时,AR1会将组播流量转发给AR2和AR3,AR2和AR3各自对接收的组播流量进行RPF检查,检查通过后将流量从各自的G0/0/1接口发送出去,这样AR3和AR4会收到AR2从G0/0/1接口发出来的组播流量,AR3同理。结果便是AR4将在自己的G0/0/0接口收到两份重复的组播报文。断言(Assert)机制可以解决这个问题,该机制在PIM-DM和PIM-SM均被使用,断言机制能够防止多台组播路由器向同一个网段转发重复的组播流量。当路由器的某个接口被指定为(S,G)表项的下游接口,并且该接口收到了(S,G)组播流量时,断言机制将被触发,这种现象意味着在同一个网段内,还有其他设备在发送重复的组播流量,因此一场选举将会展开,从选举中胜出的一方继续向该网段转发(S,G)组播流量,而失败的一方则停止向该网段转发(S,G)组播流量

  1. AR2在自己的上游接口G0/0/0收到(10.1.1.1,239.1.1.62)组播报文,该报文经RPF检查通过后,被AR2从下游接口G0/0/1转发出去,AR3同理
  2. AR2在自己的(10.1.1.1,239.1.1.62)下游接口G0/0/1上收到了AR3发来的(10.1.1.1,239.1.1.62)组播流量,该报文无法通过RPF检查,因此直接被AR2丢弃,与此同时,AR2在G0/0/1接口上启动断言机制,AR3同理。起初双方都认为自己是胜利的一方(Winner),各自从G0/0/1接口发送PIM断言报文;源IP地址是各自G0/0/1的接口IP地址,目的IP地址为组播地址223.0.0.13,报文中的PIM荷载部分包含4个关键字段:组播组地址、组播源地址、优先级和度量值,其中组播组地址为239.1.1.62,组播源地址为10.1.1.1,优先级则是各自路由器到达组播源的单播路由优先级(OSPF默认10),度量值为2(OSPF到达组播源的度量值),然后进行比较
  3. 比较结果AR3的G0/0/1接口10.1.234.3大,因此胜出,继续转发(10.1.1.1,239.1.1.62)组播流量,而AR2的G0/0/1则不再转发(10.1.1.1,239.1.1.62)组播流量
比较规则
  • 比较双方到达组播源的单播路由优先级,优选值最小的一方
  • 比较双方到达组播源的单播路由度量值,优选值最小的一方
  • 比较双方接口IP地址,优选IP地址最大的一方
//AR1配置
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
 ip address 10.1.1.254 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
 ip address 10.1.12.1 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet2/0/0
 ip address 10.1.13.1 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
ospf 1 
 area 0.0.0.0 
#

//AR2配置
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
 ip address 10.1.12.2 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
 ip address 10.1.234.2 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
ospf 1 
 area 0.0.0.0 
#

//AR3配置
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
 ip address 10.1.13.3 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
 ip address 10.1.234.3 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
ospf 1 
 area 0.0.0.0 
#

//AR4配置
#
multicast routing-enable
#
interface GigabitEthernet0/0/0
 ip address 10.1.234.4 255.255.255.0 
 pim dm
 ospf enable 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
 ip address 192.168.1.254 255.255.255.0 
 igmp enable
 ospf enable 1 area 0.0.0.0
#
ospf 1 
 area 0.0.0.0 
#