

PIM-DM与PIM-SM使用场景
组播分发树的分类
以RP(Rendezvous Point)为根,组播组成员为叶子的组播分发树称为RPT(RP Tree),在PIM-SM中使用。

PIM路由表项

PIM路由表项与组播路由表项

| 报文类型 | 报文功能 |
| Hello | 用于PIM邻居发现,协议参数协商,PIM邻居关系维护等 |
| Join/Prune(加入/剪枝) | 加入报文用于加入组播分发树,剪枝报文则用于修建组播分发树。加入及剪枝报文在PIM中使用相同的报文格式,只不过报文载荷中的字段内容有所不同 |
| Graft(嫁接) | 用于将设备所在的分支嫁接到组播分发树 |
| Graft-ACK(嫁接确认) | 用于对邻居发送的Graft报文进行确认 |
| Assert(断言) | 用于断言机制 |
组播转发路径只能在PIM邻居之间建立,因此邻居发现是形成组播分发树的先决条件。
邻居发现主要通过PIM Hello包完成。每隔30s发一个Hello包,超过105s没收到,就删除邻居关系

首次形成组播分发树


扩散机制会周期性(默认180s)全网扩散组播数据,周期性扩散的主要目的是探测是否有新成员加组,但是由于全网扩散组播数据会浪费大量带宽,所以现在的组播网络一般使用“状态刷新机制”加上“嫁接机制”来实现周期性全网扩散感知新成员加组的目的。
当一个网段内有多个相连的PIM路由器向该网段转发组播报文时,需要通过断言机制(Assert)来保证只有一个PIM路由器向该网段转发组播报文。
通过断言机制的选举规则将决定组播路由器的转发行为:


Assert选举失败的设备会抑制转发,并将这种抑制转发的状态保持一段时间,这段时间就被称为Assert保持时间,默认180s。
Assert保持时间超时后,竞选失败的设备会恢复转发从而触发新一轮竞选。
对于没有组成员连接的组播路由器,组播网络无需再将组播流量继续放往该设备。通过剪枝机制,组播网络可以将此类路径剪枝。
剪枝机制工作原理如下:

路由器为被裁剪的下游接口启动一个剪枝定时器(默认210s),定时器超时后接口恢复转发。组播报文重新在全网范围内扩散,新加入的组成员可以接收到组播报文。随后,下游不存在组成员的叶子路由器将向上发起剪枝操作。通过这种周期性的扩散-剪枝,PIM-DM周期性的刷新SPT。
如果下游叶子路由器一直没有组成员加入,希望该接口保持抑制转发状态,则执行状态刷新动作。
维护组播分发树
发送状态刷新报文,保证组播路由表项的下行接口状态不发生变化。


使用嫁接(Graft)机制,当新成员加组后,主动反向建立组播分发路径。现网中一般使用嫁接机制来实现新成员加组

PIM-DM的局限性
中大型组播网络中由于网络较大,如果依然使用PIM-DM会遇到组多问题:


PIM-SM(ASM)协议报文
| 报文类型 | 报文功能 |
| Hello | 用于PIM邻居发现,协议参数协商,PIM邻居关系维护等 |
| Register(注册) | 用于事先源的注册过程。这是一种单播报文,在源的注册过程中,组播数据被第一跳路由器封装在单播注册报文中发往RP |
| Register-Stop(注册停止) | RP使用该报文通知第一跳路由器停止通过注册报文发送组播流量 |
| Join/Prune(加入/剪枝) | 加入报文用于加入组播分发树,剪枝则用于修剪组播分发树 |
| Assert(断言) | 用于断言机制 |
| Bootstrap(自举) | 用于BSR选举。另外BSR也使用该报文向网络中扩散C-RP(Candidate-RP,候选RP)的汇总信息 |
| Candidate-RP-Advertisement (候选RP通告) | C-RP使用该报文向BSR发送通告,报文中包含该C-RP的IP地址及优先级等信息 |
RP介绍


首次形成组播分发树

RPT构建



源/末端网络中的重复组播报文

PIM DR选举
PIM DR的选举:

RPT次优路径问题

SPT切换机制

维护组播分发树



| 协议 | 模型分类 | 适用场景 | 工作机制 |
| PIM-DM | ASM模型 | 适合规模较小、组播组成员相对比较密集的局域网 | 通过周期性“扩散-剪枝”维护一棵连接组播源和组成员的单向无环SPT |
| PIM-SM | ASM模型 | 适合网络中的组成员相对比较稀疏,分布广泛的大型网络 | 采用接收者主动加入的方式建立组播分发树,需要维护RP、构建RPT、注册组播源 |
|
| SSM模型 | 适合网络中的用户预先知道组播源的位置,直接向指定的组播源请求组播数据的场景 | 直接在组播源与组成员之间建立SPT,无需维护RP、构建RPT、注册组播源 |
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
在我的应用程序中,我有一个文本字段,用户可以在其中输入类似这样的内容"1,2,3,4"存储到数据库中。现在,当我想使用内部数字时,我有两个选择:"1,2,3,4".split(',')或string.scan(/\d+/)do|x|a两种方式我都得到一个像这样的数组["1","2","3","4"]然后我可以通过在每个数字上调用to_i来使用这些数字。有没有更好的方法可以转换"1,2,3"to[1,2,3]andnot["1","2","3"] 最佳答案 str.split(",").map{|i|i.to_i}但是这个想法对你来说
我有一个像这样的ruby散列{"stuff_attributes"=>{"1"=>{"foo"=>"bar","baz"=>"quux"},"2"=>{"foo"=>"bar","baz"=>"quux"}}}我想把它变成一个看起来像这样的散列{"stuff_attributes"=>[{"foo"=>"bar","baz"=>"quux"},{"foo"=>"bar","baz"=>"quux"}]}我还需要保留键的数字顺序,并且键的数量是可变的。上面是super简化的,但我在底部包含了一个真实的例子。执行此操作的最佳方法是什么?附言还需要递归就递归而言,这是我们可以假设的:1)
将以下Ruby字符串转换为数组的最佳方法是什么(我使用的是ruby1.9.2/Rails3.0.11)Rails控制台:>Item.first.ingredients=>"[\"Bread,wholewheat,100%,slice\",\"EggSubstitute\",\"new,Eggs,scrambled\"]">Item.first.ingredients.class.name=>"String">Item.first.ingredients.length77期望的输出:>Item.first.ingredients_a["Bread,wholewheat,100%,sl
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su