计算机网络——27路由选择算法

news2024/9/23 22:52:49

路由选择算法

路由协议

路由协议的目标:确定从发送主机到接收主机之间,通过路由器的网络“较好”的路径(等价于路由器的序列)

  • 路径:路由器的序列,分组将会沿着该序列从源主机到达最后的目标主机
  • “较好”:最小“代价”,“最快的”,“最不拥塞”
  • 路由:一个“top-10”网络挑战

路由的概念

  • 路由:按照某种指标(传输延迟,所经过的站点数目等)找到一条从源节点到目标节点的较好路径
    • 较好路径:按照某种指标较小的路径
    • 指标:站数、延迟、费用,队列长度等,或者是一些单纯指标的加权平均
    • 采用什么样的指标,表示网络使用者希望网络在什么方面表现突出,什么指标网络使用者比较重视
  • 路由器 - 路由器之间的最优路径 = 主机对之间的最优路径
    • 路由器连接子网,子网到路由器之间的跳数就一跳,必须要走
    • 路由器到下一跳路由器(节点到节点)之间的最优路径找到了
    • 也就找到了从源子网向目标子网所有主机对之间的最优路径
    • 大大降低了路由计算的规模
    • 在路由计算中按照子网到子网的路径计算为目标,而不是主机到主机
  • 路由选择算法:网络层软件的一部分,完成路由功能

网络的图抽象

图抽象

在这里插入图片描述

图:G = (N,E)
N = 路由集合器 = (u,v,w,x,y,z)
E = 链路集合 = ((u,v),(u,x),(v,x),(v,w),(x,w),(x,y),(w,y),(w,z),(y,z)) 边有代价

边和路径的代价

  • c(x,x’) = 链路的代价(x,x’)
  • 代价可能总为1
  • 或是链路带宽的倒数
  • 或是拥塞情况的倒数
  • cost of path( x 1 , x 2 , x 3 , . . . , x p x_1,x_2,x_3,...,x_p x1,x2,x3,...,xp) = c( x 1 , x 2 x_1,x_2 x1,x2) + c( x 2 , x 3 x_2,x_3 x2,x3) + … + c( x p − 1 , x p x_{p-1},x_p xp1,xp)

最优化原则

汇集树

  • 此节点到所有其他节点的最优路径形成的树
  • 路由选择算法就是为所有路由器找到使用汇集树

在这里插入图片描述

路由的原则

路由选择算法的原则

  • 正确性:算法必须是正确的和完整的,使分组一站一站接力,正确发向目标站;完整:目标所有的站地址,在路由表中都能找到相应的表项;没有处理不了的目标站地址
  • 简单性:算法在计算机上应简单:最优但复杂的算法,时间上延迟很大,不实用,不应为了获取路由信息增加很多的通信量
  • 健壮性:算法应能适应通信量网络拓扑的变化:通信量变化,网络拓扑的变化算法能很快适应;不向很拥挤的链路发送数据,不向断了的链路发送数据
  • 稳定性:产生的路由不应该摇摆
  • 公平性:对每一个站点都公平
  • 最优性:某一个指标的最优,时间上,费用上等指标,或综合指标;实际上,获取最优的结果代价较高,可能是次优的

路由算法分类

全局或局部路由信息
全局:

  • 所有的路由器拥有完整的拓扑和边的代价的信息
  • "link state"算法

分布式:

  • 路由器只知道与它有物理连接关系的邻居路由器,和到相应邻居路由器的代价值
  • 迭代地与邻居交换路由信息,计算路由信息
  • "**distance vector"算法

静态或动态
静态:

  • 路由随时间变化缓慢

动态:

  • 路由变化很快
    • 周期性更新
    • 根据链路代价的变化而变化

链路静态路由(LS)

LS路由的工作过程

配置LS路由选择算法的路由工作过程

  • 各点通过各种渠道获得整个网络拓扑,网络中所有链路代价等信息(这部分和算法没关系,属于协议和实现)
  • 使用LS路由算法,计算本站点到其他站点的最优路径(汇集树),得到路由表
  • 按照此路由表转发分组(datagram方式)
    • 严格意义上说不是路由的一个步骤
    • 分发到输入端口的网络层

LS路由的基本工作过程

  • 发现相邻节点,获知对方网络地址
  • 测量到相邻节点的代价(延迟、开销)
  • 组装一个LS分组,描述它到相邻节点的代价情况
  • 将分组通过扩散的方式发到所有其他路由器
    • 以上四步让每个路由器获得拓扑边代价
  • 通过Dijkstra算法找出最短路径(这才是路由算法)
    • 每个节点独立算出来到其他节点(路由器 = 网络)的最短路径
    • 迭代算法:第k步能够知道本节点到k个其他节点的最短路径

链路状态路由选择

  1. 发现相邻节点,获知对方网络地址
    • 一个路由器上电之后,向所有线路发送Hello分组
    • 其他路由器接收到Hello分组,回送应答,在应答分组中,告知自己的名字(全局唯一)
    • 在LAN中,通过广播Hello分组,获得其他路由器的信息,可以认为引入一个人工节点

在这里插入图片描述

  1. 测量到相邻节点的代价(延迟、开销)
    • 实测法,发送一个分组要求对方立即响应
    • 回送一个ECHO分组
    • 通过测量时间可以估算出延迟情况
  2. 组装一个分组,描述相邻节点的情况
    • 发送者名称
    • 序号,名称
    • 列表:给出他相邻节点,和它到相邻节点的延迟

在这里插入图片描述

  1. 将分组通过扩散的方法发送到所有其他路由器
    • 序列号:用于控制无穷的扩散,每个路由器都记录(源路由号,顺序号),发现重复的或老的就不扩散
      • 具体问题1:循环使用问题
      • 具体问题2:路由器崩溃之后序号从0开始
      • 具体问题3:序号出现错误
    • 解决问题的方法:年龄字段
      • 生成一个分组时,年龄字段不为0
      • 每一个时间段,AGE字段减一
      • AGE字段为0的分组将被抛弃
    • 关于扩散分组的数据结构
      • Source:从哪个节点收到LS分组
      • Seq,Age:序号,年龄
      • Send flags:发送标记,必须向指定的哪些相邻站点转发LS分组
      • ACK flags:本站点必须向哪些相邻站点发送应答
      • DATA:来自source站点的LS分组
      • 节点B的数据结构
SourceSeqAgeSend flags ASend flags CSend flags FACK flags AACK flags CACK flags FData
A(相邻)2160(初始TTL)0111(A与B相邻,直接获取A的分组,给A ACK)00
F(相邻)2160110001
E(通过A、F获取)2159(一次hop)0101(E通过A获取,给A ACK)01
C(相邻)2060101010
D(通过C、F获取)2159100011
  1. 通过Dijkstra算法找出最短路径
    • 路由器获得各站点LS分组和整个网络的拓扑
    • 通过Dijkstra算法计算出到其他服务器的最短路径(汇集树)
    • 将计算结果安装到路由表中
LS的应用情况
  • OSPF协议是一种LS协议,被用于Internet上
  • IS-IS(intermediate system - intermediate system):被用于Internet主干中,Netware
Dijkstra算法

符号标记

  • c(i,j):从节点i到j链路代价(初始状态下非相邻节点之间的链路代价为∞)
  • D(v):从源节点到节点V的当前路径代价(节点的代价)
  • p(v):从源到节点V的路径前序节点
  • N’:当前已经知道最优路径的节点集合(永久节点的集合)

在这里插入图片描述

LS路由选择算法的工作原理

节点标记:每一个节点使用(D(v),p(v))标记

  • D(v)从源节点由已知最优路径到达本节点的距离
  • P(v)前序节点来标注

2类节点

  • 临时节点:还没有找到从源节点到此节点的最优路径的节点
  • 永久节点 N’:已经找到了从源节点到此节点的最优路径的节点
算法具体流程
  • 初始化
    • 除了源节点外,所有节点都为临时节点
    • 节点代价除了与源节点代价相邻的节点外,都为∞
  • 从所有临时节点中找到一个节点代价最小的临时节点,将之变为永久节点(当前结点)W
  • 对此节点的所有在临时节点集合中的邻节点(V)
    • 如 D(v)>D(w) + c(w,v), 则重新标注此点, (D(W)+C(W,V), W)
    • 否则,不重新标注
  • 开始一个新的循环
例子

在这里插入图片描述

Dijkstra例子

在这里插入图片描述

在这里插入图片描述

Dijkstra算法的讨论

算法复杂度: n节点

  • 每一次迭代: 需要检查所有不在永久集合N中节点
  • n(n+1)/2 次比较: O(n2 )
  • 有很有效的实现: O(nlogn)

可能会出现震荡问题:

  • 例如:链路代价 = 链路承载的流量
  • 路径改变次数过多

在这里插入图片描述

距离矢量路由选择

基本思想

  • 各路由器维护一张路由表,结构如图
To(目标)Next(到达目标的代价最小的路径中,下一跳)cost(到目标的代价)
AZ14
  • 各路由器与相邻路由器交换路由表(待续)
  • 根据获得的路由信息,更新路由表(待续)

在这里插入图片描述

  • 代价及相邻节点间代价的获得
    • 跳数(hops), 延迟(delay),队列长度
    • 相邻节点间代价的获得:通过实测
  • 路由信息的更新
    • 根据实测 得到本节点A到相邻站点的代价(如:延迟)
    • 根据各相邻站点声称它们到目标站点B的代价,计算出本站点A经过各相邻站点到目标站点B的代价
    • 找到一个最小的代价,和相应的下一个节点Z,到达节点B经过此节点Z,并且代价为A-Z-B的代价
    • 其它所有的目标节点同样的计算方法

在这里插入图片描述

例子1

  • 以当前节点J为例,相邻节点 A,I,H,K
  • J测得到A,I,H,K的延迟为 8ms,10ms,12ms,6ms
  • 通过交换DV, 从A,I,H,K获得到 它们到G的延迟为 18ms,31ms,6ms,31ms
  • 因此从J经过A,I,H,K到G的延迟 为26ms(8 + 18),41ms(10 + 31),18ms(12 + 6), 37ms(31 + 6)
  • 将到G的路由表项更新为18ms, 下一跳为:H(18ms对应的节点)
  • 其它目标一样,除了本节点J

在这里插入图片描述

DV的无穷计算问题

  • DV的特点
    • 好消息传的快,坏消息传的慢
  • 好消息的传播以每一个交换周期前进一个路由器的速度进行
    • 好消息:某个路由器接入或有更短的路径
    • 举例
  • 坏消息的传播速度非常慢(无穷计算问题)

在这里插入图片描述

  • 例子:
    • AB之间断开了
    • 第一次交换之后, B从C处获得信息,C可以到达A(C-A, 要经过B本身),但是路径是2,因此B变成3,从C处走
    • 第二次交换,C从B处获得消息, B可以到达A,路径为3, 因此,C到A从B走,代价为3(因为每次改变都会向周围传递Dv )
    • 无限此之后, 到A的距离变成INF,不可达

在这里插入图片描述

Bellman-Ford 方程(动态规划)

设 dx(y) := 从x到y的最小路径代价,那么 dx(y) = min {c(x,v) + dv(y) }
其中:v是x的邻居

例子

在这里插入图片描述

明显的,
d v ( z ) = 5 , d x ( z ) = 3 , d w ( z ) = 3 d_v(z) = 5, d_x(z) = 3, d_w(z) = 3 dv(z)=5,dx(z)=3,dw(z)=3
由于B-F方程得到:
d u ( z ) = m i n { c ( u , v ) + d v ( z ) , c ( u , x ) + d x ( z ) , c ( u , w ) + d w ( z ) } = m i n { 2 + 5 , 1 + 3 , 5 + 3 } = 4 d_u(z) = min \{ c(u,v) + d_v(z), c(u,x) + d_x(z), c(u,w) + d_w(z) \} = min \{2 + 5, 1 + 3, 5 + 3\} = 4 du(z)=min{c(u,v)+dv(z),c(u,x)+dx(z),c(u,w)+dw(z)}=min{2+5,1+3,5+3}=4

那个能够达到目标z最小代价的节点x,就在到目标节点的下一条路径上, 在转发表中使用

思路

D x ( y ) D_x(y) Dx(y) = 节点x到y代价最小值的估计

  • x 节点维护距离矢量 D x = [ D x ( y ) : y ∈ N ] D_x = [D_x (y): y ∈ N ] Dx=[Dx(y):yN]

节点x:

  • 知道到所有邻居v的代价: c(x,v)
  • 收到并维护一个它邻居的距离矢量集
  • 对于每个邻居, x 维护 D v = [ D v ( y ) : y є N ] D_v = [D_v (y): y є N] Dv=[Dv(y):yєN]

核心思路

  • 每个节点都将自己的距离矢量估计值传送给邻居,定时或者DV有变化时,让对方去算
  • 当x从邻居收到DV时,自己运算,更新它自己的距离矢量(采用B-F equation)
    D x ( y ) ← m i n v { c ( x , v ) + D v ( y ) } D_x(y) ← min_v\{c(x,v) + D_v(y)\} Dx(y)minv{c(x,v)+Dv(y)} 对于每个节点y ∈ N
  • X往y的代价x到邻居v代价v声称到y的代价
  • Dx(y)估计值最终收敛于实际的最小代价值 d x ( y ) d_x(y) dx(y)

特点

异步式,迭代: 每次本地迭代被以下事件触发:

  • 本地链路代价变化了
  • 从邻居来了DV的更新消息

分布式:

  • 每个节点只是在自己的DV改变之后向邻居通告
  • 然后邻居们在有必要的时候通知他们的邻居

在这里插入图片描述

水平分裂(split horizon)算法

一种对无穷计算问题的解决办法 —— 结局坏消息传的慢的问题

  • 当AB断开之后,C进行交换
  • C知道要经过B才能到达A,所以C向B报告它到A的距离 为INF;C 告诉D它到A的真实距离2(就这样一边传递INF,一边传递真实举例2,水平方向分裂)
  • 下一阶段,C发现到A的路径断开了,D进行交换
  • D告诉E,它到A的距离,但D告诉C它通向A的距离为INF
  • 第一次交换: B通过测试发现到A的路径为INF,而C也告 诉B到A的距离为INF,因此,B到A的距离为INF
  • 第二次交换: C从B和D那里获知,到A的距离为INF,因此 将它到A的距离为INF
  • ……坏消息以一次交换一个节点的速度传播

在这里插入图片描述

在这里插入图片描述

水平分裂算法问题

水平分裂的问题:在某些拓扑形式下会失败(存在环路)

在这里插入图片描述

  • A,B到D的距离为2, C到D的距离为1
  • 如果C-D路径失败
  • C获知到D为INF,从A,B获知到D的距离为INF,因此C认为D不可达
  • A从C获知D的距离为INF,但从B处获知它到D的距离为2,因此A到B的距离为3,从B走
  • B也有类似的问题
  • 经过无限次之后,A和B都知道到D的距离为INF

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

例子

在这里插入图片描述

LS和DV算法的比较

消息复杂度(DV胜出) O(NE)
收敛时间(LS胜出) O(NlogN)
健壮性(LS胜出) 节点之间影响较小

性能指标LS特点DV特点比较结果
消息复杂度有n 节点, E 条链路,发送报文O(nE)个;(局部的路由信息;全局传播)只和邻居交换信息(全局的路由信息,局部传播)DV胜出
收敛时间O( n 2 n^2 n2) 算法;有可能震荡收敛较慢;可能存在路由环路;count-to-infinity 问题LS胜出
健壮性(路由器故障会发生什么)节点会通告不正确的链路代价,每个节点只计算自己的路由表,错误信息影响较小,局部,路由较健壮节点可能通告对全网所有节点的不正确路径代价,每一个节点的路由表可能被其它节点使用,错误可以扩散到全网LS胜出

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

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

相关文章

vue 中实现下载后端返回的流式数据

验证是否是blob /*** Event 验证是否为blob格式* */export async function blobValidate(data) {try {const text await data.text();JSON.parse(text);return false;} catch (error) {return true;}}get请求 /*** Event: get请求下载后端返回的数据流* description: url[Stri…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图: 由点(node,或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树:特殊的图树,即连通无环图树的结点从根开始,层层扩展子树,是一种层次关系,这种层次关系&#xff0…

Multimodal Chain-of-Thought Reasoning in Language Models阅读笔记

论文(2023年)链接:https://arxiv.org/pdf/2302.00923.pdf GitHub项目链接:GitHub - amazon-science/mm-cot: Official implementation for "Multimodal Chain-of-Thought Reasoning in Language Models" (stay tuned a…

美国socks5动态IP代理如何提升网络效率?

在探讨美国socks5代理动态IP的奥秘之前,我们需要先深入理解其背后的基本概念和原理。Socks5代理是一种先进的网络协议,它像一位中转站,默默地帮用户转发网络请求。它让网络流量得以通过代理服务器传输,进而隐藏用户的真实IP地址。…

独立游戏《星尘异变》UE5 C++程序开发日志3——UEC++特供的数据类型

本篇日志将介绍FString,FText、FName的用法和相互转换,以及容器TMap,TArray的增删查改 一、字符串相关数据类型:FString、FText、FName FString是最接近std::string的类型,字符串本身可以看做一个存储char型的动态数…

Spire.PDF for .NET【文档操作】演示:查找并删除 PDF 中的空白页

PDF 中的空白页并不罕见,因为它们可能是作者故意留下的或在操作文档时意外添加的。当您阅读或打印文档时,这些空白页可能会很烦人,因此可能非常有必要将其删除。在本文中,您将了解如何使用Spire.PDF for .NET以编程方式查找和删除…

Docker创建mysql容器本地版

1.下载docker desktop https://www.docker.com/products/docker-desktop/ 2. 创建容器 docker run 创建并启动mysql容器 --name 容器名字 -d 后台运行容器 -p 映射端口 -e 参数 截至目前最新的mysql是mysql8.0.36 那就整这个试下。 docker run -d --name mysql-cont…

【笔记】深入理解JVM机制

🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 JVM 运⾏流程图 JVM 中内存区域划分 方法区 / 元数据区 堆 栈 程序计数器 本地方法栈 内存区域总结 JVM 中类加载过程 …

flask_restful渲染模版

渲染模版就是在 Flask_RESTful 的类视图中要返回 html 片段代码,或 者是整个html 文件代码。 如何需要浏览器渲染模板内容应该使用 api.representation 这个装饰器来定 义一个函数, 在这个函数中,应该对 html 代码进行一个封装&#xff…

【Java程序设计】【C00368】基于(JavaWeb)Springboot的箱包存储系统(有论文)

TOC 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。 项目简介 项目获取 🍅文末点击卡片…

编译u-boot(硬件: atk-dl6y2c)和NFS/EMMC模式启动Linux Kernel

目录 概述 1 编译u-boot 1.1 解压文件 1.2 编译u-boot 2 配置环境 2.1 在Ubunt 搭建TFTP 2.2 建立下载目录 3 烧写bootloader到SD 4 使用NFS模式启动板卡 5 从EMMC 启动 Linux 系统 5.1 通过配置参数方式 5.2 使用命令直接启动内核 文中使用的代码下载地址&#xf…

MySQL 8.x 高可用集群之MGR(组复制)

MySQL 8.x 高可用集群之MGR(组复制) 前言一、集群部署1.1 修改主机名和关闭selinux1.2 MySQL安装1.2.1 **移除Linux自带安装的mariadb数据库**1.2.2 下载安装文件1.2.3 顺序执行安装1.2.4 启动mysql并修改密码1.2.5 开启防火墙端口允许访问 1.3 修改mysq…

模仿羊羊~消消乐

慎玩!随机生成、不保证能消完哦! 游戏试玩: 链接: https://pan.baidu.com/s/1IwtOd__8Ca0bSouMP8kEzw 提取码: 6yhd

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现五

【简单介绍】 依托先进的目标检测算法YOLOv8与灵活的PyQt5界面开发框架,我们倾力打造出了一款集直观、易用与功能强大于一体的目标检测GUI界面软件。通过深度融合YOLOv8在目标识别领域的出色性能与PyQt5的精美界面设计,我们成功推出了一款高效且稳定的软…

【Web】浅聊Jackson序列化getter的利用——POJONode

目录 核心速览 原理分析 EXP TemplatesImpl利用 SignedObject利用 核心速览 writeValueAsString是jackson序列化自带的入口,在调用该方法的过程中将会通过遍历的方法将bean对象中的所有的属性的getter方法进行调用 下面介绍如下利用链: BadAttrib…

python3游戏GUI--开心打地鼠游戏By:PyQt5(附下载地址)

文章目录 一.前言二.游戏预览1.启动2.开始游戏3.游戏结束4.排行榜 三.游戏思路四.总结 一.前言 第一次用PyQt做游戏,有点小紧张呢。本次使用PyQt5制作一款简单的打地鼠游戏,支持基本游戏玩法、…

IO网络通信

IO Bio: 同步阻塞,一个线程一次连接,基于字符流/字节流 Nio:同步非阻塞 一个线程多个连接,多个请求注册到多路复用selector上,多路复用器轮训连接 面向缓冲区, 从某通道读取数据到缓存区&…

详解Python面向对象编程(一)

类和对象 面向过程——怎么做? (1)把完成某一需求的所有步骤、从头到尾,逐步实现 (2)根据开发需求,将某些功能独立的代码块封装成一个又一个的函数 (3)最后完成的代码&a…

csdn最全面的网安面试题汇总——小白篇

防范常见的 Web 攻击 什么是 SQL 注入攻击 攻击者在 HTTP 请求中注入恶意的 SQL 代码,服务器使用参数构建数据库 SQL 命令时,恶意SQL 被一起构造,并在数据库中执行。 用户登录,输入用户名 lianggzone,密码 ‘ or ‘…

程序员如何兼职赚小钱?

程序员由于有技术和手艺其实兼职赚钱的路子还是挺多的,只要你有足够的时间。 1. 做外包 这是比较传统的方式,甲方在一些众包平台上发布开发任务,你可以抢这个任务,但是价格都比较便宜。 任务比较多的平台: 猪八戒、一品威客、开…