路由选择算法概述及经典算法分析

一、路由选择算法概述

  1. 路由选择算法的目标:找到“从源节点到目的节点的最低开销路径”
  2. 路由选择算法的第一种分类
    1. centralized routing algorithm集中式路由选择算法
      1. 集中式路由选择算法需要计算者具有“网络拓扑的全局连通性”和“全局链路开销”方面的完整信息。
      2. 具有全局状态信息的算法又被称作链路状态算法——Link State(LS)算法,即该算法必须知道网络中每条链路的开销。
      3. 代表算法——Dijkstra-Link-State算法
    2. decentralized routing algorithm分散式路由选择算法
      1. 路由器以迭代、分布式的方式计算出最低开销路径。
      2. 没有节点拥有关于所有网络链路开销的完整信息,相反,每个节点仅有与其直接相连链路的开销信息便可开始工作。
      3. 通过迭代计算及相邻节点间的信息交换,一个节点逐渐计算出到达某个目的节点的最低开销路径。
      4. 代表算法——Distance-Vector距离向量算法,之所以叫DV算法,是因为每个节点维护到网络中所有其他节点的开销估计向量。
  3. 路由选择算法的第二种分类
    1. 静态路由选择算法
      1. 人工调整路由
    2. 动态路由选择算法
      1. 随着网络流量负载或拓扑发生变化而改变路由选择路径。
  4. 路由选择算法的第三种分类:负载敏感/迟钝
    1. 负载敏感算法
      1. 负载敏感算法认为:在网络中,链路开销会动态地反映出底层链路当前的拥塞水平。
      2. 若当前拥塞的一条链路与高开销相联系,则路由选择算法趋向于绕开该拥塞链路来选择路由,如早期的ARPAnet。
    2. 负载迟钝算法
      1. 负载迟钝算法认为:某条链路的开销无法明确地反映链路当前或最近的拥塞水平。
      2. 如RIP、OSPF、BGP算法。

二、Dijkstra算法原理【注意:我们直接通过实例来学习该算法】

2.1 Dijkstra算法原理

  1. Dijkstra算法属于链路状态LS算法
    1. 在链路状态算法中,需要“用作LS算法输入”的“网络拓扑”和“所有的链路开销”都是透明已知的。
    2. 实践中,为了让上述信息成为透明已知,可通过让网络中的每个节点向网络中所有其他节点广播链路状态分组来实现。其中每个链路状态分组包含该节点所连接的链路的标识和开销。节点广播的结果是:网络中所有节点都具有该网络的“统一、完整的拓扑及开销视图”,因此每个节点都能够运行LS算法并计算出相同的最低开销路径集合。
  2. Dijkstra算法同时属于迭代算法
    1. 经过算法的第k次迭代后,可知晓“到k个目的节点的最低开销路径”
  3. 实例网络拓扑【LS算法中拓扑结构和链路开销都是透明已知的】
    实例网络拓扑

2.1.1 符号说明

  • D(a):到算法的本次迭代,从源节点到目的节点a的“最低开销路径”的总开销
  • p(a):当前“源节点到a节点的最短开销路径”的a节点的前一节点
  • N':节点子集;如果从源节点到a节点的最低开销路径已确定,则将a节点放入节点子集N'
  • c(a,b):若“a adj b”(两节点相邻),则“c(a,b) = 两节点之间的开销”,否则“c(a,b) = ∞”

2.1.2 网络拓扑中,源节点 u 的Dijkstra链路状态算法(伪代码)示例

# Initialization:即初始化,同时也是一次迭代,统计出源节点到所有邻接节点的开销
N' = {u}
for all nodes a: # “a”泛指所有目的节点if a is neighbor of uD(a) = c(u,a)elseD(a) = ∞
# 迭代内容
while N' != N: # 如果源节点到所有目的节点的最低开销路径没有确定,则持续迭代计算if(s not in N' && D(s) is minimum): # “s”特指在当前一轮迭代计算后,从源到所有目的节点路径开销最小的那个目的节点add s to N'update D(a) for each neighbor ‘a’ of ‘s’ and not in N':D(a) = min(D(a), D(s)+c(s,a)) # 此处为算法核心点,需要注意D(a)、D(s)、c(s,a)的定义!

2.1.3 实例计算表格如下

实例计算表格

  • 初始化后:源节点 u 到每个目的节点a(a=v、w、x、y、z)的初始最低开销显示在步骤0一行。可以看到,由于节点v、w、x与源节点u相邻,故其链路开销为拓扑图中链路上的具体值;节点y、z不与源节点u相邻,故其链路开销暂且为 ∞ 。同时,由p(a)定义可知,当前的p(v)、p(w)、p(x)均为u。在所有D(a)中,D(x)值最小,因此将节点x放入节点子集N'中。
  • 第一次迭代:依据计算公式D(a) = min(D(a), D(s)+c(s,a))及网络拓扑,其中公式中的s为节点x,我们可以得到第一次迭代后的“源节点到各目的节点的”最低开销D(a)(a=v、w、y、z)。同时,由p(a)定义可知,当前的p(v)=u、p(w)=x、p(y)=x,以p(w)=x为例,这表明当前从源节点到节点w的最短路径为“u->x->w”。在所有D(a)中,D(v)和D(y)值最小,因此我们任选其一,将节点y放入节点子集N'中。
  • 第二次迭代:同第一次迭代。
  • ......
  • 第五次迭代:由于(N' = N),因此退出迭代。最终形成“从源节点到各目的节点的最低开销”D(a)a(a=v、w、x、y、z)以及从源节点到各目的节点的最低开销路径。
  • 以节点w为例:最终D(W)=3意味着“从源节点u到节点w的最低开销”为3,同时,p(w)=y,意味着在“从源节点u到节点w的最低开销路径”中,节点w的上一节点为节点y;我们再观察最终的p(y)=x,可知道在“从源节点u到节点y的最低开销路径”中,节点y的上一节点为节点x;我们再观察最终的p(x)=u,可知道在“从源节点u到节点x的最低开销路径”中,节点x的上一节点为节点u(源节点);综上,从源节点u到目的节点w的最低开销路径为“u->x->y->w”。以此种方式,我们便可以构建从源节点到所有目的节点的最低开销路径。
  1. 我们在每个节点中均使用该算法,因此每个节点都会形成最低开销路径图及转发表,同时,我们将计算结果分发到网络中的其他节点中用于形成其他节点的路由表(本文重点在于路由算法的讲解,结果分发方式及路由表的建立待更新详解)。以节点u为例,经过计算后,节点u内部生成的最低开销路径图及转发表如下
    节点u生成的最低开销路径图及转发表

2.1.4 算法复杂度

$O(\frac {n(n+1)}{2})$ = $O(\ n^{2})$,即每轮迭代计算的节点个数由n依次递减。

2.1.5 算法本身存在的问题及解决方法

  1. 拥塞敏感的路由选择的震荡(待详解
    拥塞敏感的路由选择的震荡
  2. 解决方案:通过“让每台路由器发送链路通告的时间随机化”,避免路由器自同步运行LS算法,即可确保所有路由器不同时运行LS算法,

三、Distance-Vector距离向量路由选择算法原理

3.1 Distance-Vector算法原理

  1. 介绍DV算法前,讨论存在于最低开销路径的开销之间的一种重要关系——Bellman-Ford方程
    $d_x(y) = min_v[c(x,v)+d_v(y)]$
    1. $d_x(y)$:从节点x到节点y的最低开销路径的实际开销
    2. v:指$d_x(y)$中下标节点x的所有邻居节点
    3. $min_v$:该最小函数是对x的所有相邻节点v而言的

3.1.1 Distance-Vector算法特点

  1. 迭代计算:计算过程持续到相邻节点间无更多信息要交换,要注意,该算法没有计算应该停止的信号,即为自我终止。
  2. 异步计算:不要求所有节点的计算过程同步。
  3. 分布式计算:每个节点都要从一个或多个直接相邻节点接收信息执行计算,并将计算结果分发给相邻节点。

3.1.2 Distance-Vector算法基本思想

  1. 每个节点x维护下列路由选择信息
    1. $c(x,v)$:从节点x到所有直接相连邻居v的开销
    2. $\overline{D_x}=[D_x(y):y \in N]$:其中,$\overline{D_x}$是从x到N中所有其他节点y的开销估计向量。该向量包含了节点x到N中所有目的地y的开销估计值,N即为网络中的节点集,
    3. $\overline{D_v}=[D_v(y):y \in N]$:节点x同时存储维护每个邻居的距离向量
  2. 在该分布式、异步算法中,每个节点不时地向它的邻居发送它的距离向量副本。
  3. 当节点x从它的任何一个邻居v接收到一个新的距离向量$\overline{D_v}=[D_v(y):y \in N]$后,节点x使用Bellman-Ford方程更新节点x自己的距离向量:$D_x(y) = min_v[c(x,v)+D_v(y)]$
  4. 若节点x的距离向量因更新步骤而发生改变,则节点x接下来将向它的所有邻居发送自己更新后的距离向量,这将使所有邻居更新邻居们自己的距离向量。
  5. 按照上述方式不断进行异步交换距离向量,每个开销估计值$D_x(y)$均会收敛到$d_x(y)$,$d_x(y)$为从节点x到节点y的实际最低开销路径的开销

3.1.3 距离向量(DV)算法伪代码描述

距离向量(DV)算法伪代码描述

  1. 注意:为了更新节点x的转发表,节点x真正需要知道的不是到目的节点y的最低开销路径的开销值,而是从节点x沿着最低开销路径到目的节点y的下一跳邻居节点$v*(y)$。该下一跳路由节点$v(y)$即为在DV伪代码算法的第14行中取得最小值的邻居节点v(若有多个取得最小值的邻居v,则任取一个最小值邻居节点v)。因此,在伪代码的第13~14行,节点x同时决定$v^(y)$并更新节点x对目的地y的转发表。

3.1.4 LS与DV算法的简要区别

  1. LS算法是一种全局算法,即LS算法要求每个节点在运行Dijkstra算法前,首先需要获得该网络的完整信息。
  2. DV算法是分布式的,该算法不需要全局信息,节点具有的唯一信息是它到直接相连邻居的链路开销及它从邻居中接收到的信息。每个节点等待来自任何邻居的更新(伪代码第1011行),当接收到一个新的更新时,节点计算它的新距离向量并向它的邻居通告其新距离向量(伪代码第1617行)。
  3. 实践中,许多类似DV的算法被用于多种路由选择协议中,包括RIP、BGP及早期的ARPAnet。

3.2 Distance-Vector算法运行实例

  1. 实例中,算法的运行以同步的方式显示,即所有节点同时从其邻居接收报文,计算其新距离向量,如果距离向量发生了变化则通知其邻居节点。异步的方式同样也能正确运行,即异步方式中可在任意时刻出现节点计算与“更新的产生和接收”。
    一图胜千言:Distance-Vector算法运行实例
    1. 注意:当各节点中D(a)计算值不发生改变时,节点停止发送更新通告进入静止等待状态,当链路开销发生改变时,节点计算再次启动。

3.2.1 链路开销发生改变的情况

  1. 链路开销减少实例
    图中x到y的链路开销由4减为1
    1. 节点链路开销表变化如下
      节点链路开销计算迭代表
    2. 由此可以看出,对于链路开销减少的好消息,所有节点仅用三次迭代就完成了所有节点的链路开销更新。
  2. 链路开销增加实例
    图中x到y的链路开销由4增为60
    1. 节点链路开销表变化如下
      节点链路开销计算迭代表
    2. 由此可以看出,关于链路开销增加的坏消息,所有节点需要用较多的迭代次数才能完成所有节点的链路开销更新,若$c(y,x)$由4便为10000且$c(z,x)$为9999,那么各节点的迭代次数将会非常多,因此,该问题称为count-to-infinity无穷计数问题。要想解决解决该问题,我们可以使用一种名为“posioned reverse毒性逆转”的计数加以避免。

3.2.2 posioned reverse毒性逆转

  1. 基本思想
    1. 若节点z通过节点y路由选择到目的节点x,则节点z将通告节点y,节点z到节点x的链路开销时∞,即$D_z(x)=∞$。只要节点z经过节点y路由选择到节点x,则节点z就持续地向节点y通告这条信息(谎言)。而因为节点y相信节点z没有到节点x的路径,即在节点y的表项中,$D_z(x)=∞$,因此节点y将永远不会示图经过节点z路由选择到节点x。
  2. 解决问题实例(结合3.2.1 链路开销增加实例产生的无穷计数问题)
    使用poisoned reverse解决无穷计数问题
  3. 需要注意,poisoned reverse方法无法解决一般性的无穷计数问题,即当网络中节点存在涉及3个或更多节点的环路时将无法使用毒性逆转计数解决。

四、LS与DV路由算法的比较

  1. 报文复杂性
    1. LS算法
      1. LS算法要求每个节点均知晓网络中每条链路的开销,因此要求发送$O(|N||E|)$个报文,且无论何时有一条链路的开销发生改变,必须向所有节点发送新的链路开销。
    2. DV算法
      1. DV算法要求在每次迭代时,各节点在直接相连的邻居之间交换报文。当某条链路开销改变时,DV算法仅要求该节点在“新的链路开销导致该节点的某条最低开销链路的开销”发生改变时,该节点才传播已改变的链路开销。
  2. 收敛速度
    1. LS算法
      1. $O(|N|^2)$
    2. DV算法
      1. DV算法收敛较慢,且在收敛过程中可能会遇见路由选择环路、无穷计数问题。
  3. 健壮性
    1. LS算法
      1. 每个LS节点仅计算自己的转发表,因此在LS算法中,路由计算在某种程度上是分离的,这提供了一定程度的健壮性。
    2. DV算法
      1. DV算法中,每个节点可能会想邻居节点通告不正确信息,即各节点之间的耦合性较强,因此健壮性较弱。
  4. 综上,LS与DV算法没有明显的赢家,双方在因特网中均有应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/839888.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 题目集 4 - 6 总结

一、前言 在 Java 编程学习的漫长道路上,题目集 4 - 6 犹如一座座充满挑战与机遇的山峰,促使我们不断攀登,拓展知识边界,提升编程技能与思维深度。这一系列题目集犹如一场全方位的能力试炼,全面检验了我们在多个关键领域的知识掌握程度与实践应用能力。 从知识点的覆盖范围…

针对粗粒度架构的粗粒度调研

Big Picture Reconfigurable: CGRA vs FPGA从架构来看 CGRA(Coarse-Grained Reconfigurable Architecture) 和 FPGA 非常类似,Memory、PE 以及 NoC 片上网络。调研反馈实际二者边界也是逐渐模糊:硬件 CGRA FPGAPE 粒度 Arithemtic Logic(LE), Arithemtic(Logic Element), Cor…

为复合函数和反函数做好准备

1. 移动的功能 https://www.desmos.com/calculator?lang=zh-CN

『玩转Streamlit』--布局与容器组件

在Streamlit中,布局类组件扮演着至关重要的角色。 它们不仅决定了应用程序的视觉呈现和用户体验,也极大地增强了页面内容的组织性和可读性。 通过这些组件,开发者可以灵活地划分页面空间,创建出清晰、有条理的布局结构。 本篇主要介绍3种构建Streamlit App时常用的3种布局类…

vue3 el-table控制列显示隐藏

TableControl.vue<!-- 表格列显示隐藏控制*** 根节点为el-table,会穿透接收组件所有属性1、通过slots接收表格列,生成勾选项2、从缓存中读取数据,匹配勾选项;3、双向绑定,勾选项。表格列使用v-if判断显示隐藏; --> <template><el-table><template v-f…

台电固态硬盘维修数据恢复

针对台电固态硬盘的维修与数据恢复问题,以下是一些建议和方法: 数据恢复 回收站恢复:如果是在电脑操作时不慎将固态硬盘里面的文件误删,且文件被删除后未进行大量写入操作(以免数据被覆盖),可以尝试通过电脑的“回收站”进行文件还原。打开桌面上的“回收站”,在里面找…

VMware 安装ubuntu 挂载共享目录

开机界面点击虚拟机“重新安装vmtools” 修改root密码sudo passwd root关闭防火墙ufw disable安装ssh sudo apt-get install openssh-server创建目录sudo mkdir /mnt/hgfs输入以下命令,如果输出了我们一开始创建的共享文件夹,那就代表你上面的设置正确了vmware-hgfsclient挂载…

js逆向实战之某二手平台请求参数加密逻辑

声明:本篇文章仅用于知识分享,不得用于其他用途 网址:https://www.goofish.com/ 加密逻辑随便点击一个模块,看触发的数据包。再选择一个模块,看哪些参数会变化。比较一下得知t和sign的值会变化。请求数据中的machId是根据所选模块变化的。 主要关注sign的加密逻辑,搜索请…

六步取消win11开机密码

0.前言 新买的电脑打开后首先要进行一系列的操作激活操作系统。在这些操作中最令人讨厌的是设置开机密码(pin)。 也许有很多人的电脑需要保密,限制别人登录,这时使用登录pin是很有必要的。而还有很多人跟我的情况差不多,台式电脑在家里使用,没有什么保密的内容。设置了开…

服务器搭建latex(overleaf)

1.领取免费服务器,推荐免费服务器(SanFengYun)见下图。2.安装宝塔面板,配置内网为127.0.0.1,访问外网地址。 3.可以在宝塔面板一键部署网站,输入自己的域名即可。 4.关键:安装docker,安装yum,设置github可以访问。 5.更换docker镜像,自带镜像无法访问 6.按照overleaf…

基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现三

超级管理员:系统管理、用户管理、拍卖者管理、拍卖商品管理等。 普通用户:注册登录、个人信息管理(个人资料、密码修改等)、竞价管理、评价等。 企业用户:注册登录、发布竞拍、竞拍管理等。 运行环境:windows/Linux均可、jdk1.8、mysql5.7、redis3.0、idea/eclipse均可。…

hhdb数据库介绍(8-3)

部署 自动部署 实现免密登录说明 免密登录需要在两台服务器之间建立免密通道,具体操作如下: 以192.168.190.186与192.168.190.187实现免密连接为例 1.在192.168.190.186的服务器上执行ssh-keygen,连续按3次回车,完成生成公钥和私钥,其中id_rsa为私钥,id_rsa_pub为公钥,到/…