作者 | 帅地

责编 | 仲培艺

对于广播,我相信在现实生活中我们时常都能接触到,例如学校一言不合就响起了校歌,搞的全校人都能够听到,想假装没听到都不行。

假如我们把学校比作一个局域网的话,某台主机发起了一个广播,意味着局域网内的其他所有主机都会收到这个广播,那发起广播的主机是如何选择路径来给其他主机发送广播分组的呢?考虑下面由几个节点组成的网络:


假如节点 R1 要做一个广播给 R2, R3, R4 发广播分组,显然,一种很简单的方法就是 R1 给 R2、R3、R4 三个节点分别发一次广播分组,这意味着 R1 一共要发送三次同样的广播分组。


途中不同箭头的颜色表示 R1 给不同的节点发广播分组。

大家想一个问题:这种发送方式合理吗?

是的,这种发送方式在实现上很简单,源节点(R1)每次带上目的节点的地址,然后发送给它就行了。

不过这种方式在效率上是极低的,例如,R1 发送的这三个广播分组都会经过同一段链路(R1-R2这段链路),而且 R2 要是再连接上 n 个节点的话,代表着这 R1 需要再发送 n 次广播分组,这 n 个报文也会经过同一段链路。

解决方法

为了解决这个问题,我们或许可以这样做:R1 把广播分组发给它的邻居节点 R2,然后 R1 就不管了,R2 再把报文发送给它的所有邻居节点 R3、R4 (除了从其接收该分组的那个邻居 R1)。


显然这种方式也是挺不错的,R1 只发送了一次广播分组,而且 R1-R2 这段链路也不会出现同一个广播分组重复经过的情况。

广播风暴

不过,这种给所有邻居节点发送广播分组的方式够优雅吗?

看下面的一个网络组成:


按照刚才的方法,R1 会给 R2 发送广播分组,接着 R2 会给 R3、R4 发送广播分组。刚才我们说过,收到广播分组的节点会给它的所有邻居发送报文(除了从其接受到该报文的那个邻居)。

所以这个时候 R3 会给 R4 发送广播分组文,而 R4 接收到 R3 的广播分组之后,R4 会给 R2 发送广播分组,R2 收到 R4 的广播分组之后 ,也会给 R3 再次发送广播分组…..

如果节点中形成了一个圈,那么就会像上面那样,节点之间不停发送广播分组,这时网络上充斥着大量重复的广播分组,将会严重影响资源的利用。

我们也把这种情况称之为广播风暴

控制广播风暴

因此,我们必须想出某种策略来控制这种广播风暴。

一种很简单的方法,就是给这一份广播分组做一个标记。例如,源节点(发起广播的节点)可以将其地址以及广播序号放入这个广播分组中,然后发送给它的所有邻居节点,每个节点会维护它已经收到的、转发的源地址和广播分组的序号列表。

当节点收到一个广播分组时,会检查这个广播分组是否之前接收过(可以通过源地址、报文序号来检查),如果接收过,就把该广播分组丢弃;否则,把该广播分组接收,且向所有邻居节点转发。

例如对于下面由 7 个节点组成的网络:


如果节点 A 要做一个广播,那么 A 就会给其邻居节点 B、C 发一份广播分组,B、C 也会给其的邻居节点发送一个广播分组。意味着 B 会给 C、D 发送广播分组,而 C 也会给 B、E、F 发送一份广播分组:


当 B 收到 C 发给它的报文时,B 检测到已经有了该报文,所以 B 会丢弃 C 发送给它的广播分组,C 也一样会丢弃 B 发送给它的广播分组。图中青色的箭头代表该广播分组会被丢弃。


从图中不难看出,就算节点之间形成了圈,也不会出现节点之间循环转发的情况。

虽然该方法简单 ,但确实有效控制了广播风暴,当然,这只是控制广播风暴的方法之一,实际上还有其他方法,在此我就不说了。

生成树广播

虽然上面那种方法有效控制了广播风暴,但也存在着很多冗余广播分组(那些被丢弃的广播分组就是冗余的广播分组)。


如果可以,我想让每个节点仅接收一次广播分组,也不用考虑丢弃广播分组,所以理想的情况应该是这样:


有没有一种方法,可以让广播分组像上面这种情况来传送呢?请大家看下面一个图:


如果把节点当作一个图的顶点,大家观察下左边的图与右边的图有什么联系。

右边的图不就是左边图的生成树吗?(学了这么多年的生成树,终于用到了),如果我们给每一段链路加上相应的费用,那么我们最理想的情况就是找到一颗最小生成树。

所以,我们最理想的情况就是让广播报文在最小生成树的路径中传送,于是 ,我们现在的问题就是找出这些节点组成的网络中的最小生成树。

那么,如何构造一颗生成树呢?下面提供一种基于中心某个中心的方法来建立一颗生成树。注意,是生成树,不是最小生成树。

该方法是这样的:我们先选出一个中心节点,然后其他节点向这个中心节点发送加入树报文,加入树报文经过的路径,都会被嫁接到生成树上。例如对于这个网络结构:


我们选择 E 为中心点,然后其他节点给 E 发送加入树报文:

1. F 节点给 E 发送加入树报文,此时 E-F 链路成为初始生成树,如下图(红色路径表示生成树)。


2. 接着 B 给 E 发送加入树报文,假设 B 经过的路径是 B->D->E。此时路径 B-D-E 也加入了生成树。


注:D 不用再发送加入树报文了,因此它此时已经在生成树里了。

3. 接着 C 给 E 发送加入树报文,C-E 加入生成树。


4. 接着,A 给 E 发送报文,假设 A 选择的路径是 A->C->E。不过当 A 的报文到达 C 之后,由于原本 C-E 就在生成树里面了,所以 A 的报文不用经过 C-E,A-C 就加入到生成树了。


5. 最后 G 通过 D 加入生成树。


到此,生成树构建完毕,此时生成树如下:


然后在广播的时候,就可以沿着这条路径来转发复制广播报文了。

作者:帅地,一个热爱编程的在校生,我的世界不只有coding,还有writing。目前维护订阅号「苦逼的码农」,专注于写算法与数据结构、Java、计算机网络。

声明:本文为作者个人投稿,版权归其所有。


 热 文 推 荐 

☞ 恒大贾跃亭和解;快播处罚细节曝光;天津三星工厂关闭 | 极客头条

☞ 频频霸榜的 Python,竟遭开发者嫌弃!

☞ 遇上浏览器跨域问题怎么办?

无业务不技术:那些誓用区块链重塑的行业,发展怎么样了?

☞ 下一次 IT 变革:边缘计算(Edge computing)

☞ 12306 脱库 410 万用户数据究竟从何泄漏?

年度重磅:《AI聚变:2018年优秀AI应用案例TOP 20》正式发布

☞ 老程序员肺腑忠告:千万别一辈子靠技术生存!

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

点击“阅读原文”,打开 CSDN App 阅读更贴心!

喜欢就点击“好看”吧!

广播路由算法: 如何优雅地传递悄悄话?相关推荐

  1. 编程实现路由算法_TCP/IP 之路由算法

    (给算法爱好者加星标,修炼编程内功) 作者:六尺帐篷 www.jianshu.com/p/e5cce2958790 网络层的重要功能就是路由和转发.而路由是根据路由器根据所维护的路由表进行路由选择.所 ...

  2. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★

    文章目录 一.网络层功能 二.数据交换方式 ★ 三.IP 数据报 ★ 四. IPv4 地址 ★★ 1 . IP 地址 发展 : 2 . 分类 IP 地址 3 . NAT 转换 4 . 子网划分 5 . ...

  3. 计算机网络 --- 网络层路由算法与路由协议

    路由表: 最佳路由: "最佳"只能是相对于某一种特定要求下得出的较为合理的选择而已. 路由算法的分类 静态路由算法(非自适应路由算法) 管理员手工配置路由信息.简便,可靠,在负荷稳 ...

  4. 容迟网络中的路由算法笔记(三)

    第三章 基于地理信息的路由算法 背景:为了提高消息成功投递的可能性,一种普遍受认可的方式是采用基于洪泛的多副本策略,通过引入更多的消息副本,增大消息与目的节点相遇的机会.为了实现消息的受控洪泛,减少消 ...

  5. ls路由算法_路由算法区分管理距离和最大跳数

    管理距离就是人为指定的一个数字,由这个数字来代表路由协议的优先度,数字越小越优先采用这个路由协议通告的路由.比如静态路由的默认的管理距离是0,rip是120,如果到达某个网段的路由通告由这两个同时通告 ...

  6. ospf cost 引起路由可以ping通但应用无法连接_路由算法(通网五)

    在通信网络中,网络层主要负责将两个终端系统经过网络中的节点用数据锥路连接起来,组成通信通路,实现两个终端系统之间数据的透明传送.所谓透明传输是指发端发送到网络接口的任何信息都会按照其原始的形式传送到接 ...

  7. 【计算机网络】网络层 : OSPF 协议 ( 协议简介 | 链路状态路由算法 | OSPF 区域 | OSPF 特点 )

    文章目录 一.路由选择协议分类 二.OSPF 协议 简介 三.链路状态路由算法 四.OSPF 区域 五.OSPF 特点 一.路由选择协议分类 路由选择协议分类 : ① 内部网管协议 IGP : 在 自 ...

  8. 通信网络基础期末复习-第五章-路由算法

    写在前面:本文主要依据为<通信网络基础>李建东,盛敏编著,如有侵权,请联系作者删除.本文仅用于个人期末复习与知识结构的搭建. 文章目录 第五章 路由算法 5.1 路由算法概述 5.1.1路 ...

  9. 4.2.1 路由算法与路由协议概述(静态路由和动态路由---距离-向量路由算法---链路状态路由算法、层次路由)

    文章目录 0.思维导图 1.路由算法分类与路由表 2.静态路由和动态路由 3.动态路由的两种算法:链路状态路由算法和距离向量路由算法 4.层次路由 0.思维导图 1.路由算法分类与路由表 路由器转发分 ...

最新文章

  1. 判断js对象是否拥有某属性
  2. Android设置布局背景为白色的三种方法
  3. GDC dispatch_semaphore
  4. PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题 (20 分)
  5. COM编程之五 动静态链接
  6. Windows下VTK6.0.0安装详解(CMake使用说明)
  7. 车载导航系统中常用物理量和单位
  8. Function Maps: A Flexible Representation of Maps Between Shapes
  9. 图解:冒泡排序及其优化
  10. 火狐浏览器插件开发小试
  11. mac mysql.sock_Mac OS 下 mysql 找不到 mysql.sock 的解决过程
  12. Acer暗影骑士RTX3060 显卡最大功率95W笔记
  13. 【MMDetection3D】环境搭建,使用PointPillers训练测试可视化KITTI数据集
  14. 几款.Net加密/加壳工具的比较
  15. LVGL misc log日志系统(lv_log.h)
  16. 从0开始学Unity做SLG系列(发布篇)
  17. MATLAB表白玫瑰花绘制——旋转玫瑰、蓝色玫瑰
  18. 安装驱动显卡重启计算机,Win7系统安装显卡驱动后电脑一直重启怎么办
  19. 什么是神经元网络控制?,神经网络控制结构包括
  20. html圣杯布局,HTML+CSS实现圣杯布局!

热门文章

  1. vue如何生成公钥私钥_百行Python代码演示1私钥生成多公链公钥原理。|区块链财富指北私钥篇(2)...
  2. win10+cuda10.0.130+cudnn7.5.1+tensorflow-gpu 1.13.1+anaconda3+keras+pycharm2018
  3. python条件判断练习题_条件控制练习题
  4. sql between的用法的意思_SQL 宝典——SQL 语法速成手册
  5. Python命令行解析工具argparse
  6. Tensorflow中与张量形状有关的操作
  7. 时间轴 纵向_高考最新硬货!高中历史时间轴(文字版)高能来袭,背会就能多拿分!...
  8. 教你使用 IDE/Maven 快速部署 Serverless 应用
  9. 为什么买入不了创业版_趋势波段买卖创业板ETF指数基金能轻松保险盈利
  10. C语言中INT数据类型的最小值和最大值