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