博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
路由选择算法
阅读量:4079 次
发布时间:2019-05-25

本文共 1889 字,大约阅读时间需要 6 分钟。

主机通常直接与一台路由器相连接,该路由器即为该主机的默认路由器(defaultrouter) ,又称该主机的第一跳路由器(first-hop router)每当主机发送一个分组时,该分组被传送给它的默认路由器。

源主机的默认路由器称作源路由器(sourcerouter) ,目的主机的默认路由器称作目的路由器(destination router)。

一个分组从源主机到目的主机的路由选择问题显然可归结为从源路由器到目的路由器的路由选择问题

 

路由选择算法可分为:

  • 全局式路由选择算法:所有路由器掌握完整的网络拓扑和链路费用信息,例如链路状态(LS)路由算法
  • 分散式路由选择算法;路由器只掌握物理相连的邻居以及链路费用,例如距离向量(DV)路由算法

又可以分为:

  • 静态路由算法:手工配置、路由更新慢、优先级高
  • 动态路由算法:路由更新快、定期更新、及时响应链路费用或网络拓扑变化

还可以分为:

  • 负载敏感算法:链路费用会动态地变化以反映出底层链路的当前拥塞水平。如果当前拥塞的一条链路与高费用相联系,则路由选择算法趋向绕开该拥塞链路来选择路由。
  • 负载迟钝算法:当今的因特网路由选择算法(如RIP 、OSPF和BGP) 都是负载迟钝的,因为某条链路的费用不明显地反映其当前/最近的拥塞水平。

链路状态路由选择算法可以用Dijksua算法实现。

Dijksua算法详见https://www.cnblogs.com/yangyuliufeng/p/9287511.html

所有结点(路由器)通过链路状态广播掌握网络拓扑和链路费用,拥有相同信息,只计算自己的转发表

计算从一个源结点到达所有其他结点的最短路径,经过k次迭代后,得到到达k个目的结点的最短路径

假设链路费用是该链路承载的通信量,则存在震荡(oscillations)可能:

距离向量路由选择算法可以用Bellman-Ford方程dx(y) = min {c(x,v) + dv(y)}实现。

Bellman-Ford算法详见https://www.cnblogs.com/yangyuliufeng/p/9287527.html

每个结点当DV变化时将自身DV估计通告给邻居;邻居在必要时(其DV更新后发生改变)才通告它们的邻居

当结点检测到本地链路费用改变或者接收到来自邻居的新DV估计更新时,即依据B-F方程更新自身的距离向量估计

Dx(y) ← minv{c(x,v) + Dv(y)} for each node y ε N

Dx(y)将最终收敛于实际的最小费用dx(y)

当链路费用变化时:

  • 链路费用变小,消息传递快

(1)y检测到链路费用改变 ,更新DV,通告其邻居.

(2)z收到y的DV更新,更新其距离向量表,计算到达x的最新最小费用,更新其DV,并发送给其所有邻居.

(3)y收到z的DV更新,更新其距离向量表,重新计算y的DV未发生改变,不再向z发送DV

  • 链路费用增加,消息传递慢,还会产生无穷计数问题

毒性逆转(poisoned reverse):如果一个结点Z到达某目的X的最小费用路径是通过某个邻居Y,则Z告知邻居结点Y到达该目的X的距离为无穷大。使用毒性逆转前后的消息传递过程如图所示:

 

涉及3个或更多结点(而不只是两个直接相连的邻居结点)的环路将无法用毒性逆转技术检测到。

可以定义最大度量(maximum metric):一个最大的有效费用值,如16跳步表示费用为∞

 

LS算法和DV算法的比较:

  • 报文复杂性

LS 算法要求每个结点都知道网络中每条链路的费用,要发送O(|N|*|E|)个报文。而且无论何时一条链路的费用改变时,必

须向所有结点发送新的链路费用。

DV算法要求在每次迭代时,在两个直接相连邻居之间交换报文。当链路费用改变时,DV 算法仅当在新的链路费用导致与该链路相连结点的最低费用路径发生改变时,才传播已改变的链路费用。

  • 收敛速度

LS算法的实现是一个要求O(|N|*|E|)个报文的O(|N|^2)算法。

DV 算法收敛较慢,且在收敛时会遇到路由选择环路,还会遭遇无穷计数的问题。

  • 健壮性。

如果一台路由器发生故障、行为错乱或受到破坏时

LS算法:路由器能够向其连接的一条链路广播不正确费用。作为LS广播的一部分,一个结点也可损坏或丢弃它收到的任何LS广播分组。但是每个LS结点都仅计算自己的转发表。因此路由计算在某种程度上是分离的,提供了一定程度的健壮性。

DV算法:一个结点可向任意或所有目的结点通告其不正确的最低费用路径。因此一个不正确的结点计算值会扩散到整个网络。

你可能感兴趣的文章
Pixhawk解锁常见错误
查看>>
C++的模板化等等的确实比C用起来方便多了
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
国内有个码云,gitee
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>