组播PIM-原理介绍+报文分析+配置示例
个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将在PIMv2协议报文的基础上进行介绍,以详细介绍组播协议PIM。
这里需要说明的是,以下内容都针对的是ASM(Any Source Multicast,任意组播源)模型下的PIM协议。SSM(Source-Specific Multicast,特定组播源)模型下的PIM协议类似于PIM-SM但不做说明。
- 关于PIMv2-DM相关内容,可参考2005年发布的RFC3973等相关内容
- 关于PIMv2-SM相关内容,可参考2006年发布的RFC4601等相关内容。
- 关于主机组播路由协议相关内容,可参考博客组播IGMP-原理介绍+报文分析+配置示例。
- 关于PIM协议报文的相关字段,可参考IANA发布的Protocol Independent Multicast (PIM) Parameters。
组播PIM协议(Protocol Independent Multicast,协议无关组播协议),主要是相比于其他组播路由协议DVMRP(Distance Vector Multicast Routing Protocol,距离矢量组播路由协议)和MOPSF(Multicast OSPF,组播OSPF)协议而言。
协议无关主要体现于:DVMRP依靠于RIP协议实现,MOPSF依靠OSPF协议实现。而PIM协议仅依靠路由转发表即可,而无需关注实现路由的协议。相同的这3种协议都是域内组播路由协议。
域外组播路由协议可学习MSDP协议(Multicast Source Discovery Protocol,组播源发现协议)。
第2章节基本述了PIM概念的相关内容,第3和4章节描述了PIM协议报文的相关内容。可直接阅读相关内容。
目录
PIM协议
- 目录
- 1.组播基础内容
- 1.1.组播IP
- 1.2.组播MAC
- 2.PIM基本概念
- 2.1.RPF检查
- 2.2.SPT源树和RPT共享树
- 2.3.DM工作模式和SM工作模式
- 2.4.PIM协议报文类型
- 2.4.1.PIM-Hello报文
- 3.PIM-DM工作原理-RFC3973
- 3.1.PIM-DM模型
- 3.2.PIM-DM的加组Join/剪枝Prune
- 3.3.PIM-DM的嫁接Graft/Graft-Ack
- 3.4.PIM-DM的状态刷新State Refresh
- 3.5.PIM-DM/SM的断言Assert
- 4.PIM-SM
- 4.1.PIM-SM模型
- 4.2.PIM-SM的注册register/register-stop
- 4.3.PIM-SM的Bootstrap/Candidate-RP-Advertisement
- 4.4.PIM-SM的RPT树向SPT树的切换
- 5.PIM行为+配置
- 5.1.PIM-DM组播处理
- 5.2.PIM-SM组播处理
- 5.3.PIM配置
- 5.3.1.常用检查命令
- 更新
1.组播基础内容
1.1.组播IP
传统网络进行地址分配时,将IPv4网络分为5类:
A类:1.0.0.0-126.0.0.0
B类:128.0.0.0-191.254.0.0
C类:192.0.0.0-223.255.255.0
D类:224.0.0.0-239.255.255.255
2进制的前4个bit固定为1110:
Note:224(十进制)=1110 0000(2进制);239(十进制)=1110 1111(2进制)
E类:240.0.0.0-239.255.255.255,保留地址
其中 D 类地址称为组播 IP。虽然目前 CIDR(Classless Inter-Domain Routing,无类域间路由) 和 VLSM(Variable Length Subnet Mask,可变长子网掩码) 的出现淡化了 IP 分类,但组播 IP 范围并未发生变化。
其中组播IP又可进行如下划分:
224.0.0.0-224.0.0.255:预留永久组播地址,通常为协议所使用。
224.0.1.0-231.255.255.255 和 233.0.0.0-238.255.255.255:ASM(Any Source Multicast)模型使用。
232.0.0.0-232.255.255.255:SSM(Source-Specific Multicast)模型使用。
239.0.0.0-239.255.255.255:本地管理组地址,也即私网组播IP。
需要说明的是,上述仅是 IPv4 组播地址的一个大致分类。其中还包含了保留组播地址、网络间控制组播地址等。感兴趣者可查阅相关资料。
常用协议组播地址:
组播地址 使用者 224.0.0.1 所有主机及路由器监听地址 224.0.0.2 所有路由器监听地址 224.0.0.4 DVMRP协议使用 224.0.0.5
224.0.0.6OSPFv2协议使用 224.0.0.9 RIPv2协议使用 224.0.0.12 DHCP协议特定场景使用 224.0.0.13 PIM协议使用 224.0.0.14 RSVP协议特定场景使用 224.0.0.18 VRRPv2协议使用 224.0.0.22 IGMPv3协议使用 224.0.0.251 mDNS协议使用 224.0.0.252 Link-local Multicast Name Resolution协议使用
1.2.组播MAC
MAC地址为48bits,6字节。
1@:第1个字节的最后1个bit=1,表明该MAC为组播MAC。否则表明为单播MAC。
2@:MAC地址的前3个字节 24bits 称为 OUI (Organizationally unique identifier,厂商标识),需要向IEEE购买分配。后 24bits,由厂家自行分配。
3@:组播MAC由于没有明确的目的主机,因此规定 组播MAC由组播IP映射 而来。映射规则如下:
组播MAC的高 24bit = 0x01005e;
组播MAC的第 25位bit 固定为0;
组播MAC的剩余后 23bit 由组播IP的后 23bit 直接对应而来。
组播IP实际上有 32-4=28bits,因此存在 5bits 数据无法进行对应
因此实际上每2^5=32个组播IP对应一个组播MAC。
而且由于错配的bit位是高bit位的IP,所以通常对应同一个组播MAC的32个IP是不连续的。需要进行2进制转换核对。
例如:224.1.0.1、224.129.0.1、225.1.0.1、225.129.0.1、226.1.0.1、226.129.0.1、…、239.1.0.1、239.129.0.1具有相同的组播MAC。
自动换行
对于IPv6的MIP和MMAC,情况稍有变化:
IPv6组播MAC地址的高16位为0x3333,低32位为IPv6组播地址的低32位。
常用的IPv6组播地址为ff00::/8。感兴趣者可查阅相关资料。
此外还有协议规定组播MAC:
01-80-c2 为 IANA 规定的协议组播MAC。
例如 01-80-c2-00-00-00 用于 BPDU 组播MAC,集成 ISIS 使用 01-80-c2-00-00-14 和 01-80-c2-00-00-15 等。
点击此处回到目录
2.PIM基本概念
2.1.RPF检查
RPF(reverse path forwarding,逆向路径转发) 指的是,组播路由器接收到组播流量时进行检查。
这一过程是指:
首先,记录收到组播流量的端口(上游端口)和组播流量的源地址。
随后,检查到达发送该组播流量的组播源的路由表(单播路由表)。如果路由转发表中记录到达该组播源的端口为接收该组播流量的端口时,允许接收该流量。
RPF的目的在于利用单播路由表实现流量无环,并且实现组播最短路径。目前进行RPF检查的原则有两种。
RPF检查原则1:优先级优先(默认)
1@:比较协议优先级。越小越优。
这里的协议不仅指的是单播路由表,还指的是组播路由表。
例如上图建立组播静态路由,以及其他组播路由协议都可以生成组播路由表。
2@:组播静态>MBGP>单播。
同样的,组播路由协议也可以指定协议的优先级。(组播静态优先级默认=1)。当以上协议优先级一致时,按本原则进行选择。
单播路由协议优先级点击此处查看。
3@:有多条到组播源S的单播路由,采取掩码最长匹配原则。
4@:否则优选路由下一跳IP地址大的路由。
通过以上原则,可唯一确定组播路由器的上游RPF邻居。
自动换行
Note:Cisco还在第3个原则后额外进行比较到S的Metirc,此时优选开销小的。
RPF检查原则2:最长掩码优先
multicast longest-match用于更改 RPF 检查原则。
此时此时,先比较路由表(包括单播和组播)的掩码。随后比较协议优先级。最后决胜规则为,优选下一跳IP地址大的路由。
2.2.SPT源树和RPT共享树
- 组播中以 (S,G) 描述相关的组播内容。S 指特定组播源,也即组播服务器的地址。G 指组播组,也即组播服务器提供组播服务的组播地址。相应的,(*,G) 表示任意组播源。
- 在组播路由协议中仅允许一个(上游)接口接收来自 S 的 G 地址的组播流量,也即 RPF 检查。而向组播组成员的端口转发则不受影响。但是不可能存在一个端口既为上游端口又为下游接口。
- 源树 SPT(Source-specific Shortest-Path Tree) 的概念是指,组播源 S 会以自己为根计算到达组播组成员的路径树。这一行为类似于 OSPF 的最短路径树计算。
- RPT树(Rendezvous Point Tree,因由该组播组的所有源共享也称为 Shared Tree共享树) 与源树相同都需进行生成树计算,不同点在于。共享树 RPT 以 RP 为根,计算到达组播组成员的路径树。同样的也需要进行 RPF 检查。
RP(Rendezvous Point)是一个静态或动态定义的汇聚点,在 PIM-SM 模式下用于集中处理组播流量。
SPT树用(S,G)表项进行描述,RPT树用(*,G)表项进行描述。
流量行为上,组播源 S 会先将流量发送给 RP。由 RP 将组播流量发送给组播组成员。
PIM的DR角色:Designated Router。局域网上选举出对PIM协议进行相关响应的路由器,类似于OSPF的DR。
1@源端DR:发送 Register注册报文和接收 Register-stop注册停止报文,构建 SPT 树。
由第一跳组播路由器形成。
2@成员端DR:发送 join加组报文构建 RPT 树。
并且在组成员离组(组播组无成员)时,向 DR 发送 Prune剪枝报文。裁剪 RPT 树。
由倒数第一跳组播路由器形成。
DR选举原则:
1@:优先级越大越优。PIM-hello包中携带相应参数,将在后文进行介绍。
2@:比较接口IP地址。越大越优。
2.3.DM工作模式和SM工作模式
PIM 协议定义了两种工作模式 DM(Dense Mode,密集模式) 和 SM(Sparse Mode,稀疏模式)。
PIM-DM 认为网络中所有设备都有加入组播组的需求,因此在建立连接时使用 PUSH 方式发送报文。经 RPF 检查后,将组播流量从所有其他PIM接口(out list)转发出去。
这一行为称为PIM-DM的扩散机制。out list,详细来说指的是非RPF的PIM邻居接口+成员接口。下游设备接收到组播流量后,也进行相应扩散行为。在 PIM-DM 模式先即使某一网络中不存在组播组成员,也会定期询问是否加组。将其纳入需要发送组播源的范围中去。该模式对网络带宽要求较高,适用于小型网络。
自动换行
在该模式下,(S,G)表项的建立由RPF检查通过的组播流量来刷新完成。
PIM-SM 认为网络中所有设备都没有加入组播组的需求,需要组播接收者主动加组并由 RP 来决定如何转发组播流。对接收者来说,在建立组播表项时实际上相当于 RP 成为了组播源。
此时组播源 S和 RP 之间单播建立 (S,G) 表项的 SPT 树,RP 和接收者之间建立(*,G) 表项的 RPT 树。
点击此处回到目录
2.4.PIM协议报文类型
PIM 组播协议,可以同时支持 IPv4 和 IPv6 网络。在此对 PIM 报文格式进行介绍。
PIM的IPv4头部:
数据链路层:SMAC使用自己的接口MAC,DMAC使用组播IP映射而来的组播MAC。
网络层/IP层:SIP使用自己的接口IP,DIP使用 ALL-PIM-ROUTERS = 224.0.0.13/ff02::d。IP TTL = 1。IP protocol = 103。
PIM的头部:
所有 PIM 消息都具有上图所示的头部。
PIM Ver:4-bits,PIM协议版本。固定为 2。
Type:4-bits,PIM协议的类型。目前RFC定义了15种PIM报文。
无 Option 字段的 PIM报文示例。
自动换行
PIM协议常用的10种报文类型:
0: Hello( PIM-DM 与 PIM-SM 都适用)
1: Register(只适用于 PIM-SM)Note:单播发送
2: Register-Stop(只适用于 PIM-SM)Note:单播发送
3: Join/Prune( PIM-DM 与 PIM-SM 都适用)
4: Bootstrap(只适用于 PIM-SM)
5: Assert( PIM-DM 与 PIM-SM 都适用)
6: Graft(只适用于 PIM-DM)Note:单播发送
7: Graft-Ack(只适用于 PIM-DM)Note:单播发送
8: Candidate-RP-Advertisement(只适用于 PIM-SM)
9: State Refresh(只适用于 PIM-DM)
Reserved:1字节,保留字段。固定为 0。
Checksum:2字节,校验码。用于校验。标准 IP 校验和。
2.4.1.PIM-Hello报文
PIM-Hello 报文的主要作用在于协商参数,发现和维护 PIM 邻居。PIM-Hello 包除 PIM Header 字段意外,其他字段主要以TLV格式定义报文。
Type 字段 2 字节,Length 字段 2 字节。
PIM-Hello常用的Option:
Option1-Hold time:维护邻居关系的时间。默认 3.5 * Hello_Period/Hello Timer = 105s。
//pim hello-option holdtion用于定义基于端口维护邻居关系的时间。
自动换行
或
//用于定义hello发送间隔,默认30s。报文中不携带,因此是一个本地概念。
自动换行
《RFC3973-PIM-DM:Protocol Specification的4.3.1. Sending Hello Messages》还规定,当首次启动 PIM 时,应将 Hello Timer 设置为 0 到 Triggered_Hello_Delay(5s) 之间的随机值。
Option2-LAN Prune Delay Option:LAN Prune Delay 表示局域网上传递 Prune 消息的延迟时间,默认500ms。
Override Interval 表示局域网上执行剪枝前的否决时间,默认2500ms。
T-bit 置 1 表示支持 join 消息抑制,该 bit 仅在 PIM-SM 模式下使用。
和
自动换行
LAN Prune Delay 和 Override Interval 共计3s,实际上描述了剪枝等待时间。仅适用于局域网。详细内容将于 PIM 的剪枝原理中介绍。
Option19-DR Pri:选举DR优先级,默认1。//pim hello-option dr-priority用于在PIM-Hello交互过程中选举DR。
PIM-DR作用:DR选举时优先级越大越优,否则选IP大的。
1@:作为IGMPv1的查询者。
2@:PIM-SM模式下参与RPT树和SPT树的形成。
Option20-Generation ID:随机数,表示当前邻居状态。如果状态发生更新则随机数也会更新。邻居收到改变或丢失随机数的 PIM-Hello 认为邻居状态改变。
Option21-State Refresh Capable:邻居状态刷新时间间隔,默认60s。仅在 PIM-DM 模式下使用。
PIM-Hello 报文示例。
当收到 Hello 消息时,接收路由器应记录邻居的相关信息。 如果从特定邻居 N 收到新的 Hello 消息,则必须将 NLT(N,I) 重置为收到的 Hello 中 Hold time 字段值。
因此 PIM 的邻居状态时间,往往取决于邻居自己的通告而无需协商。此外,对于 Hold time 字段值为 0xffff 时可用于按需链接,以避免与定期 Hello 消息保持链接同步.对于 Hold time 字段值为 0 时则将相应的邻居状态立即过期。
如果从新的邻居收到 Hello 消息,则接收路由器应在 0 到 Triggered_Hello_Delay = 5s 之间的随机延迟后发送自己的 Hello 消息。
点击此处回到目录
3.PIM-DM工作原理-RFC3973
3.1.PIM-DM模型
PIM-DM以Push模式以S为根建立(S,G)表项。
PIM-DM模型简介:
1@:PIM-DM 模型假定,所有下游接口都希望接收组播流,并通过 RPF 检查来防止组播环路。
2@:如果 PIM 域中不存在组播接收者,将启动 prune 剪枝动作将端口过渡到 prune 状态。接口的 prune 状态存在一个有限的 Prune Timer 生命周期,周期截止后将端口过渡到转发状态。
3@:接口在 prune 状态接收到特定 (S,G) 的组播请求时,将启动 graft 嫁接行为将端口过渡到转发状态。
4@:直连组播源的接口只会保持为 Forwarding 转发状态和 Pruned 被剪枝状态,并维护相应的状态机。
PIM-DM路由器维护的状态机:
1@本地接口状态:Hello Timer (HT,用于周期发送 PIM Hello 报文)、State Refresh Capable、LAN Delay Enabled (使能时,局域网中特定的剪枝传输时延和加组覆盖延时)、Propagation Delay (PD) 和 Override Interval (OI)。
2@邻居发送的Hello:Gen ID (用于识别邻居是否改变)、LAN Prune Delay、Override Interval、State Refresh Capability 和 Neighbor Liveness Timer (NLT,邻居 Hello 包中携带的 Holdtime 字段中的值用于表示邻居是否存在)。
3@每个接口本地组播成员状态:NoInfo (NI,无信息) 或 Include 之一。
4@每个接口(S,G) Prune State:NoInfo (NI,无信息。非剪枝状态且无 Prune Pending Timer 定时器或 Prune Timer 定时器)、Pruned (P,被剪枝而 olist(S,G) 出接口为空) 或 PrunePending (PP,接收到剪枝报文但处于剪枝等待) 之一。
与之对应的定时器:
Prune Pending Timer: PPT,剪枝等待定时器。可用于如下场景:局域网中收到剪枝报文时等待是否有其他下游成员请求加组。
Prune Timer:PT,剪枝定时器。可用于如下场景:当 Prune Pending Timer 定时器结束时触发,用于将端口过渡到 Pruned 剪枝状态。Prune Timer 结束时将端口过渡到 Forwarding 状态。
自动换行
olist(S,G):特定 (S,G) 的 outgoing interface list。通常排除被剪枝端口、PIM 边界端口、断言失败者 和 RPF上游接口 的 PIM接口。
iif(S,G):特定 (S,G) 的 incoming interface。也即接收组播流的端口。
5@每个接口(S,G) Assert Winner State:NoInfo (NI,无信息)、lost Assert (L,断言失败者) 或 Won Assert (W,断言优胜者) 之一。
与之对应的定时器:
Assert Timer:AT,断言定时器。断言状态改变的定时器。
Assert winner’s IP Address:断言优胜者的 IP。
Assert winner’s Assert Metric:断言优胜者的断言开销。
6@上游接口的Graft/Prune State:NoInfo (NI,无组播成员)、Pruned(P,被剪枝而 olist(S,G) 出接口为空)、Forwarding (F,olist(S,G) 出接口非空) 或 AckPending (AP,处于剪枝状态但已发送 Graft 嫁接消息而未收到 Graft-Ack 嫁接确认消息) 之一。
与之对应的定时器:
GraftRetry Timer:GT,嫁接重试定时器。可用于如下场景:如果在定时器到期之前未收到相应的 GraftAck,则发送另一个 Graft,并重置 GraftRetry 定时器。
Override Timer:OT,覆盖定时器。可用于如下场景:上游接口 olist(S,G) 出接口非空但收到 Prune(S,G) 消息时设置,触发时发送 Join(S,G) 消息。
Prune Limit Timer:PLT,剪枝限制定时器。可用于如下场景:用于对 LAN 上的 Prunes 进行速率限制。仅当 PIM-DM 自己的上游接口处于 Pruned 状态时使用。如果此定时器正在运行,则无法从该接口发送 Prune 消息。Prune Limit Timer = t_limit = 210s。可以防止自己发送剪枝报文导致局域网的其他路由器无法接收组播流。
7@Originator State:Source Active Timer (SAT,源存活定时器) 和 State Refresh Timer (SRT,状态刷新定时器)。
Originator State 仅在第一跳 PIM 路由器上存储。State Refresh Timer = RefreshInterval,默认为 60s。
3.2.PIM-DM的加组Join/剪枝Prune
当 PIM 路由器 olist(S,G) 下游出接口为空时,触发剪枝并启动 PLT(S,G) = t_limit = 210s 定时器:
1@:向上游接口/RPF接口发送剪枝报文。
2@:上游设备收到剪枝报文后,将该下游接口将其从(S,G)表项下游接口“删除”。
3@:如果上游设备的下游接口为空,则向上游周期发送剪枝报文。
timer join-prune用于设置所有接口发送Join/Prune消息的时间间隔。默认60秒。
pim timer join-prune用于设置特定接口发送Join/Prune消息的时间间隔。默认60秒。
自动换行
1@如果自己已剪枝的上游 RPF 接口收到了 Prune(S,G) 消息且 Prune(S,G) 消息的 Holdtime 字段大于本地 PLT(S,G) 定时器的剩余时间,则可以以该值重置 PLT(S,G) 定时器。默认 PLT(S,G) = t_limit = 210s。
这里重点提出的原因是自己上游的PIM网络很有可能有多个邻居!!因此应由RPF选择的邻居进行剪枝操作。
报文格式
Upstream-Neighbor:PIM上游邻居地址。实际应当是RPF上游邻居地址。
Num Groups:组播组/组播IP数目。
Holdtime:路由器保持相应接口加入/剪枝状态的时间。也即 Prune Timer 的时间。
例如PIM-DM模式认为所有PIM路由器都需要加入组播组。此时PIM路由器如果收到剪枝报文而将收到该报文的接口剔除相应(S,G)表项。
在经过Holdtime后,PIM路由器会自动将该端口重新加入到下游接口。或
//join-prune报文中holdtime字段的保持时间或本地启动的 Prune Timer 定时器时间。默认 3.5 * join/prune_interval = 210s。
Group Record:加组或剪枝信息。携带了组播组/组播IP,及其与之相关的加组或剪枝的组播源IP信息。
由上游的RPF邻居地址来确定。此时不仅要求接口,如果上游有多个PIM邻居还选择IP大的作为PRF剪枝。
PIM-DM的加组/剪枝:
PIM-DM利用扩散机制实现组播流量的泛洪。通过剪枝完成网络中不存在组播成员网络的流量消除。
加组时:
1@:用户首先发送 IGMP 报文进行加组
2@:PIM 末节路由器发送 PIM-join/prune 报文进行加组。
离组时
3@:用户发送 IGMPv2 离组报文/或者IGMP查询者未在组内收到成员关系报告报文。
4@:PIM末节路由器发送 PIM-join/prune 报文进行剪枝。如果上游在自己的(S,G)表项的出接口没有其他接口。则继续向上游发送剪枝报文。
5@:下游设备发送到 PIM-prune 报文中携带 holdtime 字段用于标识 Prune Timer,默认为 210s。上游设备接收到 prune 剪枝报文后,在该端口启动该 Prune Timer。当该定时器为 0 时,将强制 PUSH 发送组播流。下游设备重新进行判断是否剪枝或向下游发送。
6@:下游设备周期性发送 PIM-prune 报文,从而持续刷新上游设备的 Prune Timer。
从以上处理过程来看,剪枝并不是删除相应的(S,G)表项。实际上PIM路由器只是将(S,G)表项的下游接口由forward状态转变为prune状态。
在holdtime/Prune Timer之后重新进行流量发送。//这里可以看到下游接口为 P(Prune) 状态,Prune Timer的剩余时间为 3:04。
自动换行剪枝报文示例
RFC定义了join/prune的Group Record字段中的Flags位,这里说明下。
Sparse-bit:PIM-SM模式,置位1表示兼容PIMv1;
WildCard-bit:置位1表示建立的是RPT共享树;此时也表示该join报文的join地址是RP而非组播源S的。
Rendezvous Point Tree-bit:RPT-bit置位1表示需要发送给RP。否则是发送给组播源S。
局域网中的剪枝延时:
如果局域网中所有设备都支持 PIM-Hello 包中携带的 LAN Prune Delay option 并启用 LAN 延迟,则上游设备收到某个下游的 Prune 剪枝消息时,为了保证其他下游设备的 join 能够覆盖该 prune 消息将延迟 Prune Pending Timer = LAN Prune Delay + Override Interval 进行剪枝。默认周期为 3s。
如果只有一个下游邻居,则将 Prune Pending Timer 设置为 0。
LAN Prune Delay option 由 2 部分组成:LAN Prune Delay 和 Override Interval。
LAN Prune Delay 表示链路上的预期消息传播延迟,当链路上的所有路由器都使用 LAN Prune Delay option 时,LAN 上的所有路由器都必须将传播延迟设置为 LAN 上的最大 LAN Delay。
Override Interval 字段中表示其所需的随机化量。 当 LAN 上的所有路由器都使用 LAN Prune Delay option 时,LAN 上的所有路由器都必须将其 Override_Interval 设置为 LAN 上的最大 Override 值。
自动换行pim hello-option lan-delay用于配置传递Prune消息的延迟时间。默认500毫秒。
pim hello-option override-interval用于配置join覆盖剪枝的时间间隔。默认2500毫秒。
点击此处回到目录
3.3.PIM-DM的嫁接Graft/Graft-Ack
Graft报文仅适用于PIM-DM模式。
PIM-DM的嫁接基本原理:在已剪枝的网络中,olist(S,G) 出接口非空,也即有设备需要重新加入组播网络时:
- 取消剪枝端口的 PLT(S,G) 定时器,过渡到 AckPending (AP) 状态。
- 从自己的上游接口发送 Graft 消息,快速结束接口的 join(S,G) 的 Holdtime 字段/Prune Timer 定时器 = 3.5 * join/prune_interval = 210s。
- 同时启动 GRT(S,G) 定时器。如果在 Graft Retry Timer = Graft_Retry_Period = 3s 的定时器时间内未收到 Graft-Ack 消息,则重新发送 Graft 消息。
pim timer graft-retry 用来在接口上配置 Graft Retry Timer 的时间间隔。默认3s。
自动换行
Graft的特殊机制:
Q:如果新增的下游PIM-DM设备本身无(S,G)表项也就无法实现嫁接功能。也即嫁接通常要求PIM设备上原本运行过该组播功能。如果下游PIM-DM设备新接入了一个上游PIM-DM Prune状态的PIM组播网络,是否只能在 holdtime/Prune Timer 后重新等待上游接口过渡到forward状态。此时如何处理?
A:因此新增机制,一旦上游PIM-DM Prune接口创建了新的PIM邻居会自动将端口转变为forward状态。
Graft 和 join/prune 报文字段几乎完全相同,那么Graft和join/prune报文的区别:
1@:Graft嫁接报文使用单播发送。SIP=自己的接口IP,DIP=RPF上游邻居IP。
2@:Graft嫁接报文的 Holdtime 置0。
3@:Graft嫁接报文的 join ip address 是填充了组播源的 IP。这也意味着即使网络中无相应组播功能,PIM 路由器实际上也维护相应的 (S,G)。
而Graft嫁接报文和Graft-Ack报文都是单播发送区别在于:Graft报文的upstream-neighbor填充的是自己的上游RPF地址,Graft-Ack报文的upstream-neighbor填充的是Graft报文的源地址。
Graft嫁接报文示例。
3.4.PIM-DM的状态刷新State Refresh
PIM 的 State-refresh 报文仅适用于 PIM-DM 模式,属于 PIM-DM 的增强功能。
状态刷新机制:
1@:PIM的第一跳路由器可以过渡到 Originator 状态,并周期性 (默认 State Refresh Timer = RefreshInterval = 60s) 向邻居发送 PIM State Refresh 状态刷新报文。用于刷新 PIM 邻居的 (S,G) 表项和刷新剪枝接口的超时定时器。
2@:下游 PIM 邻居接收到后,继续向下游发送 State Refresh 状态刷新报文。
3@:组播源不在发送组播流量,PIM的第一跳路由器也不在发送状态刷新报文。组播网络的表项可正常老化删除。
转发 State Refresh 状态刷新消息时,应将
1@:pim.originator 字段设置为自己的接口地址。
2@:pim.metric 字段设置为到达 S 组播源的单播路由开销。
3@:pim.metric_pref 字段设置为到达 S 组播源的单播路由优先级。
4@:pim.mask_len 字段设置为到达 S 组播源的单播路由掩码。
5@:如果该下游接口为 Pruned 剪枝状态,则将 pim.prune_indicator bit 置位。
6@:
7@:如果该下游接口 AssertState 为 NoInfo,则将 pim.assert_override bit 置位。
自动换行
仅有PIM的第一跳路由器可以过渡到 Originator 状态,并维护 State Refresh Timer (SRT(S,G)) 状态刷新定时器 = RefreshInterval = 60s,以及 Source Active Timer (SAT(S,G)) 源存活定时器 = SourceLifetime = 210s。前者用于周期发送 State Refresh 状态刷新报文,后者触发时将端口过渡到 NotOriginator(NO) 状态。
接口收到State Refresh状态刷新的行为:
1@:接口处于 Forwarding 转发状态且 State Refresh 状态刷新消息的 Prune Indicator bit 不置位,则接口状态不变。如果 Prune Indicator bit 置位,则额外设置 OT(S,G) = t_override,OT(S,G) 触发后发送 Join(S,G) 消息。
2@:接口处于 Pruned 剪枝状态且 State Refresh 状态刷新消息的 Prune Indicator bit 置位,则接口状态不变并启动 PLT(S,G) = t_limit = 210s 定时器。如果 Prune Indicator bit 不置位,则额外设置发送 Prune(S,G)。
覆盖上游接口的 Prune state。重置 OT(S,G) = t_override,触发后发送 Join(S,G) 消息。
//pim state-refresh-capable用于开启发送PIM DM的状态刷新报文功能。
//state-refresh-interval用于指定状态刷新报文发送间隔,默认60s。
自动换行PIM State Refresh 状态刷新报文示例。
3.5.PIM-DM/SM的断言Assert
PIM 的 Assert 报文对 PIM-DM 和 PIM-SM 都适用,主要用于在局域网中竞选向下游发送组播报文。
场景:如果 PIM 路由器从 (S,G) 或 (*,G) 表项的下游接口收到自己发送的 (S,G) 报文,则表示该网段存在其他的转发者。此时路由器从该下游接口发出 Assert 消息,参与竞选。竞选落败者停止向自己的下游接口的转发 (S,G),并且发送剪枝报文用于防止优胜者发送组播流量。用于防止组播流的重复发送。
如果断言优胜者/RPF上游接口在 3s 内没有收到 PIM-DM 的 join 报文,就将该接口从 (S,G) 出接口删除。
这也是PIM-DM唯二发送join报文的场景!
另一个发送join报文的场景:局域网连接了多个末节PIM路由器进行 IGMP 的查询者选举。
断言工作原理:组播流量防环
1@:从自己 (S,G) 表项出接口收到了 (S,G) 组播报文触发断言选举。
2@:选举完成后,非win/断言失败设备启动 Assert Timer/断言定时器。Assert Timer/断言定时器结束后重新进行断言选举。
holdtime assert 用于指定 Assert Timer/断言定时器的间隔。默认为 3 * State Refresh Interval = 180s。
3@:断言优胜者周期60s发送断言报文,刷新断言失败者的 Assert Timer/断言定时器。
这一过程和RPF检查某种程度上有点类似。
但是RPF检查并不能减少组播流量的发送,只能拒绝组播流。
Group Address和Source Address:描述了组播的(S,G)表项。
R:描述了断言表项。置0表示断言为(S,G)表项,反之断言(*,G)表项。
Metric Preference:到S的单播路由表的优先级
Metric:到S的路由Metric。
断言报文示例。
断言的选举:
1@:到组播源的单播路由协议优先级越小者越优。
2@:到组播源的Metric越小越优。
3@:接口地址IP大的优先。
1@在使用默认配置情况下,断言优胜者与DR相同。
2@断言要求RPF选举必须选择断言优胜者作为邻居。
PIM-SM的断言:
PIM-SM 虽然是 PULL 方式,但是在特定场景下也具有断言需求。
AR2作为AR4的RPF邻居,而AR3作为AR5的RPF邻居。
点击此处回到目录
4.PIM-SM
4.1.PIM-SM模型
PIM-SM(Sparse Mode,稀疏) 模式采用Pull拉流模式以RT为根而建立(*,G)表项。
PIM-SM模型简介:
1@:对接收者来说,RP相当组播源的存在。在RP和接收者之间建立最短路径树RPT。
组播流量由RP转发给接收者。
2@:对组播源来说,RP相当于接收者的存在。在RP和组播源之间建立最短路径树SPT。
组播流量为避免泛洪,以单播注册方式建立SPT树。(Register报文通知RP存在组播源S,RP接收到反向向S发送PIM-join报文完成SPT树表项建立)。在该路径树上进行组播流量转发。
也即RP是PIM-SM网络的核心!RP可分为静态RP和动态RP。
静态RP@–在设备上进行指定
这里指的是默认RP为所有组播组G的IP提供RP服务。同时也可以指定静态RP为ACL指定的组播组IP转发该G的报文。
此时如果有多个静态RP对应G时,需要根据厂家实际情况选择相应的RP。
动态RP@–由Bootstrap/Candidate-RP-Advertisement报文选举产生
实际上动态RP也可指定ACL,仅为指定的组播组IP转发该G的报文
1@:组播源发送组播流,第一跳PIM路由器为避免泛洪单播封装一个PIM报文发向RP。
2@:RP解封装该组播报文。(有相应表项,)向第一跳组播路由器发送(S,G)PIM-join报文。该报文为224.0.0.13组播报文,但逐跳向上游RPF邻居发送直到到达组播源。
这一过程实际上建立了SPT的(S,G)表项。
其实RP也会回送一个注册停止报文,将在4.2.章节详细。
3@:第一跳PIM组播路由器接收到接收者请求后主动加组,发送(*,G)的join报文。该join报文由其他组播路由器以RP为根进行RPF邻居转发直到RP。这里实际上也就完成了PULL拉流操作。
详细内容将在报文介绍章节4.2和4.3时进行详细介绍。
PIM-SM注意点:
1@:PIM-SM建立的(*,G)通过该join报文生成。同时末端的IGMP成员关系报告也可生成。
2@:PIM-SM同样需要进行RPF检查。但RPF检查的单播地址为RP的地址,因此RP需要全网可达。
3@:PIM-SM按需进行剪枝和加组,并也同样存在剪枝否决。
PIM-SM默认认为网络中组播设备较少,需要下游设备周期60s发送(*,G)join表项进行加组。
或
//仅在SM下生效,设置向上游发送join报文的周期时间。默认60s。该值必须小于join报文中hold字段的周期时间。
值得注意的是,PIM-DM是强推PUSH模式也即上游设备会强推组播流。虽然有剪枝机制,但还是需要下游在接收到组播流进行发送。(不考虑状态刷新机制)。
PIM-SM采用PULL模式,是需要下游主动周期性发送join去维护表项!!!
4.2.PIM-SM的注册register/register-stop
PIM的register/register-stop报文仅适用于PIM-SM模式。
作用:register报文用于第一跳PIM组播路由器向RP通知组播源的存在,并建立(S,G)表项。
第一跳PIM组播路由器以
SIP=组播源侧接口IP,DIP=RP。单播发送。
并携带(S,G)报文表项进行S到RP之间SPT树的建立。
B-bit:边界位。
N-bit:空注册位。
Multicast Data Packet:携带(S,G)组播信息。不定长。
Group Address:组播组地址。
Source Address:组播源地址。
这里携带的是RP所需的(S,G)表项信息。
RP接收Register:
相应(S,G)的RPF检查,并在本地查询组播S路由表是否具有(*,G)。
1@:具有相应表项。向第一跳PIM组播路由器发送(S,G)的join的表项。并同时发送Register-stop报文。
此时其实在RP和组播源之间建立的也是SPT树。
第一跳PIM组播路由器接收到Register-stop报文,在本地启动一个注册停止定时器。该定时器为60s。定时器结束时重新周期发送Register报文。
PIM-SM的Register逻辑:
1@:组播源的第一跳组播路由器发送单播携带组播流量,在组播源和DR建立(S,G)表项。只有S和DR对组播进行封装解封装。
既完成了组播流量的传递,又仅在S和DR之间的单播通道内建立(S,G)防止了组播流的过度泛洪。
当然(S,G)表项的建立要和join报文配合完成
需要说明的是,这里的第一跳组播路由器应该是组播源的DR!
2@:Register报文本质是变组播为单播流量。因此RP要发送Register-stop,防止流量的二次发送并且阻止设备对组播流量的过度封装解封装占用设备资源。
3@:Register报文的一个重要特性是通知RP,S的存在。第一跳PIM路由器收到Register-stop注册停止报文后会停止发送Register报文。但在周期60s后重新发送Register报文进行刷新维护。
当S不存在则不在发送Register注册报文。
其他需要注意的1:
S-DR和RP之间建立的是SPT树,此时仅需要S-DR需要知道RP位置,从而单播发送注册报文。
而C-DR和RP之间是RPT树,此时树上的所有设备都需要知道RP位置。因为要向RP进行加组,发送(*,G)join报文建立表项。
这里在(*,G)join报文的S地址上其实填充的是RP的地址
该(*,G)表项由下游PIM路由器每隔60s进行维护。
Note:RP向组播源发送的是(S,G)join表项。
其他需要注意的2:
register报文是单播发送的,且第一跳PIM路由器发送该单播报文时默认以通向组播源S的本地接口作为SIP。
register-source 用于指定源DR发送register注册报文的源地址。
其他需要注意的3:
在华为设备上,第一跳组播路由器总是发送Register注册报文而RP总是回应Register-stop注册停止报文。
1@无组成员时:RP需要通知组播源S拒绝发送组播流。
2@有组成员时:RP需要通知组播源S拒绝发送单播形式的组播流。此时组播源S沿着(S,G)表项直接发送组播报文。(当然需要RP发送join报文建立相应表项)。
这是由于Register报文不仅承担了组播流量的功能,而且有通知S的效果。
其他需要注意的4:
由于单播路由的特性,去方向的路由和会方向的路由不一定完全一致此时出现一个特别的现象。
S和S-DR之间的SPT树不一定完全沿着S-DR和RP最短路径,但一定是RP到组播源的最短路径
点击此处回到目录
4.3.PIM-SM的Bootstrap/Candidate-RP-Advertisement
PIM-SM使用BSR(Bootstrap Router)机制来完成RP的动态选举。
原理:
1@:每台PIM-SM都可在本地指定一个地址作为C-BSR(候选Candidate-BSR)。每台PIM-SM通过Bootstrap消息获取整个PIM-SM域中的C-BSR,从而唯一选举出BSR并同时向整个PIM-SM域发布BSR信息。
//c-bsr用于指定本地候选BSR。当然这个选举是动态的,一旦失效重新选举并周期维护。
2@:每台PIM-SM都可在本地指定一个地址作为C-RP(Candidate-RP,候选RP)。C-RP接收到BSR发送的Bootstrap消息后将自己所提供服务的组播组在PIM-SM域中Candidate-RP-Advertisement报文单播发送给BSR。从而BSR可以收集全网PIM-SM域的C-RP信息。
//c-rp用于指定本地候选RP。*当然这个选举也是动态的,一旦失效重新选举并周期维护。
3@:BSR 周期性 60s 发送 Bootstrap 报文携带 C-RP 集合和唯一确定的 BSR 地址信息。并其他 C-BSR 在本地维护 BSR 信息,维护定时器默认 130s。
//C-BSR发送Bootstrap的间隔,默认60s。
//C-BSR的维护周期,默认130s。
//C-RP发送Candidate-RP-Advertisement的间隔,默认60s。
//C-RP的维护周期,默认150s。
自动换行
BSR ( Bootstrap Router)则相当于组播网络中的管理中心,对动态选举RP的整个过程进行管理。
Bootstrap报文:使用接口作为SIP,使用224.0.0.13作为DIP,一般发往永久预留组播地址的报文TTL都是1。
Fragment Tag:随机数,用来区分 Bootstrap 消息。
Hash Mask length:C-BSR 的 Hash 掩码长度。
BSR-priority:C-BSR 优先级。
BSR-Address:C-BSR 地址。
Group Address:组播组地址。
默认为所有组播组提供服务因此是224.0.0.0/4的组播组。
RP-Count:希望为该组服务的 C-RP 的总数。
Frag RP-Count:在本段内包含的 C-RP 地址的个数。分片场景下使用。
RP-address:C-RP 的地址。
RP-holdtime: C-RP 的有效时间。
RP-priority:C-RP 的优先级。
示例:
BSR的选举规则:
1@:比较优先级,优先级大者优先。默认为0。2@:比较接口IP地址,IP地址大者优先。
BSR的选举过程:
1@:每台C-BSR初始都认为自己是BSR因此发送Bootstrap报文并在全网的PIM-SM域进行泛洪
2@:竞选失败的C-BSR不在发送Bootstrap报文,而是由优胜者BSR在网络中周期60s泛洪。
同时竞选失败者建立默认C-BSR的holdtime=130s的定时器,在130s内没有收到优胜者的Bootstrap报文认为BSR失效,自己重新泛洪。
3@:为了防止C-BSR环路,根据Bootstrap报文中的BSR地址为根进行RPF检查。
其他还有个命令需要介绍:
//用于在PIM-SM域的接口上不发送bootstrap报文。可以分离PIM-SM域。
Candidate-RP-Advertisement报文:单播发送SIP=接口IP,DIP=BSR地址。
RP的选举规则:
1@:比较组播组的掩码长度,越大越优。
2@:比较RP优先级,越大越优。默认为0。3@:比较HASH(组地址,RP值,掩码)值,越大越优。掩码默认30。
4@:比较IP地址,越大越优。
RP的选举过程:
1@:每台C-RP向BSR发送竞选报文Candidate-RP-Advertisement报文。携带RP相关信息。
2@:BSR收集全网PIM-SM域的C-RP信息向全网PIM-SM域进行Bootstrap报文泛洪
3@:PIM路由器根据自己实际情况选择相应的C-RP作为自己的RP
也即每个区域的RP实际上都有可能不同。
这里的实际情况指的是根据提供的多个C-RP选择最短路径的RP。当然也要考虑RP所提供的组播组G是否是自己所需要的。
其他注意事项:
1@:当配置静态RP和动态RP时,动态RP优先。
2@:进行选举的C-RP和C-BSR都需要加入PIM进程中才能进行选举
3@:进行选举的C-RP和C-BSR都需要满足RPF检查
4@:这里需要说明的是一般来说C-RP和C-BSR都应全网可达,才能具有选举的资格。
这里的3和4实际上是重复的,但是需要说明下。
5@:报文中没有相应的协商字段,因此BSR和RP的选举实际上是支持抢占的。
4.4.PIM-SM的RPT树向SPT树的切换
PIM-SM模型下,实际上是由RP作为接收者的组播源。接收者和组播源的通信往往是非次优路径。该这种情况下提出了RPT树向STP树切换的优化机制。
首先有一点需要注意的是:这一切换只能在倒数第一跳组播路由器上完成。
这是因为RPT树首先是在RP和倒数第一跳组播路由器之间形成的。其次PIM网络的加组离组表项建立实际上都是RP和倒数第一跳组播路由器来完成的。其他的RPT树的路由器实际上只需泛洪PIM报文,根据接收到的PIM报文和组播报文完成(*,G)和(S,G)表项的建立。并且最重要的一点是,RPT树中间节点的SPT最短路径并不一定代表了接收者到源的最短路径!
场景:倒数第一跳PIM路由器上接收到RPT表项的组播流业务,发现到该组播源S的RPF检查优于RPT树建立的路径。
实现:
此时会有SPT树和RPT树不同上游接口传递的组播流,此时需要
1@:倒数第一跳路由器在RPT树上进行 (S,G)剪枝操作。该剪枝报文的RP-bit会置位以便进行区分。RP上如果没有相应的接收者,则触发PIM-SM的剪枝相关操作。
这里需要注意的是(S,G)表项是RPT流量刷新而来,会被剪掉。但是RPT树的(*,G)还是会保留所以周期加组。
2@:倒数第一跳路由器在SPT树上进行 (S,G)加组操作。
上述过程可参考相关章节。
//在倒数第一跳PIM路由器上设置RPT树向SPT树切换阈值。默认收到组播报文就切换。
点击此处回到目录
5.PIM行为+配置
5.1.PIM-DM组播处理
组播源:
组播源发送组播流量。组播流量由 PIM 第一跳组播路由器接收到。
PIM路由器:
1@:第一跳组播路由器建立组播路由表。
也即此时PIM邻居被自动识别为组播的下游接口。此时为直连,RPF检查必然成功。
2@:第一跳组播路由器建立 PIM 路由表,向 PIM 邻居转发流量。
也即 PUSH方式,无论有没有表项都向 PIM 下游接口推送组播流。而下游接口根据需要建立组播表项或进行 prune 剪枝操作。
3@:其他 PIM 路由器接收到后,进行相似处理。但是此时取决于PIM路由器状态。
- 如果PIM有相应表项则转发流量;
- 如果无表项则每隔60s向上游发送 Prune 报文。上游设备在3s的剪枝等待延时内没有收到 join 报文,则以接收到 Prune 中 Holdtime 字段210s为定时器将下游端口状态由 forwarding 转变为 prune 维持。
这一定时器被下游周期发送的Prune报文刷新。定时器为0时将下游端口转变为forwarding,加入到PIM组播表项的出接口转发组播流量)。
4@:最后一跳 PIM 路由器接收到组播流量,建立 (S,G) 表项。向相应的接收者转发流量。(如果有接收者的话)
5@:对于 prune 状态新加入接收者,向上游发送 Graft 嫁接报文,上游随之删除该 prune 端口的定时器过渡到 forward 状态开始转发流量。
5.2.PIM-SM组播处理
组播源:
组播源发送组播流量。组播流量由 PIM 第一跳组播路由器接收到。
PIM路由器:
第一跳组播路由器被组播流量刷新,因此将组播流 (S,G) 封装入单播 PIM-register 报文中发送给 RP。
RP组播路由器:
1@有相应的(*,G)表项:检查 (S,G) 符合RPF 原则,向组播源/第一跳组播路由器发送 (S,G) join 报文,建立组播表项将组播流量引入 RP。
此时RP上有(S,G)又有(*,G)表项。这里有一个定义是(*,G)表项是对应(S,G)的父项。此时(S,G)会继承(*,G)表项的出接口,从而完成整个PIM域的组播流量的发送。根据该规则不断在全网都形成(S,G)表项。
这里有一个有意思的点是:在RP未向S发送(S,G)join报文时,只有在第一跳PIM路由器和RP路由器上存在一个被组播流传输形成的(S,G)表项。而在RP和S之间的组播路由器是没有表项的。
这里的表项是由于第一跳组播路由器发送的单播Register报文中封装组播流量而形成的。中间设备处理单播报文是不进一步解封装的。
2@没有相应的表项:RP 向第一跳组播路由器发注册停止 Register-stop 报文。第一跳组播路由器在该端口上启动一个注册停止定时器,在定时器结束后重新向 RP 发送单播注册报文。
倒数第一跳组播路由器由接收者触发建立 (*,G) 表项,并逐跳发送 (*,G) join 报文给 RP。
此时在倒数第一跳PIM路由器☞☞☞RP的路径路由器上都建立(*,G)表项。指定组播的上下游接口。
如果RP也是倒数第一跳组播路由器,那么IGMP的成员关系报文当然也可以建立(*,G)表项。
RP收到后,将RP上的表项与该 (*,G) 表项比对。随后将接收该 (*,G) 表项的接口加入组播路由表的出接口中。这样就完成了表项的建立。
1@:在最终传输组播流量时,RP和C-DR之间的组播流量还会导致(S,G)表项的出现。也即PIM-SM的RPT树也是会有(S,G)表项的!
2@:PIM-SM模式下修剪等待机制同样适用。
1-当接收者退出组播组后,剪枝报文首先沿着RPT树到达RP。
2-如果RP针对该 (S,G) 没有相应的出接口,则继续向组播源发送Prune剪枝报文。
需要注意
1@:满足 RPF 检查,PIM-SM 的 RP 也需要满足 RPT检查。
2@:与 PIM-DM 模型相同,PIM-SM 的也具有剪枝操作。当 (*,G) 表项的下游接口全部删除,此时向上游发送 (*,G) 的 prune剪枝报文。
5.3.PIM配置
PIM协议配置比较简单,这里以下图AR4为例进行PIM-SM介绍:
指定 AR4 为静态 RP。
sysname AR4
#
multicast routing-enable
#
interface GigabitEthernet0/0/0ip address 10.1.234.4 255.255.255.0 pim sm
#
interface GigabitEthernet0/0/1ip address 10.4.5.4 255.255.255.0 pim sm
#
interface GigabitEthernet0/0/2ip address 10.4.6.4 255.255.255.0 pim sm
#
interface LoopBack1ip address 4.4.4.4 255.255.255.255 pim sm
#
pimc-bsr LoopBack1c-rp LoopBack1static-rp 4.4.4.4 preferred
#
PIM的配置比较简单,这里重点说明配置要点:
1@:第一跳路由器的S接口和倒数一条路由器的C接口都需加入PIM进程。
因为要建立组播表项的上下游接口,并且需要进行RPF检查。
PIM-SM模型的C-BSR和C-RP也需要如此。
2@:对于PIM-SM模型,属于SPT树的组播路由器仅有第一跳需要知道RP的地址进行Register注册。而RPT树的路由器都需要知道RP地址。
5.3.1.常用检查命令
1@display multicast rpf-info:用于查看针对 (S,G) 组播流的 RPF 检查情况。
自动换行
自动换行
2@display multicast routing-table:用于查看 (S,G) 组播流的表项。
自动换行
自动换行
3@display pim routing-table:用于查看PIM为 (S,G) 组播流生成的表象。
display pim routing-table fsm可以额外展示接口的状态机。例如,P 表示接口处于剪枝状态,Prune Timer定时器(默认210s,由 join/prune 周期刷新)剩余 2:57。
自动换行
自动换行4@display pim interface {verbose}:用于查看 PIM 接口参数信息。
自动换行
自动换行
5@display pim neighbor {verbose}:用于查看 PIM 邻居参数信息。
自动换行
自动换行
6@display pim control-message counters:用于查看PIM协议包收发统计。
更新
点击此处回到目录
相关文章:
组播PIM-原理介绍+报文分析+配置示例
个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。 因此本文将在PIMv2协议报文的基础上进行介绍,以详细介绍组播协议PIM。 这里需要说明的是,以下内容都针对的是ASM&a…...
规避路由冲突
路由冲突是指在网络中存在两个或多个路由器在进行路由选择时出现矛盾,导致网络数据包无法正确传输,影响网络的正常运行。为了规避路由冲突,可以采取以下措施: 一、合理规划IP地址 分配唯一IP:确保每个设备在网络中都有…...
Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现
什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的…...
【C++】非类型模板参数 || 类模板的特化
目录 1. 非类型模板参数 2. 模板特化 3. 类模板特化 3.1.全特化 3.2 部分特化 3.3 参数更进一步限制 3.4 类模板应用 1. 非类型模板参数 模板参数分类类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型…...
Python基本概念与实践
Python语言,总给我一种“嗯?还能这么玩儿?”的感觉 Python像一个二三十岁的年轻人,自由、年轻、又灵活 欢迎一起进入Python的世界~ 本人工作中经常使用Python,针对一些常用的语法概念进行持续记录。 一、类与常见数据结…...
SQL Prompt 插件
SQL Prompt 插件 注:SQL Prompt插件提供智能代码补全、SQL格式化、代码自动提示和快捷输入等功能,非常方便,可以自行去尝试体会。 1、问题 SSMS(SQL Server Management Studio)是SQL Server自带的管理工具,…...
1.6 从 GPT-1 到 GPT-3.5:一路的风云变幻
从 GPT-1 到 GPT-3.5:一路的风云变幻 人工智能的进步一直是科技领域的一个重要话题,而在自然语言处理(NLP)领域,GPT(Generative Pre-trained Transformer)系列模型的发布,标志着一个又一个技术突破。从2018年发布的 GPT-1 到2022年推出的 GPT-3.5,OpenAI 的每一次更新…...
centos 7 Mysql服务
将此服务器配置为 MySQL 服务器,创建数据库为 hubeidatabase,将登录的root密码设置为Qwer1234。在库中创建表为 mytable,在表中创建 2 个用户,分别为(xiaoming,2010-4-1,女,male&…...
参数校验 Spring Validation框架
后端参数校验 解决:校验前端传入的参数是否符合预期 1、引入依赖 使用Spring Validation框架 <!-- validation参数校验框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validatio…...
sunrays-framework 微调
文章目录 1.common-log4j2-starter 动态获取并打印日志存储的根目录的绝对路径以及应用的访问地址1.目录2.log4j2.xml 配置LOG_HOME3.LogHomePrinter.java 配置监听器4.spring.factories 注册监听器5.测试1.common-log4j2-starter-demo 配置2.启动测试 2.common-minio-starter …...
Java正则转带中划线或下划线属性名为驼峰命名
Java正则转带中划线或下划线属性名为驼峰命名。 利用Java正则分组匹配的方式,将属性名中 -(_) 后接的字母,匹配上了去掉当前 -(_),将后接的字母转为大写,再追加拼接起来,就完成了驼峰命名。 String lineToHump(Strin…...
WebSocket实现分布式的不同方案对比
引言 随着实时通信需求的日益增长,WebSocket作为一种基于TCP的全双工通信协议,在实时聊天、在线游戏、数据推送等场景中得到了广泛应用。然而,在分布式环境下,如何实现WebSocket的连接管理和消息推送成为了一个挑战。本文将对比几…...
Linux下的dev,sys和proc(TODO)
(TODO) 还有一个sysfs 在 Linux 系统中,/dev、/sys 和 /proc 是三个特殊的虚拟文件系统目录,它们各自有特定的用途,主要用于与设备和内核交互。以下是它们的详细区别和功能说明: 1. /dev(Devi…...
JavaScript系列(32)-- WebAssembly集成详解
JavaScript WebAssembly集成详解 🚀 今天,让我们深入了解JavaScript与WebAssembly的集成,这是一项能够显著提升Web应用性能的关键技术。 WebAssembly基础概念 🌟 💡 小知识:WebAssembly(简称W…...
通过外部链接启动 Flutter App(详细介绍及示例)
通过外部链接启动 Flutter App(firebase_dynamic_links 和 app_links) 详细介绍 通过外部链接启动flutter App 的使用及示例 在我们的APP中,经常有点击链接启动并进入APP的需求(如果未安装跳转到应用商店)。Android通…...
计算机视觉模型的未来:视觉语言模型
一、视觉语言模型 人工智能已经从识别数据中的简单模式跃升为理解复杂的多模态数据。该领域的发展之一是视觉语言模型 (VLM) 的兴起。这类模型将视觉和文本之间联系起来,改变了我们理解视觉数据并与之交互的方式。随着 VLM 的不断发展,它们正在为计算机视觉设定一个新的水平…...
CTK插件框架学习-源码下载编译(01)
1、编译环境 window11、vs17、Qt5.14.0、cmake3.27.4 2、下载链接 cmake:Index of /files/v3.20 qt:Index of / vs22以前的版本需要登录下载:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 vs22下载:下载 Visu…...
Python 字符串分割时 spilt 和 re 效率对比
假设 有一些文件名是 数字_文档名 的格式,如何用python将数字提取出来? 可以使用 Python 的正则表达式模块 re 提取文件名中的数字部分。以下是实现代码: 示例代码: import re# 示例文件名列表 file_names ["1_file1.txt…...
AUTOSAR通信篇 - PDU和收发数据
点击订阅专栏不迷路 文章目录 一、概述二、OSI模型与AUTOSAR层级关系三、I-PDU、N-PDU、L-PDU及其关系3.1. L-PDU3.2. N-PDU3.3. I-PDU 四、数据流4.1. 普通数据流4.2. 诊断数据流4.3. 动态PDU数据流4.4. 安全通信数据流4.5. XCP数据流 返回总目录 一、概述 在学习Autosar通信…...
wps数据分析000002
目录 一、快速定位技巧 二、快速选中技巧 全选 选中部分区域 选中部分区域(升级版) 三、快速移动技巧 四、快速录入技巧 五、总结 一、快速定位技巧 ctrl→(上下左右)快速定位光标对准单元格的上下部分双击名称单元格中…...
【C++基础】enum,union,uint8_t,static
enum 所以有时候使用 Enum 的目的,不是为了自定义一种数据类型,而是为了声明一组常量。 from: https://github.com/wangdoc/clang-tutorial/blob/main/docs/enum.md union C 语言提供了 Union 结构,用来自定义可以灵活变更的数据结构。它内部…...
node.js的进程保活
nodejs的进程保活其实用PM2应该更好用些,不过由于原理其实并不复杂,我们可以自己手写一个服务来干这个工作。 假设我们有一个服务,可以这样来定义下它的相关信息: const svcs[ {"sid":"apl","name"…...
css中的阴影详解
在 CSS 中,阴影效果通常使用 box-shadow 和 text-shadow 来实现,它们分别适用于元素的框和文本。阴影是提升页面设计感和层次感的重要工具。下面,我会详细讲解这两个属性,并结合代码示例说明。 目录 1. box-shadow示例 2. text-sh…...
AI刷题-饭馆菜品选择问题、构造回文字符串问题
目录 一、饭馆菜品选择问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、构造回文字符串问题 问题描述 测试样例 解题思路: 解题思路 具体步骤 最终代码:…...
时间序列分析ARIMA(AutoRegressive Integrated Moving Average,自回归积分滑动平均)模型:中英双语
ARIMA模型:时间序列分析中的强大工具 在时间序列分析中,ARIMA(AutoRegressive Integrated Moving Average,自回归积分滑动平均)模型是一种广泛使用的模型。它通过结合自回归、差分和滑动平均三种方法来对时间序列进行…...
青少年编程与数学 02-007 PostgreSQL数据库应用 02课题、PostgreSQL数据库安装
青少年编程与数学 02-007 PostgreSQL数据库应用 02课题、PostgreSQL数据库安装 一、安装Windows系统安装PostgreSQL 17Linux系统安装PostgreSQL 17 二、配置Windows系统Linux系统 三、启动(一)Windows系统使用服务管理器(services.msc&#x…...
群发邮件适合外贸行业吗
一、群发邮件契合外贸行业的市场拓展需求 外贸业务的本质在于跨越地域限制,与全球各地的潜在客户建立联系。群发邮件能够突破时空限制,瞬间将产品或服务信息传递到世界各地。通过精准的市场调研与客户数据整理,企业可以针对不同国家和地区的…...
面试之《new关键字》
一问:new关键字做了什么操作,手写一个new方法,实现new关键字的作用 二问: // 第一题 / function Test(){this.name 1;return {name: 2} } const a new Test(); console.log(a.name) // 打印什么/// 第二题 / function Test2()…...
《机器学习》——SVD(奇异分解)降维
文章目录 SVD基本定义SVD降维的步骤SVD降维使用场景SVD 降维的优缺点SVD降维实例导入所需库定义SVD降维函数导入图像处理图像处理图像打印降维结果并显示处理后两个图像的对比图 SVD基本定义 简单来说就是,通过SVD(奇异值分解)对矩阵数据进行…...
【MySQL实战】mysql_exporter+Prometheus+Grafana
要在Prometheus和Grafana中监控MySQL数据库,如下图: 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境: 1. 安装和配置Prometheus: - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…...
业务架构、数据架构、应用架构和技术架构
TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架,旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…...
mysql-5.7.18保姆级详细安装教程
本文主要讲解如何安装mysql-5.7.18数据库: 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图,该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件,文件内容及各配置项内容如下图,需要先将配置项【skip-grant-tab…...
Linux测试处理fps为30、1920*1080、一分钟的视频性能
前置条件 模拟fps为30、1920*1080、一分钟的视频 项目CMakeLists.txt cmake_minimum_required(VERSION 3.30) project(testOpenGl)set(CMAKE_CXX_STANDARD 11)add_executable(testOpenGl main.cpptestOpenCl.cpptestOpenCl.hTestCpp.cppTestCpp.hTestCppThread.cppTestCppTh…...
kubeneters-循序渐进Ingress
文章目录 overviewIngress 是什么?为什么使用 Ingress?我们会在这里做些什么?HTTP 服务器(Nginx)还能做什么?Kubernetes 中的简单示例:A) 使用 Service ClusterIPB) 手动配置 Nginx 服务作为代理…...
Shell控监Kafka积压
1、获取Kafka消息堆积情况 vi check-kafka-lag.sh #!/bin/bashTOPIC"total_random" GROUP_ID"etl-dw" BOOTSTRAP_SERVER"node-01:9092,node-02:9092,node-03:9092"# 检查第一个参数是否为数字 if ! [[ $1 ~ ^[0-9]$ ]]; thenecho &…...
USB3020任意波形发生器4路16位同步模拟量输出卡1MS/s频率 阿尔泰科技
信息社会的发展,在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息 与信号处理技术的整个面貌,而数据采集作为数字信号处理的必不可少的前期工作在整个数字系统中起到关键 性、乃至决定性的作用,其应用已经深…...
MongoDB 学习指南与资料分享
MongoDB学习资料 MongoDB学习资料 MongoDB学习资料 在数据爆炸的当下,MongoDB 作为非关系型数据库的佼佼者,以其独特优势在各领域发光发热。无论是海量数据的存储,还是复杂数据结构的处理,MongoDB 都能轻松应对。接下来…...
Web端实时播放RTSP视频流(监控)
一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <...
23- TIME-LLM: TIME SERIES FORECASTING BY REPRO- GRAMMING LARGE LANGUAGE MODELS
解决问题 用LLM来解决时序预测问题,并且能够将时序数据映射(reprogramming)为NLP token,并且保持backbone的大模型是不变的。解决了时序序列数据用于大模型训练数据稀疏性的问题。 方法 Input Embedding 输入: X …...
【Go】Go数据类型详解—数组与切片
1. 前言 今天需要学习的是Go语言当中的数组与切片数据类型。很多编程语言当中都有数组这样的数据类型,Go当中的切片类型本质上也是对 数组的引用。但是在了解如何定义使用数组与切片之前,我们需要思考为什么要引入数组这样的数据结构。 1.1 为什么需要…...
微服务中引入消息队列的利弊
微服务中引入消息队列的利弊 1、微服务架构中引入消息队列(Message Queue)的主要优势: 1.1 解耦(Decoupling) 服务之间不需要直接调用,通过消息队列实现松耦合 生产者和消费者可以独立扩展和维护 降低系统间的依赖性 1.2 异步处理(Asynchronous Proc…...
如何使用策略模式并让spring管理
1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…...
骑砍2霸主MOD开发(11)-可编程渲染管线Shader编程
一.固定渲染管线&可编程渲染管线 固定渲染管线:GPU常规渲染算法,将3D模型经过四大变换计算得到2D屏幕图像 可编程渲染管线:定制化GPU渲染算法,需要提交Shader至GPU中,GPU根据定制化算法得到2D屏幕图像 二.CoreShader&TerrainShader CoreShader:游戏中使用的静态shader…...
【PowerQuery专栏】PowerQuery 函数之CSV文件处理函数
CSV.Document 函数是进行CSV文件解析功能的函数,函数目前包含4个参数: 参数1为文件的数据源,数据类型为二进制类型,值为需要读取的文本数据参数2为列名称,数据类型为字符串类型,值为分割后的列名称参数3为分隔符,数据类型为任意类型,值为分割数据的分隔符参数4为文件编…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(4)
1.问题描述: 添加了很多的marker点,每个marker点都设置了customInfoWindow,但是每次只能显示一个customInfoWindow吗? 解决方案: Marker的InfoWindow每次只能显示一个。 2.问题描述: 在地图选型中&…...
通过ffmpeg将FLV文件转换为MP4
使用 ffmpeg 将 FLV 文件转换为 MP4 文件是一个常见的操作。ffmpeg 是一个强大的多媒体处理工具,支持多种格式的转换、剪辑、合并等操作。以下是详细的步骤和命令示例,帮助你完成这一任务。 安装 FFmpeg 如果你还没有安装 ffmpeg,可以根据你…...
深入分析Java中的重载与重写:理解多态的两个面向
深入分析Java中的重载与重写:理解多态的两个面向 之前其实写过一篇文章来探讨Java当中的方法重载与方法重写但当时学的还不够通透,分析有点片面,这次我从多态的角度对其进行分析,有问题欢迎大家来评论区一起探讨 在Java编程中&a…...
STM32的集成开发环境STM32CubeIDE安装
STM32CubeIDE - STM32的集成开发环境 - 意法半导体STMicroelectronics...
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
: 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中,博主将带大家去学习所谓的…...
25/1/13 嵌入式笔记 继续学习Esp32
PWM(Pulse Width Modulation,脉宽调制) 是一种通过快速切换高低电平来模拟中间电压值的技术。它广泛应用于控制 LED 亮度、电机速度、音频生成等场景。 analogWrite函数:用于在微控制器(如 Arduino)上生成模拟信号。 …...