路由算法,又名选路算法,可以根据多个特性来加以区分。算法的目的是找到一条从源路由器到目的路由器的“好”路径(即具有最低费用的路径)。算法设计者的特定目标影响了该
路由协议的操作;具体来说存在着多种路由算法,每种算法对
网络和
路由器资源的影响都不同;由于路由算法使用多种度量标准(metric),从而影响到最佳路径的计算。
简介
路由
算法是提高
路由协议功能,尽量减少路由时所带来开销的
算法。当实现路由
算法的软件必须运行在
物理资源有限的计算机上时高效尤其重要。路由
算法必须健壮,即在出现不正常或不可预见事件的情况下必须仍能正常处理,例如硬件故障、高
负载和不正确的实现。因为
路由器位于
网络的连接点,当它们
失效时会产生重大的问题。最好的路由
算法通常是那些经过了时间考验,证实在各种
网络条件下都很稳定的算法。
此外路由
算法必须能快速聚合,聚合是所有
路由器对最佳路径达成一致的过程。当某
网络事件使路径断掉或不可用时,
路由器通过网络分发路由更新
信息,促使最佳路径的重新计算,最终使所有路由器达成一致。聚合很慢的路由
算法可能会产生路由环或网路中断。
主要目的
路由器使用路由
算法来找到到达目的地的最佳路由。当说“最佳路由”时,考虑的参数包括诸如跳跃数(分组
数据包在
网络中从一个
路由器或中间
节点到另外的
节点的行程)、延时以及分组数据包
传输通信耗时。关于
路由器如何收集
网络的结构
信息以及对之进行分析来确定最佳路由,有两种主要的路由
算法:
总体式路由
算法和分散式路由
算法。采用分散式路由
算法时,每个
路由器只有与它直接相连的路由器的
信息——而没有
网络中的每个路由器的信息。这些
算法也被称为DV(
距离向量)算法。采用总体式路由
算法时,每个
路由器都拥有
网络中所有其他路由器的全部
信息以及网络的流量状态。这些算法也被称为LS(链路状态)算法。
设计目标
路由
算法通常具有下列设计目标的一个或多个:
优化、简单、低耗、健壮、稳定、快速聚合、灵活性。
(1)最
优化:指路由算法选择最佳路径的能力。根据metric的值和权值来计算。
(2)简洁性:
算法设计必须简洁。
路由协议在
网络中必须高效地提供其功能,尽量减少软件和应用的开销。这在当实现路由算法的软件必须运行在
物理资源有限的计算机上时尤其重要。
(3)坚固性:路由
算法处于非正常或不可预料的环境时,如硬件故障、
负载过高或操作失误时,都能正确运行。由于
路由器分布在
网络联接点上,所以在它们出故障时会产生严重后果。最好的
路由器算法通常能经受时间的考验,并在各种
网络环境下被证实是可靠的。
(4)
快速收敛:收敛是在最佳路径的判断上所有
路由器达到一致的过程。当某个
网络事件引起路由可用或不可用时,
路由器就发出更新
信息。路由更新
信息遍及整个
网络,引发重新计算最佳路径,最终达到所有
路由器一致公认的最佳路径。收敛慢的路由
算法会造成路径循环或
网络中断。
(5)灵活性:路由
算法要求可以快速、准确地适应各种
网络环境。例如,某个
网段发生故障,路由
算法要能很快发现故障,并为使用该网段的所有
路由选择另一条最佳路径。
技术要素
路由
算法还应该是灵活的,即它们应该迅速、准确地适应各种
网络环境。路由
算法可以设计得可适应网络
带宽、
路由器队列大小和网络延迟。
路由
算法的核心是
路由选择算法,设计路由算法时要考虑的技术要素有:
1、选择最短路由还是最佳路由;
2、
通信子网是采用虚电路操作方式还是采用
数据报的操作方式;
4、考虑关于
网络拓扑、流量和延迟等网络
信息的来源;
优化指路由
算法选择最佳路径的能力,根据metric的值和权值来计算。例如有一种路由
算法可能使用跳数和延迟,但可能延迟的权值要大些。当然,
路由协议必须严格定义计算metric的
算法。
区分要素
各路由
算法的区别点包括:
静态与动态、单
路径与多路径、平坦与分层、
主机智能与
路由器智能、域内与域间、链接状态与
距离向量。
静态与动态
静态路由
算法很难算得上是算法,只不过是开始路由前由
网管建立的表映射。这些映射自身并不改变,除非
网管去改动。使用
静态路由的
算法较容易设计,在
网络通信可预测及简单的
网络中工作得很好。由于
静态路由系统不能对网络改变做出反映,通常被认为不适用于的大型、易变的网络。九十年代主要的路由
算法都是
动态路由算法,通过分析收到的路由更新
信息来适应
网络环境的改变。如果
信息表示网络发生了变化,路由软件就重新计算路由并发出新的路由更新信息。这些信息渗入
网络,促使
路由器重新计算并对
路由表做相应的改变。
动态路由算法可以在适当的地方以
静态路由作为补充。例如,最后可选路由(router of last resort),作为所有不可路由分组的去路,保证了所有的
数据至少有方法处理。
单路径与多路径
一些复杂的路由
协议支持到同一目的的多条
路径。与
单路径算法不同,这些多路径
算法允许
数据在多条线路上复用。多
路径算法的优点很明显:它们可以提供更好的
吞吐量和可靠性。
平坦与分层
一些
路由协议在平坦的空间里运作,其它的则有路由的层次。在平坦的路由
系统中,每个
路由器与其它所有路由器是对等的;在分层次的路由系统中,一些路由器构成了路由主干,
数据从非主干路由器流向主干路由器,然后在主干上
传输直到它们到达目标所在区域,在这里,它们从最后的主干路由器通过一个或多个非主干路由器到达终点。路由
系统通常设计有逻辑
节点组,称为域、自治
系统或区间。
在分层的
系统中,一些
路由器可以与其它域中的路由器通信,其它的则只能与域内的路由器通信。在很大的
网络中,可能还存在其它级别,最高级的
路由器构成了路由主干。
分层路由的主要优点是它模拟了多数公司的结构,从而能很好地支持其通信。多数的
网络通信发生在小组中(域)。因为域内
路由器只需要知道本域内的其它路由器,它们的路由
算法可以简化,根据所使用的路由算法,路由更新的通信量可以相应地减少。
主机与路由器
一些路由
算法假定源结点来决定整个
路径,这通常称为
源路由。在
源路由系统中,
路由器只作为存贮转发设备,无意识地把分组发向下一跳。其它路由
算法假定
主机对
路径一无所知,在这些算法中,
路由器基于自己的计算决定通过
网络的路径。前一种
系统中,
主机具有决定路由的智能,后者则为
路由器具有此能力。
主机智能和
路由器智能的折衷实际是最佳路由与额外开销的平衡。
主机智能
系统通常能选择更佳的
路径,因为它们在发送
数据前探索了所有可能的路径,然后基于特定系统对“
优化”的定义来选择最佳路径。然而确定所有
路径的行为通常需要很多的探索通信量和很长的时间。
域内与域间
一些路由
算法只在域内工作,其它的则既在域内也在域间工作。这两种
算法的本质是不同的。其遵循的理由是
优化的域内路由
算法没有必要也成为优化的域间路由算法。
链接与距离
链接状态
算法(也叫做短
路径优先算法)把路由
信息散布到
网络的每个
节点,不过每个
路由器只发送
路由表中描述其自己链接状态的部分。距离向量
算法(也叫做
Bellman-Ford算法)中每个
路由器发送
路由表的全部或部分,但只发给其邻居。也就是说,链接状态
算法到处发送较少的更新
信息,而距离
向量算法只向相邻的
路由器发送较多的更新信息。
由于链接状态
算法聚合得较快,它们相对于
距离算法产生路由环的倾向较小。在另一方面,链接状态
算法需要更多的CPU和内存资源,因此链接状态算法的实现和支持较昂贵。虽然有差异,这两种
算法类型在多数环境中都可以工作得很好。
度量标准
路由
算法使用了许多种不同的度量标准去决定最佳路径。复杂的路由
算法可能采用多种度量来选择路由,通过一定的加权运算,将它们合并为单个的复合度量、再填入
路由表中,作为寻径的标准。
通常所使用的度量有:
路径长度、可靠性、时延、
带宽、
负载、通信成本等。
路径长度
路径长度是最常用的路由metric。一些
路由协议允许
网管给每个
网络链接人工赋以代价值,这种情况下,路由长度是所经过各个链接的代价总和。其它
路由协议定义了跳数,即分组在从源到目的的路途中必须经过的
网络产品,如
路由器的个数。
可靠性
可靠性,在路由
算法中指
网络链接的可依赖性(通常以位误率描述),有些网络链接可能比其它的
失效更多,网路失效后,一些网络链接可能比其它的更易或更快修复。任何可靠性因素都可以在给可靠率赋值时计算在内,通常是由
网管给网络链接赋以metric值。
路由延迟
路由延迟指分组从源通过
网络到达目的所花时间。很多因素影响到延迟,包括中间的网络链接的
带宽、经过的每个
路由器的端口
队列、所有中间网络链接的拥塞程度以及
物理距离。因为延迟是多个重要变量的混合体,它是个比较常用且有效的metric。
带宽
带宽指链接可用的流通
容量。在其它所有条件都相等时,10Mbps的
以太网链接比64kbps的专线更可取。虽然
带宽是链接可获得的最大
吞吐量,但是通过具有较大带宽的链接做路由不一定比经过较慢链接路由更好。例如,如果一条快速链路很忙,分组到达目的所花时间可能要更长。
负载
负载指
网络资源,如
路由器的繁忙程度。
负载可以用很多方面计算,包括CPU使用情况和每秒处理分组数。持续地监视这些参数本身也是很耗费资源的。
通信代价
通信代价是另一种重要的metric,尤其是有一些公司可能关心运作费用甚于关心性能。即使线路延迟可能较长,他们也宁愿通过自己的线路发送
数据而不采用昂贵的公用线路。
典型种类
LS算法
1、确认在
物理上与之相连的
路由器并获得它们的IP地址。当一个
路由器开始工作后,它首先向整个
网络发送一个“HELLO”分组
数据包。每个接收到
数据包的
路由器都将返回一条消息,其中包含它自身的IP地址。
2、测量相邻
路由器的延时(或者其他重要的
网络参数,比如平均流量)。为做到这一点,
路由器向整个
网络发送响应分组
数据包。每个接收到
数据包的路由器返回一个应答分组
数据包。将路程往返时间除以2,
路由器便可以计算出延时。(路程往返时间是
网络当前延迟的量度,通过一个分组
数据包从远程
主机返回的时间来测量。)该时间包括了
传输和处理两部分的时间——也就是将分组
数据包发送到目的地的时间以及接收方处理分组数据包和应答的时间。
3、向
网络中的其他
路由器广播自己的
信息,同时也接收其他路由器的信息。
在这一步中,所有的
路由器共享它们的知识并且将自身的
信息广播给其他每一个路由器。这样,每一个
路由器都能够知道
网络的结构以及状态。
4、使用一个合适的
算法,确定
网络中两个
节点之间的最佳路由。
在这一步中,
路由器选择通往每一个
节点的最佳路由。它们使用一个
算法来实现这一点,如
Dijkstra最短路径算法。在这个
算法中,一个
路由器通过收集到的其他路由器的
信息,建立一个
网络图。这个图描述
网络中的
路由器的位置以及它们之间的链接关系。每个链接都有一个数字标注,称为权值或成本。这个数字是延时和平均流量的函数,有时它仅仅表示
节点间的
跃点数。例如,如果一个
节点与目的地之间有两条链路,
路由器将选择权值最低的链路。
Dijkstra算法
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的最佳路由。
链路向量选路算法
链路状态
算法(也称
最短路径算法)发送路由
信息到互联网上所有的结点,然而对于每个
路由器,仅发送它的
路由表中描述了其自身链路状态的那一部分。
距离向量算法
距离向量
算法(也称为
Bellman-Ford算法)则要求每个
路由器发送其
路由表全部或部分
信息,但仅发送到邻近结点上。从本质上来说,链路状态
算法将少量更新
信息发送至
网络各处,而距离向量算法发送大量更新信息至邻接
路由器。 ——由于链路状态
算法收敛更快,因此它在一定程度上比距离向量算法更不易产生路由循环。但另一方面,链路状态
算法要求比距离向量算法有更强的CPU能力和更多的内存空间,因此链路状态算法将会在实现时显得更昂贵一些。
分级路由
可以看到,在LS和DV
算法中,每个
路由器都需要保存其他路由器的一些
信息。随着
网络规模的扩大,网络中的
路由器也将增加。因此,
路由表的规模也将增大,从而使
路由器不能有效地处理
网络流量。使用分级路由可以解决这个问题。让使用DV
算法来查找
节点间的最佳路由。
在下述情形中,
网络中的每个
节点保存了一个有17个记录的
路由表。在分级路由中,
路由器被分成很多组,称为区域。每个
路由器都只有自己所在区域路由器的
信息,而没有其他区域路由器的信息。所以在其
路由表中,
路由器只需要存储其他每个区域的一条记录。在这个例子中,我们将
网络分为5个区域。
如果A想发送分组
数据包到在区域2中的一个
路由器(D、E、F或G),它就将分组数据包先发送到B,依此类推。可以看到,在这种类型的路由中,可以对
路由表进行概括,因此
网络效率提高了。上面的例子描述了一个两级的分级路由。同样我们也可以采用三级或者四级的分级路由。
在一个三级的分级路由中,
网络被分为很多
簇。每个簇由很多个区域组成,每个区域包含很多个
路由器。分级路由广泛应用于互联网路由中,并且使用了多种
路由协议。