PIM 协议的工作原理

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

以下是 PIM Prune 消息的更正式定义:
PIM Prune 消息由一个路由器发送到第二路由器,以使第二路由器删除从特定(S,G)SPT 接收到 Prune 的链路。

R2收到剪枝消息后,将剪枝定时器设置为3分钟。 三分钟后,它将再次开始发送流量,直到收到另一条 Prune 消息。 这是 PIMv1 中的内容。
在 PIMv2 中添加了状态刷新计时器(默认情况下为 60 秒)。 一旦从 R3 发送了 Prune 消息,该计时器就会在 R3 上启动。 该计时器到期后,R3 将发送状态刷新消息,该消息将重置 R3 上该组的 2 分钟修剪计时器。
发送 Prune 消息的原因:

  • 当组播报文未通过RPF检查时。
  • 当没有本地连接的客户端请求多播组(IGMP 加入)并且没有可以向其发送多播流量的 PIM 邻居(非修剪接口)时。

嫁接消息。
让我们假设 R3 不需要来自 R2 的流量,发送 Prune 并接收来自 R1 的多播。 但突然间,R1-R3 之间的信道断开,R3 不再进行组播。 您可以等待 3 分钟,直到 R2 上的修剪计时器到期。 3分钟是一个漫长的等待,为了不等待,你需要发送一条消息,立即使R0的这个S1/2接口脱离剪枝状态。 该消息将是移植消息。 R2收到Graft消息后,会回复Graft-ACK。
修剪覆盖。
PIM 协议的工作原理
让我们看一下这张图。 R1 将多播广播到具有两个路由器的网段。 R3 接收并广播流量,R2 接收,但没有人向其广播流量。 它向该段中的 R1 发送修剪消息。 R1应该从列表中删除Fa0/0并停止该段的广播,但是R3会发生什么情况呢? 而R3在同一网段,也收到了Prune发来的这条消息,明白了情况的惨烈。 R1在停止广播之前,设置了一个3秒的定时器,3秒后将停止广播。 3 秒 - 这正是 R3 所拥有的时间,以免丢失其多播。 因此,R3尽快发送该组的Pim Join消息,R1不再考虑停止广播。 关于下面的加入消息。
断言消息。
PIM 协议的工作原理
让我们想象一下这种情况:两台路由器同时向一个网络广播。 它们从源接收相同的流,并将其广播到接口 e0 后面的同一网络。 因此,他们需要确定谁将成为该网络的唯一广播商。 断言消息用于此目的。 当 R2 和 R3 检测到多播流量重复时,即多播到达 R2 和 R3,并且它们自己广播该多播流量,路由器就会知道这里出了问题。 在这种情况下,路由器发送断言消息,其中包括管理距离和到达组播源的路由度量 - 10.1.1.10。 获胜者确定如下:

  1. AD较低的那一个。
  2. 如果 AD 相等,那么谁的指标较低。
  3. 如果这里存在平等,则在广播此多播的网络中具有较高 IP 的人。

此次投票的获胜者将成为指定路由器。 Pim Hello 还用于选择 DR。 在文章的开头,显示了 PIM Hello 消息,您可以看到那里的 DR 字段。 此链接上 IP 地址最高的一方获胜。
有用的标志:
PIM 协议的工作原理
MROUTE 表。
初步了解 PIM 协议的工作原理后,我们需要了解如何使用组播路由表。 mroute 表存储有关从客户端请求哪些流以及哪些流从多播服务器流出的信息。
例如,当某个接口上收到 IGMP 成员报告或 PIM 加入时,类型 ( *, G ) 的记录将添加到路由表中:
PIM 协议的工作原理
此条目表示收到地址为 238.38.38.38 的流量请求。 DC 标志表示组播将在密集模式下运行,C 表示接收者直接连接到路由器,即路由器收到 IGMP 成员报告和 PIM 加入。
如果有类型 (S,G) 的记录,则意味着我们有一个多播流:
PIM 协议的工作原理
在S字段- 192.168.1.11中,我们注册了组播源的IP地址,RPF规则将检查该地址。 如果出现问题,您需要做的第一件事是检查单播表中到源的路由。 Incoming Interface 字段表示接收组播的接口。 在单播路由表中,到源的路由必须引用此处指定的接口。 传出接口指定多播将重定向到的位置。 如果为空,则路由器尚未收到对此流量的任何请求。 有关所有标志的更多信息可以找到 这里.
PIM 稀疏模式。
稀疏模式的策略与密集模式相反。 当稀疏模式接收多播流量时,它只会通过请求该流量的接口发送流量,例如请求该流量的 Pim Join 或 IGMP Report 消息。
SM 和 DM 的相似元素:

  • 邻域关系的构建方式与 PIM DM 中的构建方式相同。
  • RPF 规则有效。
  • DR选择类似。
  • Prune Overrides 和 Assert 消息的机制类似。

为了控制网络上需要谁、在哪里以及何种类型的多播流量,需要一个公共信息中心。 我们的中心将是集合点(RP)。 任何想要某种组播流量的人或某人开始从源接收组播流量,然后将其发送到 RP。
当 RP 接收到组播流量时,它会将其发送到先前请求此流量的路由器。
PIM 协议的工作原理
让我们想象一个拓扑,其中 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后,就会启动一个60秒的Register-Suppression定时器。 在该定时器到期前 5 秒,R1 将向 RP 发送带有 Null-Register 位(即不封装组播数据包)的空 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 加入将被发送到 R1,R1 将开始发送多播流量。 需要注意的是,如果主机在多播广播开始之前请求流量,则 RP 将不会发送 PIM Join,也不会向 R1 发送任何内容。
如果在组播发送过程中,主机突然不再想要接收它,那么一旦 RP 在 Gi0/0 接口上收到 PIM Prune,它会立即直接向 R1 发送 PIM Register-Stop,然后再发送 PIM Prune通过 Gi0/1 接口发送消息。 PIM 寄存器停止通过单播发送到 PIM 寄存器来自的地址。
正如我们之前所说,一旦路由器将 PIM Join 发送到另一个路由器(例如 R5 到 R4),那么一条记录就会添加到 R4:
PIM 协议的工作原理
并且启动一个定时器,R5必须不断地重置这个定时器PIM Join消息,否则R4将被排除在外出列表之外。 R5 将每 60 条 PIM 加入消息发送一次。
最短路径树切换。
我们将在 R1 和 R5 之间添加一个接口,并查看流量如何在此拓扑中流动。
PIM 协议的工作原理
假设流量按照旧方案R1-R2-R3-R4-R5发送和接收,这里我们连接并配置R1和R5之间的接口。
首先,我们必须在 R5 上重建单播路由表,现在可以通过 R192.168.1.0 Gi24/5 接口到达网络 0/2。 现在,R5 在接口 Gi0/1 上接收多播,了解不满足 RPF 规则,并且在 Gi0/2 上接收多播会更合乎逻辑。 它应该与 RPT 断开连接并构建一个较短的树,称为最短路径树 (SPT)。 为此,他通过 Gi0/2 向 R1 发送 PIM Join,并且 R1 也开始通过 Gi0/2 发送多播。 现在R5需要取消订阅RPT,以免收到两份副本。 为此,他向 Prune 发送一条消息,指示源 IP 地址并插入一个特殊位 - RPT 位。 这意味着你不需要给我发送流量,我这里有更好的树。 RP 也会向 R1 发送 PIM Prune 消息,但不发送 Register-Stop 消息。 另一个功能:R5 现在将连续向 RP 发送 PIM Prune,因为 R1 继续每分钟向 RP 发送 PIM Register。 直到没有新人想要这个流量,RP才会拒绝。 R5 通知 RP 它继续通过 SPT 接收组播。
动态RP搜索。
自动RP。

这项技术是思科专有的,并不是特别流行,但仍然存在。 Auto-RP 操作包括两个主要阶段:
1) RP 将 RP-Announce 消息发送到保留地址 - 224.0.1.39,声明自己为所有人或特定组的 RP。 此消息每分钟发送一次。
2) 需要一个 RP 映射代理,它将发送 RP-Discovery 消息,指示应针对哪些组监听哪些 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

在所有其他方面,我们将期望通过 Auto-RP 获得 RP:

ip pim autorp 监听器

一旦我们配置了 R3,它将开始发送 RP-Announce:
PIM 协议的工作原理
R2建立映射代理后,将开始等待RP-Announce消息。 只有当它找到至少一个 RP 时才会开始发送 RP-Discovery:
PIM 协议的工作原理
这样,一旦常规路由器(PIM RP 侦听器)收到此消息,它们就会知道到哪里寻找 RP。
Auto-RP 的主要问题之一是,为了接收 RP-Announce 和 RP-Discovery 消息,您需要将 PIM Join 发送到地址 224.0.1.39-40,并且为了发送,您需要知道RP 位于。 经典的先有鸡还是先有蛋的问题。 为了解决这个问题,PIM稀疏密集模式被发明。 如果路由器不知道 RP,则它以密集模式运行;如果知道,则以稀疏模式运行。 当在常规路由器的接口上配置 PIM 稀疏模式和 ip pim autorp Listener 命令时,路由器将在密集模式下运行,仅用于直接从 Auto-RP 协议 (224.0.1.39-40) 进行组播。
引导路由器 (BSR)。
此功能的工作原理与 Auto-RP 类似。 每个 RP 都会向映射代理发送一条消息,映射代理收集映射信息,然后通知所有其他路由器。 我们来描述一下与 Auto-RP 类似的过程:
1) 一旦我们将 R3 配置为 RP 的候选者,使用以下命令:

ip pim rp-候选环回 0

那么R3就不会做任何事情;为了开始发送特殊消息,他首先需要找到一个映射代理。 因此,我们进入第二步。
2) 配置R2作为映射代理:

ip pim bsr-候选环回 0

R2 开始发送 PIM Bootstrap 消息,表明自己是映射代理:
PIM 协议的工作原理
该消息被发送到地址 224.0.013,PIM 协议也将其用于其他消息。 它将它们发送到各个方向,因此不存在像 Auto-RP 那样的先有鸡还是先有蛋的问题。
3)RP一旦收到BSR路由器发来的消息,就会立即向BSR路由器地址发送单播消息:
PIM 协议的工作原理
之后,BSR收到有关RP的信息后,将通过组播方式将其发送到地址224.0.0.13,所有PIM路由器都会侦听该地址。 因此,命令的类似物 ip pim autorp 监听器 对于不在 BSR 中的常规路由器。
具有组播源发现协议 (MSDP) 的 Anycast RP。
Auto-RP 和 BSR 允许我们按如下方式在 RP 上分配负载: 每个组播组只有一个活动 RP。 将一个多播组的负载分布到多个 RP 是不可能的。 MSDP 通过向 RP 路由器颁发相同的 IP 地址(掩码为 255.255.255.255)来实现此目的。 MSDP 使用以下方法之一学习信息:静态、Auto-RP 或 BSR。
PIM 协议的工作原理
在图中,我们有一个带有 MSDP 的 Auto-RP 配置。 两个 RP 在 Loopback 172.16.1.1 接口上配置了 IP 地址 32/1,并用于所有组。 使用 RP-Announce,两个路由器都通过引用该地址来通告自己。 Auto-RP映射代理收到该信息后,发送有关地址为172.16.1.1/32的RP的RP-Discovery。 我们使用 IGP 告诉路由器有关网络 172.16.1.1/32 的信息,并进行相应的处理。 因此,PIM 路由器从指定为网络 172.16.1.1/32 的路由上的下一跳的 RP 请求或注册流。 MSDP 协议本身是为RP 本身交换有关组播信息的消息而设计的。
考虑这个拓扑:
PIM 协议的工作原理
Switch6 将流量广播到地址 238.38.38.38,到目前为止只有 RP-R1 知道它。 Switch7 和 Switch8 请求了该组。 路由器 R5 和 R4 将分别向 R1 和 R3 发送 PIM Join。 为什么? R13.13.13.13 到 5 的路由将使用 IGP 度量引用 R1,就像 R4 一样。
RP-R1 知道该流并将开始向 R5 广播它,但 R4 对此一无所知,因为 R1 不会简单地发送它。 因此MSDP是必要的。 我们在R1和R5上配置:

R3.3.3.3 上的 ip msdp Peer 1 connect-source Loopback1

R1.1.1.1 上的 ip msdp Peer 3 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 消息并不指示任何域中的成员身份。 此外,在此拓扑中,我们测试了指示不同域的配置 - 性能没有差异。
如果有人可以澄清,我很乐意在评论中阅读。

来源: habr.com

添加评论