一、相关概念
路由:(名词)数据包从源地址到目的地址所需要经过的路径,由一系列节点组成。路由(动词)某个路由节点为数据报选择投递方向的选路过程。
路由节点:一个具有路由功能的主机或者路由器,维护一张路由表,通过查询路由表来决定向那个节点发送数据包。
路由表:由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接收和发送,其中最后一个是缺省路由条目。
路由条目:路由表中的每一行,每个条目主要由网络地址、子网掩码、下一跳地址、发送接收四部分组成,如果要发送的数据报的目的网络地址匹配到路由表中的某一行,就按照规定接受发送到下一跳。
接口: 路由节点与某个⽹络相连的⽹卡接口。
缺省路由条⽬:路由表中的最后⼀⾏,主要由下⼀跳地址和发送接⼜两部分组成,当⽬的地址与路由表中其 它⾏都不匹配时,就按缺省路由条⽬规定的接⼜发送到下⼀跳地址。
在linux环境下可以通过ifconfig和route查看路由表的信息。(在windos下面cmd中可用ipconfig查看)。
Destination:目的网络
Gateway:下一跳
Genmask:子网掩码
Flags 标记 :U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发,因此下一跳地址处记为* 号。
Use: 此路由项被路由软件查找的次数
Iface :使用接口
路由表由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接⼜发送,其中最后一条是缺省路由条目。路由条目路由表中的一行,每个条目主要由目的网络地址、子网掩码、下一跳地址、发送接口四部分组成,如果要发送的数据包的目的网络地址匹配路由表中的某一行,就按规定的接口发送到下一跳地址。缺省路由条目路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
二、路由算法
路由器使用路由算法来找到到达目的地的最佳路由。当说“最佳路由”时,考虑的参数包括诸如跳跃数(分组数据包在网络中从一个路由器或中间节点到另外的节点的行程)、延时以及分组数据包传输通信耗时。关于路由器如何收集网络的结构信息以及对之进行分析来确定最佳路由,有两种主要的路由算法:
总体式路由算法和分散式路由算法。采用分散式路由算法时,每个路由器只有与它直接相连的路由器的信息——而没有网络中的每个路由器的信息。这些算法也被称为DV(距离向量)算法。采用总体式路由算法时,每个路由器都拥有网络中所有其他路由器的全部信息以及网络的流量状态。这些算法也被称为LS(链路状态)算法。
(一)静态路由算法
1.Dijkstra算法(最短路径算法)
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权回路。
Dijkstra算法执行下列步骤:
1)路由器建立一张网络图,并且确定源节点和目的节点,在这个例子里我们设为V1和V2。然后路由器建立一个矩阵,称为“邻接矩阵”。在这个矩阵中,各矩阵元素表示权值。例如,[i, j]是节点Vi与Vj之间的链路权值。如果节点Vi与Vj之间没有链路直接相连,它们的权值设为“无穷大”。
2)路由器为网路中的每一个节点建立一组状态记录。此记录包括三个字段:
前序字段——表示当前节点之前的节点。
长度字段——表示从源节点到当前节点的权值之和。
标号字段——表示节点的状态。每个节点都处于一个状态模式:“永久”或“暂时”。
3)路由器初始化(所有节点的)状态记录集参数,将它们的长度设为“无穷大”,标号设为“暂时”。
4)路由器设置一个T节点。例如,如果设V1是源T节点,路由器将V1的标号更改为“永久”。当一个标号更改为“永久”后,它将不再改变。一个T节点仅仅是一个代理而已。
5)路由器更新与源T节点直接相连的所有暂时性节点的状态记录集。
6)路由器在所有的暂时性节点中选择距离V1的权值最低的节点。这个节点将是新的T节点。
7)如果这个节点不是V2(目的节点),路由器则返回到步骤5。
8)如果节点是V2,路由器则向前回溯,将它的前序节点从状态记录集中提取出来,如此循环,直到提取到V1为止。这个节点列表便是从V1到V2的最佳路由。
2.扩散法
事先不需要任何网络信息;路由器把收到的每一个分组,向除了该分组到来的线路外的所有输出线路发送。 将来会有多个分组的副本到达目的地端,最先到达的,可能是走了“最优”的路径
常见的扩散法是选择性扩散算法。
3.基于流量的路由算法
既考虑拓扑结构,又兼顾网络负荷;前提:每对结点间平均数据流是相对稳定和可预测的;根据网络带宽和平均流量,可得出平均包延迟,因此路由选择问题归结为找产生网络最小延迟的路由选择算法。提前离线(off-line)计算
(二)动态路由算法
1.距离向量路由算法
距离向量路由算法(Bellman-Ford Routing Algorithm),也叫做最大流量演算法(Ford-FulkersonAlgorithm),其被距离向量协议作为一个算法,如RIP, BGP, ISO IDRP, NOVELL IPX。使用这个算法的路由器必须掌握这个距离表(它是一个一维排列-“一个向量”),它告诉在网络中每个节点的最远和最近距离。在距离表中的这个信息是根据临近接点信息的改变而时时更新的。表中数据的量和在网络中的所有的接点(除了它自己本身)是等同的。这个表中的列代表直接和它相连的邻居,行代表在网络中的所有目的地。每个数据包括传送数据包到每个在网上的目的地的路径和距离/或时间在那个路径上来传输(我们叫这个为“成本”)。这个在那个算法中的度量公式是跳跃的次数,等待时间,流出数据包的数量,等等。在距离向量路由算法中,相邻路由器之间周期性地相互交换各自的路由表备份。当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。 其优点是算法简单容易实现。缺点是慢收敛问题,路由器的路径变化需要像波浪一样从相邻路由器传播出去,过程缓慢。
路由表基本表项如图:
每一个相邻路由器发送过来的路由表都要经过以下步骤:
1)对地址为X的 路由器发过来的路由表,先修改此路由表中的所有项目:把”下一跳”字段中的地址改为X,并把所有”距离”字段都加1。
2)对修改后的路由表 中的每一个项目,进行以下步骤:
(1)将X的路由表(修改过的),与S的路由表的目的网络进行对比。若在X中出现,在S中没出现,则将X路由表中的这一条项目添加到S的路由表中。
(2)对于目的网络在S和X路由表中都有的项目进行下面步骤 :
(2.1)在S的路由表中,若下一跳地址是x ,则直接用X路由表中这条项目替换S路由表中的项目。
(2.2)在S的路由表中,若下一跳地址不是x ,若X路由表项目中的距离d小于S路由表中的距离,则进行更新。
3)若3分钟还没有收到相邻路由器的更新表,则把此相邻路由器记为不可到达路由器,即把距离设置为16。
水平分裂算法(在发送路由更新消息时进行限制,结点不向相邻结点报告那些从该相邻结点学习到的路由信息
2.链路状态最短路由优先算法SPF
1)发现邻居结点,并学习它们的网络地址;
2)测量到各邻居节点的延迟或者开销;
3)创建链路状态分组;
4)使用扩散法发布链路状态分组;
5)计算到每个其它路由器的最短路径。
使用Dijkstra算法处理链路信息
三、收敛路由原理
1.基本概念
路由收敛指网络的拓扑结构发生变化后,路由表重新建立到发送再到学习直至稳定,并通告网络中所有相关路由器都得知该变化的过程。也就是网络拓扑变化引起的通过重新计算路由而发现替代路由的行为。
通过路由收敛可以使路由域中所有路由器对当前的网络结构和路由转发达成一致的状态。收敛时间是指从网络的拓扑结构发生变化到网络中所有路由设备中路由表重新保持一致的状态转换过程。
2.触发条件
1)路由器失效
2)连接失效
3)管理度量调整等
3.步骤包括:
在转发层面启动定时器,所述定时器的时长用于限定路由收敛的速度;当转发层面监测到网络异常时或者控制层面对端口的关闭(Shut down)命令后,在相应的转发条目中置上标记;根据所述被置上的标记,取次优先的下一跳和出接口进行转发;控制层面重新计算相应目的地址的路由,并且更新到转发表中。本发明方法可以在网络状态发生变化、需要路由收敛的第一时间,由转发层面先侦测出这一变化,并直接执行收敛的结果,然后再更新路由表。由于将路由更新,转发更新的操作置后,使得路由的收敛时间大大减少。