一、PIM基本概念
协议无关协议,运行在组播路由器之间
- 协议无关指与单播路由协议无关,即PIM不需要维护专门的单播路由信息。但是需要存在单播路由器表项
RPF反向路径检查
在单播路由与转发中,单播报文沿着一条单点到单点的路径传输,路由器只需要考虑报文“需要到达的位置”,即目的地址,就知道从哪个接口转发出去。组播路由与转发则不同。由于组播报文的目的地址为组播地址,只是标识了一组接收者,无法通过目的地址来找到接收者的位置,但是组播报文的“来源位置”,即源地址是确定的。所以组播报文的转发主要是根据其源地址来保证转发路径正确性
作用:避免组播流量的重复
实现
- 组播路由器接收组播源的组播流量,查看数据源IP;
- 利用源IP查找单播路由表;
- 对比去往组播源的出接口和组播流量的入接口,一致则RPF检查通过
- 出接口称为RPF接口;单播路由表去往组播源的下一跳地址称为RPF邻居
RPF检查接口选择方式
-
静态组播路由表
-
#配置方式 IP rpf-route-static {目的IP} {掩码} {下一跳}
-
-
MP-BGP路由
-
单播路由表
优先级:静态组播路由 >M-BGP >单播路由表
SPT和RPT的RPF检查是否相同?
SPT树上的RPF检查:收到组播流量,查看组播流量的源,根据源IP查找路由表,路由表中到达源IP的接口为RPF接口
RPT树上的RPF检查:根据RP的IP地址选择RPF接口
是否对每一个组播报文都进行RPF检查?
在实际组播数据转发过程中,不会对每一份接收到的组播数据报文进行RPF检查,而是先查询是否有对应的(S,G)组播转发表项
- 不存在对应的(S,G)表项,对报文执行RPF检查,将检查的RPF接口作为入接口,创建(S,G)组播转发表项,入接口为上游接口
- 对报文检查通过,从其他下游接口转发出去
- 对报文检查失败,丢弃报文
- 存在对应的(S,G)表项
- 接收该报文的接口与(S,G)表项的入接口一致,从所有出接口发出报文
- 接受该报文的接口与(S,G)表项的入接口不一致,对报文执行RPF检查
- RPF检查选取出的RPF接口与(S,G)表项的入接口一致
- 说明(S,G)表项无误,报文来源有误,丢弃报文
- RPF检查选取出的RPF接口与(S,G)表项的入接口不一致
- 说明(S,G)表项已经过时。更新RPF接口。对比报文的入接口是否与RPF接口相同
- 相同,从其他出接口发出
- 不同,报文来源有误,丢弃报文
RPF检查查询单播路由表时,发现去往源(或去往RP)的下一跳是负载的,选择IP地址大的
组播路由表项
PIM路由表通过PIM协议建立的组播路由表项
接口
- 上游接口:组播流量入接口(只能有一个)
- 下游接口:组播流量的出接口,离组播成员最近的接口(可以有多个)
上游RPF邻居:只接受最优邻居发送的流量
组信息
-
(S,G):路由表现主要用于在PIM网络中建立SPT。适用于PIM-DM和PIM-SM
-
(*,G):路由表项主要用于在PIM网络中构建RPT。适用于PIM-SM
组播分发树MDT
从组播源到成员主机之间形成的一个单向无环的数据传输路径
1.SPT树
接收者到组播源之间的路径是最短的
最短路径树,源树
- 从组播源向组播成员构建最短路径树
只存在(S,G)表项
- 上游接口:离源最近的接口
- 下游接口:离接收者最近的接口
- 上游RPF邻居:去往源最优的下一跳邻居
优点:接收者到组播源之间路径是最短的
缺点:多个组播源会构建多颗SPT树,消耗设备性能
2.RPT树
接收者到RP之间的路径是最短的
共享树
- 从RP(汇聚点)向组播成员构建的最短路径树
只存在(*,G)表项
- 上游接口:离RP最近的接口
- 下游接口:离接收者最近的接口
- 上游RPF邻居:去往RP最优下一跳邻居
优点:多个源共享一棵树
缺点:成员主机到组播源之间的路径可能不是最短的
PIM DM | PIM SM | |
---|---|---|
密集模式 | 稀疏模式 | |
组播成员分布较为密集,每个网段都可能存在组播成员 | 组播成员分布较为稀疏,一个网段内存在较多较复杂的组播信息 | |
一般应用于组播成员规模较小的场景 | 一般应用于组播成员规模相对较大 | |
采用"推(push)"模式转发组播报文 | 采用"拉(pull)"模式转发组播报文 | |
构建组播源到组播成员的SPT树 | 构建RP到组播成员的RPT树;构建组播源到RP的SPT树 |
二、PIM DM
密集模式
- 接收者分布密集
- 每个网段可能存在组成员,并且每个网段的网络规模较小
- 只构建SPT树,只存在(S,G)表项
采用“推”的模式转发组播报文
- 扩散剪枝,将流量在PIM-DM路由器之间扩散,路由器根据自己的接收情况进行修剪
配置PIM-DM
1.PIM网络中运行三层协议保证全网可达(静态、OSPF、ISIS)
2.所有组播路由器开启组播功能
multicast routing-table
PIM ##激活pim协议
3.组播路由器接口开启PIM DM协议
路由器连接组播源的接口、组播路由器相连接口、运行IGMPv1的接口
interface g0/0/0
pim dm
4.组播路由器和成员主机所在网段开启IGMP协议
interface g0/0/1
igmp enable
igmp version 1/2/3
检查
display pim neighbor ##检查PIM邻居关系
display pim interface *** ##检查开启PIM的接口
display pim routing-table ##检查组播路由表
工作流程
1.邻居发现
通过发送hello报文发现、建立、维护邻居关系
- hello报文DIP=224.0.0.13
- 周期30s发送,超时时间105s
选举DR,充当IGMPv1的查询器
-
比较优先级(默认1、范围0–2^32),再比较IP地址;越大越优
-
interface g0/0/0 pim hello-option dr-priority 100 ##修改DR优先级为100 display pim interface g0/0/1 verbose ##查看pim hello报文的参数
2.扩散join
由组播源下发流量,组播路由器收到组播流量后执行RPF检查;创建表项;将流量发送给所有邻居
- RPF检查:针对组播流量,根据流量源IP地址查找对应的单播路由表条目;对比去往流量源IP的出接口与组播流量的入接口是否一致(如果存在负载均衡,选择下一跳IP地址大的)
- 一致;检查通过,创建表项、将流量发送给所有邻居
- 不一致,丢弃
- 创建表项:创建(S,G)表项
- 上游接口
- RPF邻居
- 下游接口
3.剪枝prune
无下游接口,向上游接口剪枝
当组播路由器发现(S,G)表项下游接口为空,触发剪枝机制,向上游接口发现剪枝报文
上游设备收到剪枝报文将接口从(S,G)下游接口删除
剪枝报文(prune)
- DIP:224.0.0.13
上游设备收到剪枝报文
设备收到剪枝报文后,判断收到报文的接口是否还存在其他PIM邻居
- 存在;开启剪枝延时3s,等待其他邻居的剪枝否决报文(join报文的一种)
- 收到其他邻居的剪枝否决,保留接口
- 没收到其他邻居的剪枝否决报文,直接删除(S,G)中的该下游接口
- 不存在,直接删除该(S,G)中的该下游接口
删除下游接口后会开启一个周期210s的抑制时间
- 超时后会恢复该接口、将其重新加入进入(S,G)的下游接口
4.状态刷新state-refresh
被剪枝的接口存在210s的剪枝抑制时间,周期性的恢复。
- 如果一直不存在接收者,会频繁的周期性的扩散剪枝,浪费流量
为了避免被裁剪的接口因为剪枝抑制时间超时而恢复转发,离组播源最近的第一跳路由器会周期性(60s)发送state refresh报文在全网扩散。刷新被剪枝接口的抑制时间
state refresh报文
- 全网扩散
- DIP:224.0.0.13,TTL=1
PIM路由器收到状态刷新报文
- 刷新表项;刷新抑制时间
- 产生新的一份状态刷新报文,源IP为出接口,继续泛洪
5.嫁接graft
作用:当接收者重新加入组播组时,能够快速获得组播流量
工作流程:
-
成员侧路由器收到成员报告报文
- 将下游接口恢复
- 向上游设备单播发送嫁接报文,请求上游设备恢复接口
- 嫁接报文内容
- 组播组地址
- 组播源地址
- 上游邻居字段;表明嫁接报文目的地
- 嫁接报文内容
-
上游设备收到嫁接报文(graft)后
-
有嫁接报文内对应(S,G)
- 将对应下游接口加入到(S,G)表项的下游接口列表;单播回复graft ack报文
- 根据情况判断是否需要继续向上游嫁接
- 但设备有实际组播流量经过,不需要嫁接
-
5.断言机制(Assert)
作用:避免MA网络出现重复组流量
触发条件:组播路由器将组播流量从一个接口发出又从该接口收到相同的组播流量
工作流程:组播路由器发送断言报文,选举出winner和loser;winner继续转发组播流量,loser将下游接口从列表中删除(剪枝;抑制时间为210s)
- 选举条件
- 比较设备去网往组播源的路由协议优先级,越小越优
- 比较设备去往组播源的路由协议开销,越小越优
- 比较设备的接口IP地址,越大越优
- loser会向winner发送剪枝报文,剪进行选举的接口
- 如果接口所在的MA网络还有邻居,邻居会进行剪枝否决
- 断言机制产生的剪枝接口,不会被状态刷新报文刷新 剪枝计时器
- 是通过周期180s的断言报文刷新剪枝计时器