哈工大计算机网络课程网络层协议详解之:路由算法概述与链路状态路由算法

news2024/9/27 5:38:06

哈工大计算机网络课程网络层协议详解之:路由算法概述与链路状态路由算法

在前面的小节中,我们介绍了网络中路由器的路由与转发等功能。我们说作为网络层,从功能上来说,核心功能就是要实现路由和转发。 对于转发来说,实际上就是路由器根据存储的转发表,将目的地址转发到对应的输出链路上去。在这个过程中,完成转发的重要依据,就是转发表,而转发表中的路由信息,就来自于路由算法。 通过路由算法来计算合适的路由信息,存储在转发表中,供后续转发时检索。

总而言之,路由的功能对于网络层来说非常重要,如果没有路由算法来确定路由信息,网络层设备就无法确定接收的数据报应该如何转发到目的地址。

网络抽象:图

作为各种路由算法,首先都是将网络结构抽象成一个图的结构,如下所示。图的数据结构包含了一系列的节点,用N来表示,节点之间用线连起来表示边,用E来表示。图的抽象在网络领域应用应该说是非常广泛的。

在这里插入图片描述

除了顶点和边,还可以对边设定数值,这些数值被成为边的权重。在网络应用中,这些权重被抽象成表示链路传输的代价:cost(x, x’) = 链路(x, x’)的费用,比如图中c(w, z) = 5。实际上,这些权重可以根据网络的不同应用场景来设置,比如可以真实的表示链路的造价成本、带宽的倒数,或者拥塞程度等。

有个上述的权重/费用后,在描述从源主机到目的主机经过的路径费用,就是每条路径的费用之和。

在这里插入图片描述

有了上述的目标函数后,路由问题就被抽象成了,如何得到源到目的(如u到z)的最小路径费用是什么?

因此,路由算法就是寻找源到目的之间最小费用路径的算法。

路由算法分类

静态路由 vs 动态路由

静态路由:

  • 手工配置。

    网络管理员根据对网络的掌握,进行手工配置路由转发规则。

  • 路由更新慢。

    必须要手动更新

  • 优先级高

动态路由:

  • 基于路由算法计算得到,路由更新快

    网络中的路由器可以快速计算得到新的路由信息,从而快速更新自身的转发表

  • 周期性更新

  • 及时响应链路费用或网络拓扑变化。

    一旦网络链路费用或者拓扑结构发生变化,通过动态路由计算后,能够及时地响应这种变化。

全局信息 vs 分散信息

即路由算法是只需要局部信息,还是需要全局信息。

全局信息:

  • 所有路由器掌握完整地网络拓扑和链路费用信息
  • 最具有代表性的算法:链路状态(LS)路由算法

分散信息:

  • 路由器只掌握物理相连的邻居以及链路费用
  • 邻居间信息交换、运算的迭代过程
  • 最具代表性的算法:距离向量(DV)路由算法

链路状态路由算法

熟悉数据结构的朋友应该知道,在图结构中求最短路径,一个比较经典的方法就是Dijkstra算法,而链路状态路由算法也恰好就是基于Dijkstra最短路径算法来求解的。

Dijkstra算法在求从一个节点出发,到其他节点的网络最短路径时,需要掌握图的完整拓扑信息和链路费用。 实际上,链路状态路由算法中的链路状态这个词的来历,就反应了我们怎么样保证所有的路由器都能够掌握这张图完整的拓扑信息。

链路状态算法要求每一个路由器,都要构造一个链路状态分组,并进行广播。 这个链路状态分组包含这个路由器与之相连的所有邻居路由器的IP地址,以及与这个路由器直接相连的链路费用。此时,任何路由器都会收集网络中所有其他路由器广播出来的链路状态分组,因此,路由器就可以基于这些链路状态分组中的链路状态信息,构造出完整的网络拓扑结构和链路费用信息。

这样,每个路由器都可以根据它所获取的信息,抽象出完整的网络拓扑结构图和链路费用信息,利用Dijkstra算法计算最短路径。

总结来说就是:

  • 所有节点(路由器)掌握网络拓扑和链路费用
    • 广播链路状态信息
    • 每个路由器获取其他路由器广播的链路状态信息,最终所有节点拥有相同的信息
  • 每个路由器根据其获取的信息,抽象出完整的网络拓扑结构和链路费用,计算从一个节点(“源”)到达所有其他节点的最短路径
    • 获得该节点的转发表
  • 迭代:K次迭代后,得到到达K个目的节点的最短路径(Dijkstra算法的特性)

为了后续对算法描述的便利,先列出使用的符号说明:

  • c(x, y):节点x到节点y链路费用,如果x和y不直接相连,则=∞
  • D(v): 从源到目的节点v的当前路径费用值
  • p(v):沿从源到目的节点v的前序节点
  • N‘:已经找到最小费用路径的结点集合

Dijkstra算法

Dijkstra算法的伪代码过程如下所示,与数据结构中图的求最短路径的算法过程是类似的。
在这里插入图片描述

首先初始化时将当前节点u放入到N’中,并遍历图中除u节点外的其他节点,如果是u的邻居节点,则计算链路费用D(v),如果不是邻居节点,这u节点到该节点的路径费用初始化为无穷大D(v) = ∞。

接着进入一个循环迭代过程。

首先找出刚刚计算的D(w)中,不在N‘集合中,且D(w)值最小的节点w。

找到后,将该节点w加入到N’中,相当于从邻居节点中,找到链路费用最小的邻居节点。

接下来,再计算w节点的所有不在N’集合中的邻居节点的链路费用。其中,D(v) = min(D(v), D(w) + c(w,v))。这个公式也好理解,因为我始终是要找u节点到其他所有节点的最短路径,所有每个D(v)保存的都应该是节点u到当前节点的最小值。

最后重复这个过程,直到所有的节点都包含在了N‘集合中,表示已经找到了所有其他节点的最短路径。

Dijkstra算法示例

假设有下图的网络拓扑结构,我们计算节点u到网络中其他各节点的最短路径。

  1. 首先将节点u加入到已确定最短路径节点集合N’,计算节点u的邻居节点的路径长度D(X)=5、D(W)=3、D(V)=7,并初始化其他节点的D(y)、D(Z) = ∞

  2. 选取节点u邻居节点的最短路径D(w) = 3,的节点W加入N‘,继续计算w节点的邻居节点(不在集合N’中邻居节点)的路径长度。

    这里节点x在u->w->x的路径下D(x) = 7 < 原先从u->x的路径D(x)=5,所以仍然保留D(x) = 5。这也就是上面公式D(v) = min(D(v), D(w) + c(w,v))。而对于节点v来说,路径u->w->v的D(v) = 6 < 原先从u->v的路径D(v) = 7,因此节点v的最短路径D更新为D(v) = 6。

  3. 在节点w的邻居节点中,路径最短的节点是v,加入集合N‘中,继续计算v节点的邻居节点的路径长度。

  4. 同样的,这次取的邻居节点的最短路径是节点y,加入集合N’,此时D(y) = 10。继续计算y节点的邻居节点的路径长度。

  5. 最短路径是节点z,加入集合N‘,此时D(z) = 12。

  6. 最终,集合N’已经包含网络中所有节点,则遍历结束,此时节点对应的D(x)保存的就是节点u到当前节点的最短路径。

整体的流程记录如下图所示,每次红圈圈选出来的都是每一步的最短路径节点。

在这里插入图片描述

示例2,整理的流程步骤跟上述类似。

在这里插入图片描述

在示例2中我们最终可以得到的节点u到网络中其他各节点的最短路径树为:

在这里插入图片描述

这个最短路径树获取后,对于节点u来说,会把这个信息反映到最终的转发表中:

在这里插入图片描述

利用这个转发表,路由器u就知道如果需要将数据报发送到网络中其他节点时,应该走什么样的最短路径。比如要把数据送往路由器v,就可以通过u->v这个接口转发出去,如果要把数据送往路由器x、y、w、z,则都是通过u->x的接口转发出去。这就实现了基于Dijkstra算法的链路状态路由算法。

Dijkstra算法讨论

算法复杂性:n个节点

  • 每次迭代:需要检测所有不在集合N‘中的节点w
  • n(+1)/2次比较:时间复杂度O(n²)
  • 更高效的实现:O(nlogn)

链路状态路由算法的基础是每个节点都需要获取到整个网络的完整拓扑结构,这个在网络规模比较大时,很难适用。因此,接下来我们还会继续介绍距离向量路由算法,以及层次化路由算法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉

我们在深度学习中可以发现有很多不同格式的模型文件&#xff0c;比如不同的框架就有各自的文件格式&#xff1a;.model、.h5、.pb、.pkl、.pt、.pth等等&#xff0c;各自有标准就带来互通的不便&#xff0c;所以微软、Meta和亚马逊在内的合作伙伴社区一起搞一个ONNX(Open Neura…

Redis - 优惠券秒杀、库存超卖、分布式锁、Redisson

文章目录 一、优惠券秒杀1.1 全局唯一ID概述1.2 Redis实现全局唯一ID1.3 添加优惠券1.3.1 entity1.3.2 Controller1.3.3 Service层1.3.4 测试 1.4 优惠券秒杀下单1.4.1 entity1.4.2 Controller1.4.3 Service1.4.3 测试 1.5 库存超卖问题1.5.1 库存超卖原因1.5.2 介绍乐观锁1.5.…

【博学谷学习记录】超强总结,用心分享 | 架构师 Jenkins学习总结

文章目录 Jenkins介绍背景应用场景主从集群 Jenkins使用访问Jenkins获取管理员密码进入jenkins主页修改管理员密码 安装插件插件安装 全局工具配置 企业实战pipeline(重点)创建PipelinePipeline语法语法示例 Jenkins介绍 背景 ​ Jenkins&#xff0c;之前叫做Hudson&#xff…

php开发人员信息搜索查询系统 名单查询系统后台 php增删改查功能

php实现人员信息搜索的功能的方法&#xff1a;1、创建conn.php文件连接人员信息数据库&#xff1b;2、创建index.php文件&#xff1b;3、通过“ if(isset($_POST[“flag”])){…}”等语句实现人员搜索功能即可。 1、首次登录需要输入访问的密码 <?php /*** 登录 **/ $mo…

git的基础总结

写在前面&#xff1a; 前天搞了个面试&#xff0c;发现好多都是会使用&#xff0c;但是要我说&#xff0c;难得说出来&#xff0c;现在对基础进行巩固总结。其实我感觉要求背出来一样的没必要吧&#xff0c;ide基本上可视化了会用就行吧。 文章目录 介绍git的状态 使用/安装/…

php使用PhpSpreadsheet导出Excel表格详解

本文会介绍php使用PhpSpreadsheet操作Excel&#xff0c;供大家参考&#xff0c;具体内容如下&#xff1a; PhpSpreadsheet介绍 1、简介 PhpSpreadsheet 是一个用纯PHP编写的库&#xff0c;提供了一组类&#xff0c;使您可以读取和写入不同的电子表格文件格式 PhpSpreadsheet …

Jetson查CPU/GPU等的占用情况——jtop的安装和使用

Jtop的安装 (1) 安装JTOP查看可查CPU等的占用情况 sudo apt-get updatesudo apt-get full-upgradesudo apt install curlsudo apt install nanocurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py #下载安装脚本sudo python3 get-pip.py # 运行安装脚本sudo pip3 insta…

0401锁详解-MySQL-数据库

1 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题&#x…

解决QtCreator安卓平台原生C++代码无法输出日志问题

1.需求,因原生C++调用std::cout ,std::cerr,及C函数prinf输出要显示在控制台, 问题: 在QtCreator中只看到qDebug输的日志,并没有看到 cout,cerr,printf的输出日志 2.最终已解决如下 在QtCreator中显示了C++原生日志 在Android Studio 的Logcat中显示了C++原生日志 模拟器 …

c++11 标准模板(STL)(std::basic_ostream)(三)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

印刷企业WMS仓储管理系统解决方案

在数字化转型的浪潮中&#xff0c;印刷企业也积极寻求适合自身发展的解决方案。作为印刷业的重要环节&#xff0c;仓储管理对于提高效率、降低成本至关重要。而印刷企业WMS仓储管理系统的应用&#xff0c;为印刷企业带来了全新的解决方案。 印刷WMS仓储管理系统是一种基于信息技…

简单认识Tomcat的部署和优化

文章目录 一、简单认识Tomcat1、简介2、构成3、Tomcat 功能组件结构4、Tomcat 请求过程&#xff1a; 二、Tomcat部署1.关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下2.安装JDK3.设置JDK环境变量4.测试java环境5.安装Tomcat6.启动和关闭Tomcat7.优化 tomcat 启…

synchronized锁升级以后会再降级吗?

Java对象头Markword的结构 其中&#xff0c;最低2位是10代表重量级锁&#xff0c;00代表轻量级锁&#xff0c;001代表无锁&#xff0c;101代表偏向锁。 synchronized锁在1.6的时候做了优化&#xff0c;当仅有一个线程竞争锁的时候&#xff0c;锁处于偏向锁的状态&#xff0c;当…

bim技术的发展趋势是哪些方向?

BIM在现阶段已经取得了较高的发展水平。尽管BIM在许多方面取得了显著进展&#xff0c;但仍有继续改进和发展的空间。未来&#xff0c;BIM在数字化转型、智能化应用和全生命周期管理方面的进一步推进将成为发展重点。简单聊聊BIM技术的发展趋势包括以下几个方向&#xff1a; BIM…

Java面试通关:阿里内部实战模拟面试精讲题库,竟被上传GitHub!

其实这些技术在真正的实际开发环境中真的用得到吗&#xff1f;不一定的&#xff0c;但是没办法&#xff0c;环境就是如此&#xff0c;能做的也就只有不断提升自己&#xff0c;去适应市场环境&#xff0c;提高自身技术水平&#xff01; 我的建议&#xff0c;不管自己现在是个什…

2021北大生命科学院饶毅教授毕业致辞

在祝福裹挟着告诫呼啸而来的毕业季&#xff0c;请原谅我&#xff0c;不敢祝愿每一位毕业生都成功都幸福。因为历史不幸的记载着有人的成功&#xff0c;代价是丧失良知&#xff0c;有人的幸福&#xff0c;代价是损害他人。 从物理学来说&#xff0c;无机的原子&#xff0c;逆​热…

Loadrunner怎么实现MD5加密

目录 前言&#xff1a; 1、写一个md5.h文件&#xff0c;将其放入脚本路径下 2、在globals.h中加入#include “md5.h” 3、在Action中写脚本&#xff0c;脚本示例如下&#xff1a; 前言&#xff1a; 在 LoadRunner 中实现 MD5 加密可以通过使用 LoadRunner 提供的函数来完成…

Redis发布订阅的通讯模式

这个是非常简单的,我们只需要打开两个redis就可以轻松完成 通过Xshell工具两次连接linux,同时启动两个redis: 在第一个里面进行订阅: subscribe leq 在第二个里面进行发布: publish leq hello 这样就可以在订阅的里头看到刚刚发布的信息,没看之前订阅那块也会有提示

带纵深可跳跃横版闯关游戏模版

此项目是以《卡比猎人队》为蓝本开发的横版带纵深闯关游戏模版。内涵数据表配置文件。 购买链接&#xff1a; 微店购买链接 开发环境 开发引擎&#xff1a;CocosCreator3.6.3开发语言&#xff1a;TypeScript 包含的内容&#xff1a; 逻辑实现目录介绍&#xff08;game&am…

Visdom使用

Visdom Visdom是一个面向科学研究的可视化工具&#xff0c;可以帮助你可视化和理解数据。它是 Facebook Research 开发的一个基于 Python 的可视化库&#xff0c;可以在Web浏览器中实时显示和更新图表、图像、文本等各种数据。 1 安装Visdom 可以使用以下命令安装Visdom&…