PIM(上)

PIM(与协议无关组播)
前言

  • 组播路由器之间运行组播路由协议,组播路由协议用于建立和维护组播路由,建立一个从组播源到达多个接收端的无环数据传输路径,即构建组播分发树,并正确、高校地转发组播数据包。
    PIM(protocol Independent Multicast)是典型的域内组播路由协议,它分为DM(Dense Mode)以及SM(sparse Mode)两种模型。
  • 防止环路的机制:RPF(reverse path forwarding)逆向路径转发:主要用于组播环境中针对于组播源对于组播组地址的所有数据做路由检查。首先组播路由协议是基于单播路由协议来运行的,即单播路由协议是组播路由协议的底层,而组播路由表在形成时,其目的地址是一个组播地址,源地址是单播地址,为了保证源到目的的组播数据发送路径可达且顺畅,所以组播路由器会默认开启RPF功能,去基于单播路由协议的下一跳反向检查上游接口是否是可达且最优的路径,如果是可达且最优的,则直接发送;如果RPF检查失败,则直接丢弃。
  • PIM的全称是protocol independent multicast,中文名称为 与协议无关组播。PIM是典型的域内组播路由协议。其实还有域间组播路由协议。
  • PIM-DM就叫作PIM的密集模式((Dense Mode))
  • PIM-SM就叫作PIM的稀疏模式((sparse Mode))

路由器如何转发组播报文
在这里插入图片描述

  • 组播路由协议中,有几个角色需要理解
    ①Source:代表组播源,一般是一台服务器,例如视频点播服务器
    ②Client:代表接收者
    ③连接Source的路由器,代表第一跳路由器
    在这里插入图片描述
    ④连接Client(接收者)的路由器,代表最后一跳路由器
    在这里插入图片描述
    ⑤在第一跳和最后一跳路由器中间的路由器被称为中间路由器

  • 对于最后一跳路由器与接收者的协议我们讲完了,内容就是IGMP。对于接收者来说,就是报告给组播路由器,接收者要加入的组;对于路由器来说就是IGMP来维护下面组成员关系的。但是要注意,IGMP是IPv4里面维护组播路由器与接收者之间的关系,IPv6里叫MLD(原理以及作用与IGMP相同)

  • 需要注意在Source与第一跳路由器连接的链路上,第一跳路由器的接口需要去配置组播路由协议,如果不配置,那么路由器是无权处理的,不会处理也不会看。但是如果接口使用了组播路由协议以后,所有组播数据都需要去处理,即使我没有加入这个组。但是最后一跳路由器没必要使用PIM,使用IGMP/mld即可,但是对于第一跳路由器来说,没有使用IGMP或者MID的必要,使用路由协议PIM就可以了。

  • 对于第一跳以及最后一跳路由器之间的组播路由器来说,使用的是域内以及域间的组播路由协议。
    域内的有DVMRP,PIM,MOSPF,CBT。之前提到的Mbone使用的是很老的组播路由协议(DVMRP)。MOSPF,CBT现在都没怎么用,现在用的最流行的就是PIM;
    域间的组播路由协议就是MBGP/MSDP(组播源发现协议)【这两种协议实际上不是组播路由器协议,而是用这两个协议实现域间组播】

  • 域内组播路由协议的作用:通过发现组播源并构建组播分发树,将信息传递到接收者。在HCIP阶段,只需要了解域内组播路协议中的PIM-DM,PIM-SM即可。
    在这里插入图片描述
    基本概念介绍

  • PIM路由表项即通过PIM协议建立的组播路由表项。PIM网络中存在两种路由表项:(S,G)路由表项或( * ,G)路由表项。S表示组播源,G表示组播组, * 表示任意。

  • SPT(最短路径树)

  • RPT:以 RP (Rendezvous Point) 为根, 组播组成员为叶子的组播分发树称为 RPT (RP Tree)

  • (S,G)路由表项主要用于在PIM网络中建立SPT。对于PIM-DM网络和PIM-SM网络适用。

  • (*,G)路由表项主要用于在PIM网络中建立RPT。对于PIM-SM网络适用。
    PIM路由器上可能同时存在两种路由表项。当收到源地址为S,组地址为G的组播报文,且RPF检查通过的情况下,按照如下的规则转发:

  • 如果存在(S,G)路由表项,则由(S,G)路由表项指导报文转发。

  • 如果不存在(S,G)路由表项,只存在( * ,G)路由表项,则先依照( * ,G)路由表项创建(S,G)路由表项,再由(S,G)路由表项指导报文转发。

总结:(,G)表示只知道组不知道源的表项,(S,G)表示即有组也有源的表项,设备从用户端收到组播组请求报文时,会形成(,G)表项,当收到源端的报文时会形成(S,G)表项,具体的形成过程每个组播协议有一定的区别

PIM路由表项中主要用于指导转发的信息如下:
组播源地址
组播组地址
上游接口:本地路由器上接收到组播数据的接口。
下游接口:将组播数据转发出去的接口。

PIM-DM基本概述:
[先重温PIM的概念]
在这里插入图片描述
·虽然PIM叫作协议无关组播,但是和IGP实际上也有关联,因为我们会使用到SPT,最短路径树。它的无关意思是PIM完成RPF检查的依据和IGP是无关的。
[PIM-DM概念]

  • PIM-DM(Dense Mode)的设计思想
    在这里插入图片描述
  • 首先我们要进行push,将我们数据进行复制发送,但是在复制发送中,我们会发现有些分支中没有接收者,因此我们会进行剪枝,但是如果后期在这个剪掉的分支中又出现了接收者,在这种情况下,需要使用3分钟的周期来恢复剪掉的分支中接收者,但是由于3分钟的周期过于漫长,因此我们会使用嫁接移植,直接就能将枝条通起来,不需要等待3分钟了。
    在这里插入图片描述
    在这里插入图片描述

PIM-DM邻居发现
在这里插入图片描述

  • Hello包有两个作用:
    ①使用hello机制发现邻居
    首先我们如果在RTA以及RTB的接口上开启了PIM,功能上实际和OSPF差不多,它们会互相发送PIM的hello包,这个hello包是用来发现、建立和维护PIM的邻居关系的,发送hello包的间隔是30S,默认的超时时间是105秒。
    指令	(系统视图下)①pim hello interval 时间 //代表配置发送hello包的时延②pim hello-option holdtime interval //配置hello消息超时时间的数值
    ②使用hello包去选举DR
    ·在MA网络中,我们需要去选择一个DR作为PIM-DM中的一个IGMPv1的查询器,(在MA网络中选择,但是在PPP或者HDLC是不需要选择DR的)。这里一定要注意,选举的是IGMPv1版本的查询器,而不是v2
    ·RTC以及RTD去选举DR,是通过优先级进行查询的,这里的优先级(指的是hello消息携带的优先级)默认为1,优先级如果一致的情况下,会通过IP地址去进行选举,优先级数值、IP地址越大,则优先级越大。
    ·在MA网络中,PIM选举DR后,并不存在BDR。因此在DR失效后会重新选举DR。

  • HELLO报文类型:
    在这里插入图片描述
    ·发送hello的时间默认为30s一次,holdtime时间就是我们要监测邻居是否正常,默认为105s。但是有些资料holdtime中写的是90s,因为为3*30s得到的,但是华为设备中holdtime就是105s,90s和105s实际上没有太大区别。
    ·通过比较Hello消息上携带的优先级和IP地址,都是越大越优,各路由器为多路由器网段选举指定路由器DR

PIM-DM构建SPT

  • 早期构建SPT
    在这里插入图片描述
    ①扩散具体过程如下:
    ·路由器接收到组播报文时会进行RPF检查。
    ·如果RPF检查通过,则创建(S,G)表项,然后将数据向所有下游PIM-DM节点转发,这个过程称为扩散(Flooding)。如果RPF检查没有通过,则将报文丢弃。
    RPF(逆向路径转发)目的:为了防止组播报文在转发过程中出现重复报文及环路的情况,路由器必须执行RPF检查。(RPF检查是为了防止环路)
    RPF检查细节:
    所谓RPF检查,就是指路由器通过查找去往组播源的路由来判断所收到的组播报文是否来自于“正确的”上游接口。某一路由器去往某一组播源的路由所对应的出接口称为该路由器上关于该组播源的RPF接口。一台路由器从某一接口收到一个组播报文后,如果发现该接口不是相应组播源的RPF接口(上游接口),就意味着RPF检查失败,所收到的组播报文将被丢弃。
    在这里插入图片描述

  • 扩散的时候每个接口的状态为forward(转发状态)

②剪枝:

  • 在这张图中,我们知道,中间这条RTE的链路没有接收者,那么实际上发送组播数据会浪费我们的带宽以及资源,因此我们在思考能否有什么方式解决这个问题,那么这个解决问题的方式就是剪枝

  • 如果下游节点没有组播成员,则向上游节点发Prune剪枝信息(224.0.0.13),通知上游节点不用再转发数据到该分支。上游节点收到Prune剪枝消息后,就把相应接口的S,G对应的输出接口列表中置于Prune状态,剪枝过程继续持续到PIM-DM中只剩下必要分支,就能建立一个以组播源S为根的SPT。

  • 以RTC为例,三个端口取个数字。
    在这里插入图片描述
    由于我们在扩散过程中,实际上路由器会生成(S,G)表项,入方向是1口,出方向是2口和3口,刚开始的时候出接口的状态一定是forward,也就是转发状态,在RTB以及RTE来说,实际上入接口处接口都是属于forward状态。但是现在在剪枝的情况下,会出现新的状态,叫做Prune。
    问题:什么情况下会出现prune状态?
    答案:在剪枝过程中,如果不需要上游设备发送组播报文,我们就会把端口的状态从forward变为prune。在我们这张图中,RTE发现自己下游节点没有接收者的时候,就会将自己的端口变成prune状态,在这种情况下就会将枝条剪枝掉,对于RTE来说,就会向上游修剪,那么RTE以及RTC之间的链路就会被修剪,因此这条链路会没有组播报文的发送。在这张图中就形成了SPT的源树(有源树)

  • 但是RTC会不会继续向上修剪呢?实际上是不会的,因为RTC下游的RTB中,有接收者,在这种情况下,我们不能对其进行修剪。

  • 修剪完成后就只剩下有接收者的枝条了。但是,被修剪后的路由器,它们的(S,G)表项并没有被清除。
    (S,G)表项存在的必要性:以RTC为例,在(S,G)存在出接口表项为prune,因此我们就不会对这个接口进行组播数据的传输,如果没有的话,就会导致又扩散了。

  • 但是被修剪以后,是否会在修剪掉的枝条中,出现新的接收者呢,那么在原先的方式我们是否会导致我们的流量下不去?答案是肯定的 如果现在在剪枝之后,现在被修剪后的枝条,出现了接收者,那么它如何接收组播信息?那么在早期的处理方式中
    答案:为了解决这个问题,默认情况下,PIM-DM的扩散—剪枝机制周期性进行,每3分钟重复一次,也就是说RTE的入接口变成prune状态后,会生成一个定时器,为180s的时间进行倒计时,然后时间一到,就会从prune状态变为forward状态,这样就能接受到RTC传下来的组播报文,如果有接收者,那么不会进行剪枝;如果没有接收者,和刚才还是一样的步骤。

问题2:如果RTE永远不出现接收者,那么每次进行周期性的扩散和剪枝,实际上是非常浪费带宽和资源的,因此我们能否想个办法去解决我们周期性变化的浪费?
-------------------------------状态更新----------------------------
答案:因此后期SPT建立过程中华为用了一个优化,就是虽然接口变成了prune状态,并且有3分钟定时器。但是在组播源在向RTA发送组播数据的情况下,第一跳路由器(RTA)会周期性的向被修剪过的枝条发送状态更新信息(state Refresh)这种状态下,prune的接口是3分钟倒计时,那么每次发送state Refresh后,prune就永远不超时。这个发送状态更新信息周期实际上是1分钟。
·华为设备上默认是开启状态更新信息的,但是有的思科设备实际上是禁用状态更新信息的,思科上配完dm以后,就会出现3分钟一次。
但是如果来了新的接收者怎么解决?那么解决的办法就是嫁接,看下一篇博客,PIM(下)

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值