路由生产算法

来源:互联网 发布:linux渗透有什么用 编辑:程序博客网 时间:2024/04/30 12:08

路由

路由
是指路由器从一个接口上接收数据报,根据数据报的目的地址进行定向并转发到另一个接口的过程。
路由结点
一个具有路由能力的主机或路由器,它维护一张路由表,通过查询路由表来决定向那个接口发送数据报。
接口
路由结点与某个网络相连的网卡接口。
路由表
由很多路由条目组成,每个条目都指明去往哪个网络的数据报应该经由那个接口发送。其中最后一条是缺省路由条目。
路由条目
路由表中的每一行,每个条目主要由目的网络地址、子网掩码、下一跳地址、发送接口四部分组成,如果要发送的数据报的目的网络地址匹配路由表中的某一行,就按规定的接口发送到下一跳地址。
缺省路由条目
如果要发送的数据报的目的网络地址与路由表中的任何一行都匹配不上,就按缺省路由条目的接口发送下一跳地址。
这里写图片描述

路由生成算法

(1)距离向量算法
所有路由器都和自己的相邻路由器定期交换路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。
对每一个相邻路由器发送过来的报文,进行以下步骤:
(a)对地址为X的相邻路由器发送过来的报文,先修改此报文中的所有项目:把“下一跳”字段中的地址都改为X,并把所有距离字段的值都加1(注1),每一个项目都有三个关键数据,即:到目的网络N,距离是d,下一跳路由器是X。
(b)对修改后的报文中的每一个项目,进行以下步骤:
若原来的路由表中没有目的网络N,则把该项目添加到路由表中(注2)。
否则(即在路由表中没有目的网络N,这时就再查看下一跳路由器地址)
若下一跳路由器地址是X,则把收到的项目替换原路由表中的项目(注3)。
否则(即这个项目是:到目的网络N,但下一跳路由器不是X)
若收到的项目中的距离d小于路由表中的距离,则进行更新(注4)。
否则什么也不做(注5)。
(c)若3分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器(即把距离置为16)。
(d)返回
注1:为了便于本路由表的更新。
注2:表明这是新的目的网络,应当加入到路由表中。
注3:要以最新消息为准。
注4:记录距离较短的路径。
注5:若距离更大了,就不用更新,以较短距离为准。
(2)链路状态算法
链路状态算法以图论作为理论基础,用图作为网络拓扑结构,并利用图论中的最短路径算法来计算网络间的最佳路由。
思想原理:
(a)路由器向相邻路由器发送查询报文,测试他和相邻路由器的链路状态,如果收到相邻路由器发送回来的响应,则说明两个路由器之间可以正常通信通信。
(b)收到该路由器和相邻路由器的链路状态后,还向系统中所有参加最短路径优先算法的路由器发送链路状态报文。
(c)各路由器收到其他路由器发送的链路状态后,根据报文中的数据刷新本路由器中的网络拓扑结构图,如果链路发生变化,路由器将采用Dijkstra算法生成新的最短路径优先并更新路由表。
计算步骤:
(a)发现他的邻接点,并知道其网络的地址;
(b)测量到各邻接点的延迟或开销;
(c)构造一个分组,分组中包含所有他收到的消息;
(d)将这个分组发送给其他的路由器;
(e)计算出到每一个路由器的最短路径。
(3)Dijkstra算法
最短路径优先算法,用于计算一个节点到其他节点的最短路径。它的主要思想是以起始点为中心向外层层扩散(广度优先搜索思想),直到扩散到终点为止。
算法思想:
首先指定起点s,此外引入两个集合S和U,S记录已求出最短路径的节点以及相应的最短路径长度,U记录还未求出最短路径的节点以及该节点到起点s的距离。
初始时,S中只有起点s,U中包含除s外的所有节点,其中U中保存的路径是该节点距离起点s的距离;
然后从U中找出最短路径的节点,并加入到S中;
接着更新U中的节点和节点对应的路径;
然后再从U中找出最短路径的节点,并加入到S中;
……
重复操作,直到遍历完U中所有的节点。
具体实现:
这里写图片描述
假设起点为D,那么:
S={D(0)};U={A(∞),B(∞),C(3),E(4),F(∞)G(∞)};
其中C点距离D点最短,所以将C放入S中,更新U;
S={D(0),C(3)};U={A(∞),B(13),E(4),F(9),G(∞)};
其中E点距离D点最短,所以将E放入S中,更新U;
S={D(0),C(3),E(4)};U={A(∞),B(13),F(6,G(12)};
其中F点距离D点最短,所以将F放入S中,更新U;
S={D(0),C(3),E(4),F(6)};U={A(22),B(13),G(12)};
其中G点距离D点最短,所以将G放入S中,更新U;
S={D(0),C(3),E(4),F(6),G(12)};U={A(22),B(13)};
其中B点距离D点最短,所以将B放入S中,更新U;
S={D(0),C(3),E(4),F(6),G(12),B(13)};U={A(22)};
其中A点距离D点最短,所以将A放入S中,更新U;
S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)};U={};
此时各个节点距离起点D的最短路径就计算出来了。

原创粉丝点击