PIM原则

PIM协议是一组用于在路由器之间的网络上传输多播的协议。 邻居关系的构建方式与动态路由协议相同。 PIMv2每30秒将Hello消息发送到保留的多播地址224.0.0.13(所有PIM路由器)。 该消息包含保留计时器-通常为3.5 * Hello Timer,默认为105秒。
我的形象
PIM使用两种主要的操作模式-密集和稀疏模式。 让我们从密集模式开始。
基于源的分发树。
建议在各种组播组的客户端数量众多的情况下使用密集模式模式。 路由器收到多播流量时,首先要做的是检查其RPF规则。 RPF-此规则用于检查具有单播路由表的组播源。 根据单播路由表的版本,流量必须到达隐藏该主机的接口。 该机制解决了组播传输过程中出现环路的问题。
我的形象
多播消息中的R3将识别多播的源(源IP),并从其单播表中检查R1和R2的两个流。 表(R1到R3)指示的接口中的流将进一步传输,而R2中的流将被丢弃,因为要到达多播源,必须通过S0 / 1发送数据包。
问题是,如果具有相同度量的两条等效路由会发生什么? 在这种情况下,路由器将为这些路由选择下一跳。 谁拥有更高的IP地址,他赢了。 如果需要更改此行为,可以使用ECMP。 更多细节在这里
在检查了RPF规则之后,路由器将一个组播数据包发送到它的所有PIM邻居,但接收该数据包的邻居除外。 其他PIM路由器重复此过程。 多播数据包从源传递到最终收件人的路径形成一棵树,称为-基于源的分发树,最短路径树(SPT),源树。 三种不同的名称,任意选择。
如何解决问题,因为有些路由器没有放弃某些组播流,并且没有人可以将其发送给更高级别的路由器。 为此,发明了修剪机制。
修剪消息。
例如,尽管R3根据RPF的规则将其丢弃,但R2将继续发送R3多播。 为什么要加载频道? R3发送PIM剪枝消息,R2收到此消息后,将从该流的传出接口列表(应从中发送此流量的接口列表)中删除S0 / 1接口。
以下是PIM Prune消息的更正式定义:
一个路由器将PIM Prune消息发送到第二个路由器,以使第二个路由器从特定的(S,G)SPT中删除在其上接收到Prune的链接。

R2收到剪枝消息后,将剪枝定时器设置为3分钟。 三分钟后,它将再次开始发送流量,直到收到下一条Prune消息为止。 这是在PIMv1中。
并且在PIMv2中添加了状态刷新计时器(默认为60秒)。 一旦从R3发送了修剪消息,此计时器就在R3上启动。 此计时器到期后,R3将发送一个状态刷新消息,此消息会将3分钟的修剪计时器重置为该组的R2。
发送剪枝消息的原因:
  • 当多播数据包未能通过RPF检查时。
  • 没有本地连接的客户端请求多播组(IGMP加入),并且没有可以向其发送多播流量的PIM邻居时(非修剪接口)。

嫁接消息。
想象一下,R3不需要R2的流量,发送Prune并从R1接收多播。 但是突然之间,通道落在R1-R3和R3之间,没有多播。 您可以等待3分钟,直到R2上的Prune Timer过期。 3分钟的等待时间很长,以免等待,您需要发送一条消息,从修剪状态立即在R2上立即显示此接口S0 / 1。 该消息将是嫁接消息。 收到Graft消息后,R2将发送Graft-ACK作为响应。
修剪优先。
我的形象
让我们看看这个方案。 R1在具有两个路由器的网段中广播多播。 R3接收和广播流量,R2接收,但是没有人广播流量。 它将修剪消息发送到此段中的R1。 R1应该从列表中删除Fa0 / 0并在此段中停止广播,但是R3会如何? 和R3在同一段中,他也从Prune收到了此消息,并意识到了情况的悲剧。 在R1停止广播之前,它将计时器设置为3秒,并在3秒后停止广播。 3秒-R3花费了很多时间,以免丢失多播。 因此,R3尽快为该组发送Pim Join消息,R1不再认为停止广播。 关于下面的加入帖子。
声明消息。
我的形象
想象一下这种情况:两个路由器同时广播到同一网络。 它们从源接收相同的流,并且都将其广播到e0接口后面的相同网络。 因此,他们需要确定谁将是该网络的唯一广播公司。 断言消息用于此目的。 当R2和R3检测到多播流量重复时,即它们自己在R2和R3上广播的多播,而它们自己广播的多播,则路由器会明白这里出了问题。 在这种情况下,路由器发送Assert消息,其中包括管理距离和到达多播源所通过的路由度量-10.1.1.10。 获奖者如下:
  1. AD较低的那个。
  2. 如果AD相等,则谁具有较低的度量。
  3. 如果存在相等性,则将其广播此多播的网络中具有较高IP的那个。

赢得投票,路由器将成为指定路由器。 Pim Hello也用于选择DR。 在本文的开头,显示了PIM Hello消息,您可以在其中看到DR字段。 获胜者是在此链接上具有更高IP地址的那个。
有用的盘子:
我的形象
MROUTE表。
在初步回顾了PIM协议的操作之后,我们需要弄清楚如何使用多播路由表。 mroute表存储有关客户端请求哪些流以及来自多播服务器的流的信息。
例如,当在某个接口上收到IGMP成员资格报告或PIM加入时,类型(*,G)的条目将添加到路由表中:
我的形象
该条目表示已收到地址为238.38.38.38的流量请求。 DC标志表示组播将在密集模式下工作,C标志表示接收者直接连接到路由器,即路由器接收到IGMP成员资格报告和PIM加入。
如果有类似(S,G)的记录,则表明我们有一个多播流:
我的形象
在S字段192.168.1.11中,我们已经注册了多播源的IP地址,它将通过RPF规则进行检查。 如果出现问题,首先要做的是检查单播表中到源的路由。 在“传入接口”字段中,指示多播到达的接口。 在单播路由表中,到源的路由必须引用此处指定的接口。 传出接口指示多播将重定向到的位置。 如果为空,则没有向路由器发送此流量的请求。 有关所有标志的更多信息,请参见此处
PIM稀疏模式。
稀疏模式策略与密集模式相反。 当稀疏模式接收到多播流量时,它将仅通过存在对此流请求的接口发送流量,例如,请求此流量的Pim Join或IGMP Report消息。
SM和DM的相似元素:
  • 邻居关系的构建方式与PIM DM中的相同。
  • RPF规则有效。
  • DR的选择类似。
  • Prune Overrides引擎和Assert消息相似。

为了控制谁需要网络上的何处,何处以及什么多播流量,需要一个公共信息中心。 这样的中心,我们将有集合点(RP)。 任何需要某种多播流量的人或开始接收来自源的多播流量的人,然后将其发送到RP。
当RP接收到多播流量时,它将把它发送到先前请求此流量的那些路由器。
我的形象
想象一下这样的拓扑,其中RP是R3。 R1收到来自S1的流量后,便立即将此组播数据包封装在单播PIM注册消息中,并将其发送给RP。 他怎么知道谁是RP? 在这种情况下,它是静态配置的,稍后我们将讨论动态RP调整。
ip pim rp地址3.3.3.3

RP会看起来-是否有想要接收此流量的人提供任何信息? 假设不是。 然后,RP将向R1发送一个PIM Register-Stop消息,这意味着没有人需要该多播,注册被拒绝。 R1将不发送多播。 但是多播源将发送它,因此R1在接收到Register-Stop之后将启动Register-Suppression计时器,该计时器为60秒。 在计时器到期前5秒钟,R1将向RP端发送一个空注册消息,其中包含Null-Register位(即,没有封装的组播数据包)。 RP反过来会像这样:
  • 如果没有收件人,则它将以注册停止消息作为响应。
  • 如果收件人出现,那么他将不会以任何方式回答他。 R1在5秒钟内未收到拒绝注册的请求,将感到高兴,并将向RP发送带有封装的多播的注册消息。

当多播到达RP时,似乎已经解决了,现在让我们尝试回答RP如何将流量传递给接收者的问题。 在这里,您需要介绍一个新概念-根路径树(RPT)。 RPT是一棵树,在RP中的根向每个PIM-SM路由器上分支的接收者增长。 RP通过接收PIM Join消息来创建它,并将新分支添加到树中。 每个下游路由器也是如此。 一般规则如下所示:
  • 当PIM-SM路由器在任何接口上(隐藏了RP的接口除外)在任何接口上收到PIM Join消息时,都会向树添加新分支。
  • 当PIM-SM路由器从直接连接的主机接收到IGMP成员资格报告时,也会添加一个分支。

想象一下,我们在R5路由器上有一个228.8.8.8组的多播客户端。 一旦R5从主机接收到IGMP成员资格报告,R5就向RP方向发送PIM加入,并且它本身在树中添加了一个查看主机的接口。 接下来,R4从R5接收PIM Join,将Gi0 / 1接口添加到树中,并向RP方向发送PIM Join。 最后,RP(R3)收到一个PIM Join并将Gi0 / 0添加到树中。 因此,获得了多播接收者的注册。 我们正在建立根R3-Gi0 / 0→R4-Gi0 / 1→R5-Gi0 / 0的树。
之后,PIM Join将发送到R1,R1将开始发送多播流量。 重要的是要注意,如果主机在多播广播开始之前请求了流量,则RP将不会发送PIM Join,也不会向R1端发送任何内容。
如果在发送多播时突然突然,主机停止想要接收它,一旦RP在Gi0 / 0接口上接收到PIM Prune,则立即将PIM寄存器-停止直接发送到R1,然后通过Gi0 / 1接口发送PIM Prune消息。 PIM寄存器停止通过单播发送到PIM寄存器到达的地址。
就像我们之前说过的,一旦路由器向另一个路由器(例如R4上的R5)发送PIM Join,则将一个条目添加到R4:
我的形象
并且计时器启动以重置该计时器,R5必须不断地PIM Join消息,否则R4将被排除在外发列表中。 R5将每60条PIM加入消息发送一次。
最短路径树切换。
我们将在R1和R5之间添加一个接口,查看流量如何在此拓扑结构中流动。
我的形象
假设流量是根据旧方案R1-R2-R3-R4-R5发送和接收的,此处我们连接并配置了R1和R5之间的接口。
首先,我们必须在R5上重建单播路由表,现在可以通过R5 Gi0 / 2接口访问网络192.168.1.0/24。 现在,当R5在Gi0 / 1接口上接收到多播时,他知道RPF规则不满足,因此在Gi0 / 2上接收多播会更合乎逻辑。 它应与RPT断开连接,并构建一个称为“最短路径树(SPT)”的较短树。 为此,他通过Gi0 / 2向R1发送一个PIM Join,并且R1也开始通过Gi0 / 2发送多播。 现在,R5必须取消订阅RPT,以免获得两份副本。 为此,他发送一条Prune消息来指示源的IP地址,并插入一个特殊位-RPT位。 这意味着我不需要发送流量,这里有更好的树。 RP还向R1 PIM剪枝侧发送消息,但不发送Register-Stop消息。 另一个功能:R5现在将不断地将PIM Prune发送到RP,因为R1继续每分钟向RP发送PIM寄存器。 RP,直到有新的人希望这种流量会拒绝他。 R5通知RP它继续通过SPT接收多播。
动态RP搜索。
自动RP
该技术是Cisco专有的,并不特别流行,但仍然有效。 自动RP包括两个主要步骤:
1)RP向保留地址224.0.1.39发送RP通告消息,声明自己对所有组或某些组的RP。 此消息每分钟发送一次。
2)需要一个RP映射代理,该代理将发送RP发现消息,指示哪个RP侦听哪些组。 正是从该消息中,普通的PIM路由器将自行确定RP。 映射代理可以是RP路由器本身,也可以是任何单独的PIM路由器。 RP-Discovery使用一分钟的计时器发送到地址224.0.1.40。
让我们更详细地看一下该过程:
将R3设置为RP:
ip pim send-rp-announce环回0作用域10

R2作为映射代理:
ip pim send-rp-discovery回送0范围10

在所有其他方面,我们希望通过自动RP实现RP:
ip pim autorp侦听器

一旦我们配置了R3,它将开始发送RP-Announce:
我的形象
并且R2,在设置映射代理后,将等待RP-Announce消息。 仅当他发现至少一个RP时,他才开始发送RP-Discovery:
我的形象
因此,普通路由器(PIM RP侦听器)一收到此消息,便会知道在哪里寻找RP。
自动RP的主要问题之一是,为了接收RP通告和RP发现消息,您需要将PIM Join发送到地址224.0.1.39-40,并且要发送,您需要知道RP在哪里。 鸡肉和鸡蛋的经典问题。 为了解决这个问题,发明了PIM稀疏密集模式。 如果路由器不知道RP,则以密集模式工作;如果知道,则以稀疏模式工作。 当在普通路由器的接口上配置了PIM稀疏模式和ip pim autorp listener命令时,该路由器将仅在直接直接进行多播的Auto-RP协议(224.0.1.39-40)下工作在密集模式下。
BootStrap路由器(BSR)。
此功能类似于自动RP。 每个RP发送一个映射代理消息,该消息收集映射信息,然后通知所有其他路由器。 我们对过程的描述类似于自动RP:
1)一旦我们将R3配置为RP的候选者,则命令:
ip pim rp-候选人回送0

R3不会做任何事情,为了开始发送特殊消息,他首先需要找到一个映射代理。 因此,我们进入第二步。
2)将R2配置为映射代理:
ip pim bsr-候选人回送0

R2开始发送PIM Bootstrap消息,在该消息中,它指示自己为映射代理:
我的形象
该消息发送到地址224.0.013,PIM协议将其用于其他消息。 他向各个方向发送它们,因此没有像Auto-RP一样出现鸡肉和鸡蛋的问题。
3)RP收到路由器BSR的消息后,会立即向路由器BSR的地址发送单播消息:
我的形象
此后,当BSR接收到有关RP的信息时,它将通过多播将其发送到所有PIM路由器都侦听的地址224.0.0.13。 因此,对于BSR中的常规路由器,没有ip pim autorp listener命令的类似物。
具有组播源发现协议(MSDP)的Anycast RP。
Auto-RP和BSR允许我们按以下方式分配RP上的负载:每个多播组只有一个活动RP。 使一个组播组的负载分配为多个RP无效。 MSDP通过向RP路由器发出相同的IP地址(掩码为255.255.255.255)来实现此目的。 MSDP使用以下方法之一识别信息:静态,自动RP或BSR。
我的形象
在图片中,我们具有带有MSDP的自动RP配置。 两个RP在Loopback 1接口上都配置了IP地址172.16.1.1/32,并用于所有组。 当RP公告时,两个路由器都引用此地址谈论自己。 收到信息后,自动RP映射代理将发送有关RP的RP-发现,其地址为172.16.1.1/32。 关于网络172.16.1.1/32,我们分别告诉使用IGP和的路由器。 因此,PIM路由器从到网络172.16.1.1/32的路由上表示为下一跳的RP请求或注册流。 MSDP协议本身是为RP设计的,用于交换多播信息消息。
考虑以下拓扑:
我的形象
Switch6将流量广播到地址238.38.38.38,到目前为止,只有RP-R1知道它。 Switch7和Switch8在此请求了该组。 路由器R5和R4将分别向R1和R3发送PIM Join。 怎么了 直到R5上的13.13.13.13为止的路由都将根据IGP度量标准引用R1,与R4相同。
RP-R1知道该流并开始向R5广播它,但是R4对此一无所知,因为R1不会发送它。 因此,需要MSDP。 我们在R1和R5上进行配置:
R1上的ip msdp对等端3.3.3.3 connect-source Loopback1

R3上的ip msdp对等1.1.1.1 connect-source Loopback3

他们将在彼此之间发起会话,并且在接收到任何流后将向其RP邻居报告该会话。
RP-R1收到来自Switch6的流后,将立即向单播MSDP Source-Active发送一条消息,该消息包含诸如(S,G)之类的信息-有关组播源和目的地的信息。 现在,当RP-R3知道诸如Switch6之类的源时,当它从R4收到对此流的请求时,它将在路由表的引导下发送到Switch6 PIM Join。 因此,已收到这种PIM加入的R1将开始向RP-R3发送流量。
MSDP在TCP上运行,RP相互发送keepalive消息以验证可行性。 计时器为60秒。
将MSDP对等体划分为不同域的功能仍然难以理解,因为Keepalive和SA消息并不表示属于任何域。另外,在此拓扑中,还根据各种域的指示对配置进行了测试-操作上没有差异。
如果有人可以澄清,请乐意阅读评论。

关于这一点,我想完成本文。以下是使用的有用材料和链接:
  1. CCIE路由和交换v5.0官方证书指南,第2卷,第五版,Narbik Kocharians,Terry Vinson。
  2. 网络最小。第九部分。多播

Source: https://habr.com/ru/post/zh-CN450582/


All Articles