路由算法详解1. 引言 2. 路由器基础知识 3. LS算法 4. 示例:Dijkstra算法 5. DV算法 6. 分级路由

如果您已经阅读过博闻网中的路由器工作原理一文,您会了解到路由器的作用是管理网络流量和找到发送分组数据包的最佳路由。但是您是否想过路由器是怎么做到这一点的?路由器需要一些网络状态的信息来决定如何发送分组数据包以及发往哪里。但是它是怎样收集这些信息的?

在本篇博闻网文章中,我们将带您详细了解路由器需要哪些信息来决定往哪发送分组数据包。

路由器使用路由算法来找到到达目的地的最佳路由。当我们说“最佳路由”时,我们考虑的参数包括诸如跳跃数(分组数据包在网络中从一个路由器或中间节点到另外的节点的行程)、延时以及分组数据包传输通信耗时。

关于路由器如何收集网络的结构信息以及对之进行分析来确定最佳路由,我们有两种主要的路由算法:总体式路由算法和分散式路由算法。采用分散式路由算法时,每个路由器只有与它直接相连的路由器的信息——而没有网络中的每个路由器的信息。这些算法也被称为DV(距离向量)算法。采用总体式路由算法时,每个路由器都拥有网络中所有其他路由器的全部信息以及网络的流量状态。这些算法也被称为LS(链路状态)算法。我们将在下一节讨论LS算法。

采用LS算法时,每个路由器必须遵循以下步骤:

确认在物理上与之相连的路由器并获得它们的IP地址。

当一个路由器开始工作后,它首先向整个网络发送一个“HELLO”分组数据包。每个接收到数据包的路由器都将返回一条消息,其中包含它自身的IP地址。

测量相邻路由器的延时(或者其他重要的网络参数,比如平均流量)。

为做到这一点,路由器向整个网络发送响应分组数据包。每个接收到数据包的路由器返回一个应答分组数据包。将路程往返时间除以2,路由器便可以计算出延时。(路程往返时间是网络当前延迟的量度,通过一个分组数据包从远程主机返回的时间来测量。)请注意,该时间包括了传输和处理两部分的时间——也就是将分组数据包发送到目的地的时间以及接收方处理分组数据包和应答的时间。

向网络中的其他路由器广播自己的信息,同时也接收其他路由器的信息。

在这一步中,所有的路由器共享它们的知识并且将自身的信息广播给其他每一个路由器。这样,每一个路由器都能够知道网络的结构以及状态。

使用一个合适的算法,确定网络中两个节点之间的最佳路由。

在这一步中,路由器选择通往每一个节点的最佳路由。它们使用一个算法来实现这一点,如Dijkstra最短路径算法。在这个算法中,一个路由器通过收集到的其他路由器的信息,建立一个网络图。这个图描述网络中的路由器的位置以及它们之间的链接关系。每个链接都有一个数字标注,称为权值或成本。这个数字是延时和平均流量的函数,有时它仅仅表示节点间的跃点数。例如,如果一个节点与目的地之间有两条链路,路由器将选择权值最低的链路。

Dijkstra算法执行下列步骤:

路由器建立一张网络图,并且确定源节点和目的节点,在这个例子里我们设为V1和V2。然后路由器建立一个矩阵,称为“邻接矩阵”。在这个矩阵中,各矩阵元素表示权值。例如,[i, j]是节点Vi与Vj之间的链路权值。如果节点Vi与Vj之间没有链路直接相连,它们的权值设为“无穷大”。

路由器为网路中的每一个节点建立一组状态记录。此记录包括三个字段:

前序字段——表示当前节点之前的节点。

长度字段——表示从源节点到当前节点的权值之和。

标号字段——表示节点的状态。每个节点都处于一个状态模式:“永久”或“暂时”。

路由器初始化(所有节点的)状态记录集参数,将它们的长度设为“无穷大”,标号设为“暂时”。

路由器设置一个T节点。例如,如果设V1是源T节点,路由器将V1的标号更改为“永久”。当一个标号更改为“永久”后,它将不再改变。一个T节点仅仅是一个代理而已。

路由器更新与源T节点直接相连的所有暂时性节点的状态记录集。

路由器在所有的暂时性节点中选择距离V1的权值最低的节点。这个节点将是新的T节点。

如果这个节点不是V2(目的节点),路由器则返回到步骤5。

如果节点是V2,路由器则向前回溯,将它的前序节点从状态记录集中提取出来,如此循环,直到提取到V1为止。这个节点列表便是从V1到V2的最佳路由。

这些步骤的流程图如下:

在下一页中我们将使用这个算法具体分析一个示例。

我们想找到A与E(下图)之间的最佳路由。可以看到A与E之间有六条可能路径(ABE、ACE、ABDE、ACDE、ABDCE、ACDBE),很明显ABDE是最佳路由,因为它的权值最小。但是实际情况并非总是如此简单,有很多复杂的情形需要使用算法来找到最佳路由。

如下图所示,源节点(A)被选为T节点,所以它的标号是永久(我们将永久性节点以实圈标注,T节点以-->符号标注)。

在这一步中,直接链接到T节点的暂时性节点(B, C)的状态记录集已经被修改。同时,由于B有更小的权值,所以它被选作T节点,其标号被改为永久(如下图所示)。

与步骤2类似,在这一步中,直接链接到T节点的暂时性节点(D, E)的状态记录集已经被修改。同时,由于D有更小的权值,所以它被选作T节点,其标号被改为永久(如下图所示)。

在这一步中,已经没有任何暂时性节点,所以我们仅仅需要确认下一个T节点。因为E有最小权值,所以它被选作T节点。

E是目的节点,所以我们在这里停止。

我们已经到达了终点!现在,我们需要确定路由。E的前序节点是D,D的前序节点是B,B的前序节点是A。所以最佳路由是ABDE。在这个案例中,权值和为4(1+2+1)。

虽然这个算法工作良好,但是它非常复杂,以致于路由器需要花费大量时间进行处理,网络的性能因此下降了。同样,如果一个路由器将错误的信息发送给其他路由器,那么所有的路由决定都将是无效的。为了更好的理解这个算法,下面给出由C语言编写的源代码:

#define MAX_NODES 1024 /*最大节点数 */

#define INFINITY 1000000000 /*比所有最大路径都大的数 */

int n,dist[MAX_NODES][MAX_NODES]; /*dist[I][j] 是从 i 到 j 的距离*/

void shortest_path(int s,int t,int path[ ])

{struct state { /*当前计算的路径 */

int predecessor ; /*前序节点 */

int length /*从源节点到当前节点的长度*/

enum {permanent, tentative} label /*标号状态*/

}state[MAX_NODES];

int I, k, min;

struct state *

p;

for (p=andstate[0];p < andstate[n];p++){ /*初始化状态*/

p->predecessor=-1

p->length=INFINITY

p->label=tentative;

}

state[t].length=0; state[t].label=permanent ;

k=t ; /* k 是初始工作节点 */

do{ /*是从 k 开始的一条更好路径么?*/

for I=0; I < n; I++) /*图有 n 个节点 */

if (dist[k][I] !=0 andand state[I].label==tentative){

if (state[k].length+dist[k][I] < state[I].length){

state[I].predecessor=k;

state[I].length=state[k].length + dist[k][I]

}

}

/*找到具有最小权值的暂时性节点。*/

k=0;min=INFINITY;

for (I=0;I < n;I++)

if(state[I].label==tentative andand state[I].length <

min)=state[I].length;

k=I;

}

state[k].label=permanent

}while (k!=s);

/*将路径复制到输出数组*/

I=0;k=0

Do{path[I++]=k;k=state[k].predecessor;} while (k > =0);

}

DV算法也被称为Bellman-Ford路由算法和Ford-Fulkerson路由算法。在这些算法中,每个路由器都有一个路由表,用来表示到任何目的地的最佳路由。一个典型的路由器J的网络图以及路由表如下所示。

目的地

权值

路线

A

8

A

B

20

A

C

28

I

D

20

H

E

17

I

F

30

I

G

18

H

H

12

H

I

10

I

J

0

---

K

6

K

L

15

K

一个典型的路由器J的网络图以及路由表

如表格所示,如果路由器J想发送分组数据包到路由器D,它应该将分组数据包先发送到路由器H。分组数据包到达路由器H后,它将检查自己的路由表来决定怎样将分组数据包发送到路由器D。

在DV算法中,每个路由器遵循以下步骤:

计算所有与本身直接相连的链接的权值并且将信息保存到路由器的路由表中。

一段时间后,路由器将其路由表发送给相邻路由器(不是所有的路由器),同时也收到每个相邻路由器的路由表。

根据其相邻路由器的路由表信息,路由器更新自己的路由表。

DV算法的一个最主要的问题是“无穷计数”。让我们通过一个例子来研究一下这个问题:

假设一个网络图如下所示。如图所示,A与网络的其他部分只有一条链路。所有节点的路由表以及网络图如下所示:

A

B

C

D

A

0,-

1,A

2,B

3,C

B

1,B

0,-

2,C

3,D

C

2,B

1,C

0,-

1,C

D

3,B

2,C

1,D

0,-

网络图和路由表

现在假设A 、 B之间的链路被剪断了。在这个时候,B修正了自己的路由表。经过一段时间后,路由器交换它们的路由表,因此B接收到了C的路由表。因为C不知道A 、B之间的链路上发生了什么事,所以它说它有一条权值为2的到A的链路(从C到B权值为1,从B到A权值为1——它不知道B已经没有到A的链路了)。B接收到路由表之后认为有另外一条链路从C到A,所以它修正了自己的路由表,即将无穷大更改为3(C认为,B到C权值为1,C到A权值为2)。路由器然后再一次交换它们的路由表。当C接收到B的路由表后,它发现B到A的链路权值从1更改为3,所以C更新了它的路由表,即将它到A的链路权值更改为4(根据B的描述,C到B权值为1,B到A权值为3)。

这个循环过程到最后,所有的节点发现到A的链路权值变成无穷大。这个情形如下表所示。因此,专家称DV算法具有低收敛率。

B

C

D

链接剪断之后到A的权值之和

,A

2,B

3,C

第一次更新后到B的权值之和

3,C

2,B

3,C

第二次更新后到A的权值之和

3,C

4,B

3,C

第三次更新后到A的权值之和

5,C

4,B

5,C

第四次更新后到A的权值之和

5,C

6,B

5,C

第五次更新后到A的权值之和

7,C

6,B

7,C

第n次更新后到A的权值之和

...

...

...

“无穷计数”问题

解决这个问题的一种方法是,路由器只发送信息给相邻路由器,且该相邻路由器不是通往目的地的唯一链接。比如在这个例子中,C就不应该发送任何关于A的信息给B,因为B是通往A的唯一路径。

可以看到,在LS和DV算法中,每个路由器都需要保存其他路由器的一些信息。随着网络规模的扩大,网络中的路由器也将增加。因此,路由表的规模也将增大,从而使路由器不能有效地处理网络流量。使用分级路由可以解决这个问题。让我们通过一个例子来说明一下。

我们使用DV算法来查找节点间的最佳路由。在下述情形中,网络中的每个节点保存了一个有17个记录的路由表。下面是A的一个典型网络图和路由表。

目的地

路线

权值

A

---

---

B

B

1

C

C

1

D

B

2

E

B

3

F

B

3

G

B

4

H

B

5

I

C

5

J

C

6

K

C

5

L

C

4

M

C

4

N

C

3

O

C

4

P

C

2

Q

C

3

网络图和A的路由表

在分级路由中,路由器被分成很多组,称为区域。每个路由器都只有自己所在区域路由器的信息,而没有其他区域路由器的信息。所以在其路由表中,路由器只需要存储其他每个区域的一条记录。在这个例子中,我们将网络分为5个区域(如下图)。

目的地

路线

权值

A

---

---

B

B

1

C

C

1

区域2

B

2

区域3

C

2

区域4

C

3

区域5

C

4

分级路由

如果A想发送分组数据包到在区域2中的一个路由器(D、E、F或G),它就将分组数据包先发送到B,依此类推。可以看到,在这种类型的路由中,可以对路由表进行概括,因此网络效率提高了。上面的例子描述了一个两级的分级路由。同样我们也可以采用三级或者四级的分级路由。

在一个三级的分级路由中,网络被分为很多簇。每个簇由很多个区域组成,每个区域包含很多个路由器。分级路由广泛应用于互联网路由中,并且使用了多种路由协议。

ls路由算法_路由算法详解相关推荐

  1. 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...

  2. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  3. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  4. vue设置html自动跳转路由器,vue2.0项目实现路由跳转的方法详解

    一.安装 1.安装路由vue-router: npm install vue-router vue项目的依赖文件node_modules存在vue-router依赖,说明安装成功 2.vue项目引入v ...

  5. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  6. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  7. Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  8. TP-LINK路由器作为副路由器之Lan接口连接详解

    TP-LINK路由器作为副路由器之Lan接口连接详解 WiFi连接设置TP-LINK路由器作为局域网中的中继副路由器之Lan接口连接的方法,详解. 1.断开电脑的有线连接和WiFi连接的互联网. 1 ...

  9. KMP算法之next数组详解

    KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...

  10. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

最新文章

  1. Java定时任务调度工具
  2. 图片识别文字, OCR
  3. iOS-UIImageView的总结
  4. 使用Laravel框架发送邮件
  5. 使用星际译王查词(安装字典和声音引擎)
  6. mysql多实例脚本_mysql多实例脚本
  7. 导师什么时候会放弃学生?
  8. python连接数据库步骤_Python连接mysql数据库
  9. [MSP430DriverLib-2]使用延时让LED闪烁
  10. 计算机辅助构成和图像处理,计算机辅助图像处理技术,Image process computer-assisted,音标,读音,翻译,英文例句,英语词典...
  11. 【图像隐写】基于matlab GUI DCT数字水印嵌入与提取【含Matlab源码 1323期】
  12. acl 影响因子_适合理论、计算化学投稿的期刊及其2016年影响因子(2017年公布)...
  13. python调用webservice服务
  14. nginx实现均衡负载、nginx第三方模块的添加
  15. mac安装nodeBB时的坑
  16. 多功能手持读数仪VH03如何连接手机蓝牙
  17. CSR8675项目实战:BlueBrowsing蓝牙播放器
  18. 抖音和tiktok是什么关系?TikTok和抖音差别大吗?
  19. 已知两点经纬度 计算距离和方位角(MATLAB实现)
  20. [渝粤教育] 上海交通大学 流体力学 参考 资料

热门文章

  1. 深度解读微信提现收费背后的真实意图
  2. python中oo是什么意思_什么_和__在PYTHON中意味着什么
  3. 小米5c android7.0,亲儿子待遇真爽!小米5c正式升级安卓7.1
  4. 怎么计算机械设备使用费用,什么是施工机械使用费?施工机具使用费怎么计算?...
  5. java计算机毕业设计宁夏红色旅游管理系统源码+程序+lw文档+mysql数据库
  6. python3 爬取图片并分页保存在文件夹中
  7. 成为真正生意人的七种基本能力
  8. html5 mailto,mailto
  9. iPhone5s配置网易邮箱
  10. Linux下使用ps命令查看进程状态【ps常用命令】