路由选择算法

网络层的主要功能是将分组从源端机器经选定的路由送到目的端机器。在大多数子网中,分组的整个旅途需经过多次转发。无线广播网络是惟一明显的例外。但即使在这里,如果源端和目的端在同一网络中,仍然有路由选择的问题:路由选择算法和它们使用的数据结构是网络层设计的一个主要区域。

  路由选择算法(routing algorithm) 是网络层软件的一部分,负责确定所收到分组应传送的外出路线。如子网内部采用数据报,对收到的每一个分组都要重新作路由选择,因为对每个分组来说,上次到达的最佳路由可能已被改变。然而,如果子网内部采用虚电路,则当建立一条新虚电路时,仅需作一次路由选择决策,以后,数据就在这条先前建立的路由上传送, 后一种情况有时又称做会话路由选择(session routing), 因为在整个用户会话期间都存在同一条有效的路由(例如终端的登陆会话或文件传送期间)。

  不管是为每个分组单独地选择路由,还是仅当建立新连接时选样路由,都希望路由选择算法具有某些特征:正确性(correctness)、简单性(simplicity)、健壮性(robustness)、稳定性(stability)、公平性(fairness) 和最优件(optimality)。正确性和简单性不需过多解释,但对健壮性的需要可能开头并不清楚,一旦一个重要的网络投入使用,可能希望它能无变化无错误地连续运行几年。在这期间,会有这样或那样的软硬件错误,主机、路由器和线路将增加或撤除,拓扑结构要多次改变,路由选择算法必须能妥善处理拓扑结构和通信量的变化,而不会使所有主机中的作业部终止,也不必每当某些路由器崩溃时,都要更新启动该网络。

  稳定性也是路由选择算法的重要目标,有的路由选择算法不管运行了多长时间, 都不可能趋于稳定, 公平性和最优性是显而易见的
——肯定没有人反对,但结果证明它们常常是矛盾的。作为这种矛盾的一个简单的例子,参见图5-4。断定在A和A',B与B'和C与C'间的通信总是足以使图中水平链路处于饱和,为了使流量达到最大,X与X'应该完全切断数据传送。 不幸的是,X与X'可能都不知道这一点,于是有必要在全局效率与单个连接的公平性之间进行适当的折衷。

     


  在我们能够找到公平性与最优性间的平衡办法之前,必须确定要对什么进行优化。虽然减少分组平均延迟是一个明显的考虑因素,而提高网络的总吞吐量也很重要。此外,使用接近容量限制的队列系统暗示着会有很长的队列延迟,因此,这两个目标也是相矛盾的。作为一种折衷的办法,许多网络试图使分组必须经过的站点减至最少。因为减少站点数量,有助于改进延迟,也能减少所消耗的带宽,最终将有助于改进吞吐量。

  路由选择算法可以分为两大类:非自适应的和自适应的。非自适应算法(no adaptive algorithm) 不根据实测或估计的网络的当前通信量和拓扑结构来作路由选择。从I到J的路由对于所有的I和J是事先脱线地(off-line)计算好的,在网络启动时就下载到路由器中,这一过程有时称作静态路由选择(static routing)

  相反,自适应算法(adaptive algorithm)根据拓扑结构,通常还有通信量的变化来改变其路由选择,自适应算法由于其获取信息方式的不同(例如己局部地,从相邻路由器或从所有路由器),改变路由选择条件不同(例如,每△T秒,当载荷变化成拓扑结构变化时),用于进行优化的参数不同(例如,距离、站点数或估计传送时间),可分为不同的种类, 以下几小节我们将讨论各种各样的路由选择算法,包括动态的和静态的。

   5.2.1 最优化原则

  在讨论某个特殊算法之前,有必要指出即使在不知道详细的通信子网拓扑结构和通信量的情况下,也可能对最优路由作出总体上的断言。 这种断言被称作最优化原则(optimality principle), 它断言,如果路由器J在从路由器I到K的最佳路由上, 那么从J到K的最佳线路就会在同一路由之中,为理解这些,称从I到J的路由为rl,而路由其余部分称为r2。如果J到K还有在一条比r2更好的路由,那么它可以同r1联系起来,以改进从I到K的路由,这与r1r2是最优路由的断言相悖。

  作为优化原理的一个直接结果,我们可以看到,从所有源端到目地端的最佳路由集合,形成了以目的地为根的树。这样一棵树称为汇集树(sinktree), 如图5-5所示,其中距离度量单位是站点数。应当指出的是,汇集树并不惟一,共他具有相同的路由尺度的树也有可能存在。所有路由选择算法的目的就是为所有路由器找出并使用汇集树。




  因为汇集树的确是一棵树,它个包含任何循环。因此每个分组可在有限的步长之内送达。实际上,现实并不那么简单,在操作过程中链路或路由器都有可能卸下或重新装上。而且,我们必须弄清,是否每个路由器都得单独地获取计算其汇集树的信息,或者用其他方法来获取信息。我们随后将回到这一主题。不管怎样,优化管理和汇集树为其他路由选择算法提供了一个测量标准。

  在以下3小节中, 我们将讨论一种不同的静态路出选择算法。之后,我们将讨论自适应算法最短路由选择。

   5.2.2 最短路由选择

  让我们采用一种由于其简单易懂而以多种形式广泛应用的一种技术来开始研究路由选择算法。这种技术的主要思想是建立一个子网图,图中的每个节点代表一个路由器,每条弧线表示一条通信线路。为了选样一对路由器间的路由,算法要在图中找出其间最短的路径。

  对最短路径(shortest path)这个概念值得作一些解释。 测量路径长度的一种方法是计算站点数量。 若使用这种量度法,图5-6中ABC和ABE是等长的。另一种量度是以km为单位的地理距离。在这种情形中,ABC就比ABE明显长得多(假设此图是按比例绘制的)。


  然而,采用许多其他的量度法也是可能的。 例如, 每条弧(链路)都标以用一个标准测试分组每小时或每天测试运行所得的平均队列长和传输时延来标识。对于这样标注的图,最短路径也就是最快路径,而非弧段最少或里程数最少的路径。

  在大多数通用情况下,弧段的标注可以距离、信道带宽、平均通信量、通信开销、队列平均长度、测量到的时延和其他一些因素的函数而计算出来。通过改变加权函数,算法就会根据许多标注中的任何一个或几个计算出最短路径。

  我们已知道从计算图中两个节点间最短路径的几种算法。下面介绍的这种算法是Dijkstra(1959)所提出的。每个节点用从源节点沿已知最佳路径到本节点的距离来标注(在圆括号内)。开始,一条路径也不知道,故所有的节点都标注为无穷大。随着算法的进行和不断找到的路径,标注随之改变,使之反映出较好的路径。一个标注可以是暂时性的,也可以是永久性的。最初,所有标注都是暂时性的。当发现标注代表了从源节点直到该节点的最短可能路径时,就使它成为永久性的,不再进行修改。

  为了说明加标注算法是怎样工作的,请参考图5-6(a)所示的加权无方向(标量)图,其中权值表示距离。现在我们想找出从A至D的最短路径, 我们的标注A为永久性的(用实心圆点表示)作为开始,然后依次考察与A相邻的每个节点(工作节点),用它们各自到A的距离重新标注这些节点。每当重新标注一个节点时,也标注了此试探所对应的源节点, 以便在以后重建最终路径时,检查完与A相邻的每一个节点后,再来检查整个图中所有暂时性的标注节点,并使标注最小的节点成为永久性的节点,如图5-6(b)所示。这个节点就变成了新工作节点。

  现在从B开始.检查与B相邻的所有节点。如果B的标注与从B到所检查的节点的距离之和小于此节点的标注,我们便得到了一条更短的路径,所以应重新标注这个节点。

  检查完所有与工作节点相邻的节点以后,如果可能,则已修改了暂时性标注,在整个图中查找具有最小值的临时加标注节点。然后使此节点成为永久性的,并成为下一轮检查的工作节点。 图5-6描述了此算法的前五步。

  为了说明此算法为什么正确,请参阅图5-6(c)。这时候我们正好将E置为永久性的, 假定有一条比ABE还要短的路径为AXYZE,则有两种可能性: 节点Z可能已是永久性的或者还不是。 如果Z是永久性的, 则表明E已经被试探过(在Z被置成永久性后一轮中), 因此,AXYZE路径没有逃过我们的注意。

  现在考虑当Z仍是暂时性的情形。 Z的标注或者大于或者等于E的标注。在这种情况下,AXYZE不可能比ABE短,Z的标注如果小于E的标注,在这种情况下, 是Z而不是E将首先成为永久性标注,允许从Z再去试探E。

   5.2.3 扩散法

  另一种静态算法是扩散法 (flooding), 它把收到的每一个分组,从除了分组到来的线路外的所有输出线路上发出。显然扩散要产生大量的重复分组,事实上有可能是无穷多个分组,除非采用一些措施抑制这种过程。一种措施是让每个分组头包含站点计数器,每经过一个站点,计数器减1,当计数器值为0时,就扔掉分组。理想的情况是计数器设置初值为从源端到目的端的路径长度。如果发送者不知道路径的长度,它可以按最糟糕的情况,即子网的直径来设置初值。

  另一种方法是记录下分组扩散的路径,防止它第二次再扩散到已扩散的路径中。达到这一目的的一种方法是让源端路径器在所接收的来自主机的每一个分组中设置一个序号,每个路径器对应于每个源端路由器有一张表,用来指明已见到的是源端生成的哪个序号,如果进入的分组已在表中,则不再扩散。

  为了防止该表无限制地增长,每个表应加一个计数器k作为参数,表示直到k的序号都已看见。 当一个分组进入时,就能容易查出此分组是否为复制品;如果是,则扔掉此分组。而且, 低于k的表项都不再需要,因为k已有效地综合了各种因素。

  扩散法的一个稍为实际的变种是选择性扩散法(selective flooding)。在这种算法中,路由器并不将每一进来的分组从每一条输出线路上发出,而是仅发送到与正确方向接近的那些线路上。不太可能将一个应该向西传送的分组传送到向东的线路上去,除非拓扑结构极为奇特。

  扩散法在很多应用中都未实际采用,但它还是有一些用处的。例如,在军事应用中,大批的路由器随时都可能被炸毁得所剩无几,所以非常希望采用具有很结实的扩散方式。在分布式数据库应用中,有时需要并行地更新所有数据库,在这种情况下,扩散就非常有用。第三种可能的用途是把它作为一种尺度来衡量其他路由选择算法。扩散总是选择最短路径,因为它并行地选择每一条可能的路径。所以,没有其他算法能产生一个更短的延迟(如果我们忽略掉扩散过程本身产生的开销)。

   5.2.4 基于流量的路由选择

  上面的各种算法研究仅考虑到了拓扑结构,而没有考虑到载荷。例如,如果在图5-6中的A到B已有很大的通信量, 那么在选择从A到C的路由时,选择AGEFC这条路径可能比选择ABC要好, 虽然它比ABC的路径要长。本节我们将讨论一种既考虑拓扑结构又兼顾载荷的静态路出选择算法,它称作基于流量的路由选择(flow-based routing)。

  在一些网络中, 每对节点间平均数据流是相对稳定的和可预测的。例如,在一个零售连锁店公司的网络中,每个商店可能会按预定的格式向已知处发送订单、销售报告、库存更新情况和其他定义良好的报文类型。所以总的通信量每天变化很少。在预先知道i到j的平均通信量的条件下,有可能对流量进行数学分析,以优化路由选择。

  这种分析的基本想法是:对某一给定的线路,如果已知载荷量与平均流量,那么就可能由队列原理计算出该线路上的平均分组延迟。由所有的线路平均延迟,可直接计算出流量加权的平均值,从而得到整个网络的平均分组延迟。于是,路由选择问题就归结为如何找出产生网络最小延迟的路由选择算法。

  要采用这种技术,就必须预先知道某些信息。首先,必须知道网络的拓扑结构;其次,必须给出通信量矩阵 ;第三,必须有说明各线路容量的矩阵 ;最后,必须选定一种〔可能是暂时的)路由择算法。

  作为这种方法的一个例子,考虑图5-8(a)所示的全双工通信子网。线上的数值表示各方向的容量 (以b/s为单位)。图5-8(b)的矩阵有一项表示各个源端口。从源端i到目的端j的顶表示从i到j的通信路由和从i送到j每秒钟的分组数量。例如,从B到D3分组/s,使用路由BFD。注意, 这里已用了某种路由选择算法来导出了矩阵中所示的路由。

  给定了这些信息, 就可以直接计算出线路i中的总员 。 例如,B-D的通信量在BF线路上是3分组/秒, FD线路上也是3分组/秒,类似地,A-D通信量在路线AB,BF,FD上分别为每1分组/s。 每条伸向右端线路的总通信量如图5-9中λi列所示。在这个例子中,所有的通信量是对称的, 即:对所有X和Y, XY的通信量与YX的通信量是等同的。该图也给出了每条线路每秒的平均分组数量,其中 是假定分组平均长度为1/s=800位求得的。




  图5-9中倒数第二列给出了由队列原理导出的各条线路的平均延迟:



  其中,1/u是以比特为单位的分组平均长度, μC是以b/s为单位的容量,λ是以分组/s为单位的平均流量。例如,如果容量μC=25分组/s,且实际流量λ=14分组/s, 那么,平均延迟为9ms。注意:当λ=0时,其平均延迟仍为40ms,对应于容量为25分组/s,换而言之,“延迟”包括排队时间和服务时间。

  为了计算出整个网络的平均延迟时间, 我们取8条电路的加权和,其中权值是总通信量使用该线路的比例。在本例中,平均延迟时间为86ms。

  为了评价一个不同的路由选择算法.我们可以重复整个过程,仅用不同的流量就可以得到一个新的平均延迟。如果限定用一种路由选择算法,那么,就只有有限制地为分组选择从源到目的地的路由的方法。可以常简单地编写一个试用全部算法的程序,找出哪一种算法的平均延迟最小。因为这些计算可以顶先脱机进行,费时可能不是个大问题。那么,这一算法即是最好的路由选择算法。Bertdeka和Gallager(1992)详细讨论了基于流量的路由选择。

   5.2.5 距离矢量路由选择

  现代计算机网络通常使用动态路由选择算法,而不是前面所描述的静态算法。有两种动态算法,即距离矢量路由选择算法和铁路状态路由选择算法最常见。本节我们将讨论前一个算法,下一节里再讨论后一个算法。

  距离矢量路由选择(distance vector routing) 算法是让每个路由器维护一张表(即向量),表中给出了到每个目的地已知的最佳距离和路线。通过与相邻路由器交换信息来更新表的信息。

  距离矢量路由选择算法有时也叫其他的名字,包括分布式Bellman-Ford路由选择算法和Ford-Fulkerson算法,是根据其开发者的名字命名的(Bellman1957;Ford和Fulkerson,1962)。它最初用于ARPANET路由选择算法,还用于因特网和早期版本的DECnet和Novell的IPX中,其名字为RIP。AppleTalk和Cisco路由器使用了改进型的距离矢量协议。

  在距离矢量路由选择算法中,每个路由器维持有一张子网中每一个以其他路由器为索引的路由选择表,表中的每一个项目都对应于子网中的每个路由器。此表项包括两个部分,即希望使用的到目的地的输出线路和估计到达目的地所需时间或距离。 所用度量标准可为站点, 估计的时间延迟(ms), 该路出排队的分组估计总数或类似的值。

  假定路由器知道它到每个相邻路由器的“距离”。如果度量标准为站点,其距离就为一个站点。如果度量标准是队列长度,则路由器会简单地检查每个队列。如果度量标准是延迟,路由器可以直接发送一个特别“响应”(ECHO)分组来测出延迟,接收者只对它加上时间标记后就尽快送回。

  作为一个例子,假定用延迟来作为度量标准,且路由器知道其相邻路由器的延迟。 每Tms路由器将它估计的到各目的地的延迟清单送给每个相邻节。它也从各相邻节点收到一份类似的清单送给每个相邻节点, 它也从各相邻节点收到一份类似的清单。假设从相邻节点X到刚收到达样一张表, 其中用Xi表示又估计的由它到路由器i的预计时间。如果路由器知道X的延迟为mms,它也就知道了由它经X到路由器i所需时间为 。 通过对每个相邻路由器进行这种计算,此路由器就可以找出哪一个预计值最好,并在它的新路由选择表中使用此预计值和相应的线路。注意,在计算时不使用旧的路由选择表。

  这种更新过程如图5-10所示。(a)部分表示一个子网。(b)部分的前4列表示路由器J从相邻节点收到的时间延迟矢量。A认为到B的延迟为12ms,到C的延迟为25ms, 到D的延迟为40ms等。假定J巳测量或预计它到相邻节点A、I、H和K的延迟分别为8ms、10ms、12ms和6ms。

  考察一下怎样计算到路由器G的新路由。它知道如果经A转发分组到G的话,需要26ms。类似地,它能计算出经I,H, 和K到G分别各需41(31+10)ms,18(6+2)ms和3(31+6)ms。这些值中最好的是18,因此,它就在路由选择表中填上到G的延迟为18ms, 所用的路由经由H。对所有其他目的地作相同的计算, 得到的路由选择表如图中最后一列所示。


     
   无穷计算问题

  距离矢量路由选择理论上能有效地工作,但在实际运用中却有很大的缺陷。虽然它能得出正确的结论,但有可能太慢。特别是,它对好消息的反应迅速,但对坏消息却反应迟钝。考虑有一个路由器,它到目的地X的最佳路由也很长,如果在某次交换信息时,它的邻居A忽然报告说有一个到X的更短的延迟,即增加了新电路,使该路由器到X的距离更短。 那么该路由器仅需简单地将输出到X的通信量转移到A上。在一次矢量变换中,好消息就起了作用。

  为了弄清好消息的传播有多快, 参考如图5-11所示的一个5节点(线性)子网、其延迟度是节点数。 假设A刚开始不在子网上,而且其他路由器也知道这一点。 也就是说,它们将到A的延迟都记为无穷大。


  当A连上网络后, 其他路由器通道矢量交换知道它上网了。为了简化问题,我们假设有一个定时器短期使所有路由器同时初始化矢量交换。任第一次交换时, B得知其左邻居到A有零延迟,B就在路由表中记上到A的路径长度是一个节点。其他路由器还认为A没有上网。这时候,路由表中A的表如图5-11(a)中第二行所示。 第二次交换时,C知道B有一条到A的长度为1的路径,因此它就更新其路由表,记上一条长度为2的到A的路径,但D和E到现在还不知道这一消息。很明显,好消息的传播正常是每交换一次前进一个节点。 在一个最长路径为N个节点的子网中, 在N次交换内,所有路由器都会知道新增的线路和路由器。

  现在,让我们来考虑一下如图5-11(b)所示的情形。 开始时,所有的线路和路由器都在网上。 路由器B、C、D和E到A的距离分别是1、2、3和4。忽然,A下网了。或者A与B之间的线路断开了,这对于B来说都一样。

  在第一次分组交换时,B没有从A处得到任何信息。 所幸的是,C说:“别担心,我还有一条到A的长度为2的路径。”B并不知道C的路径还要经过B本身。B会想,C可能有多条独立的长度为2的路径通往A。结果,H认为它能通过C到达A, 路径长度为30第一次交换中D和E并不更新其对应于A表顶。

  第二次交换时,C注意到它所有的邻居都声称有一条通往A的长度为3的路径。它随意选择任意一个邻居, 并将到A的距离设为4,如图5-11(b)中第三行所示。不断的交换过程如图5-11(b)中所示。

  通过这张图应该看得出,为什么坏消息传播得慢。不存在一个比所有邻居节点值还大的值。慢慢地,所有路由器都会无穷大,但交换次数依赖于无究大的取值究竟是多少。因此,将无穷大设成原长路径加1是一个很好的办法。 如果度量是时间延迟,就没有定义良好的上限可言。那么,无穷大就很难设置成一个相当大的值,以防止误将有很大延迟的路径当作不在网上来处理。

   水平分裂算法

  理论上已提出多种解决无穷计算问题的完美办法。但这些办法一个比一个复杂,一个比一个更不实用。这里,我们将只介绍其中的一种方法,并谈一谈其失败之处。 水平分裂(split horizon)算法与距离向量算法工作过程一样, 不同之处在于到X的距离并不向真正通向X的邻居节点报告(实际L,向该邻居节点报告的距离为无穷大)。例如,图5-11(b)中的初始化状态下,C告诉D它到A的真实距离,但
C告诉B它到A的距离为无穷大。 类似地, D告诉E实情,但不对C说真话。

  现在,让我们看看A下网后的情况。在第一次交换时,B发现直达路径已没有了,而C也报告说到A的距离为无穷大,因为两个邻居都到不了A,B便将它到A的距离也设为无穷大。第二次交换时,C发现从它的两个邻居节点都不能到达A,它也将A标为不可到达。使用水平分裂法,坏消息以每交换一次一个节点的速度传播,这比不用水平分裂方法要好得多。

  真正糟糕的是,水平分裂法虽然被广泛应用,有时候也会失败。例如,考虑如图5-12中的4节点子网,初始化时A和B都到D的距离都为2,C的距离为1。

     
  假设CD线路断开了。使用水平分裂法,A和B告诉C,它们不能到达D。因此,C立即将得到结论,D是不可达的,并告诉A和B。不幸的是,A听说R有一条到D的长度为2的路径,因此, 它认为能通过B经3个节点到达D。类似地,B也认为能通过A经3个节点到达D。下一次交换时,它们又都将距离设为4。两个节点都逐渐增加到无穷大,这正是我们努力想要避免的情形。

   5.2.6 链路状态路由选择

  直到1979年, ARPANET都用的是距离矢量路由选择,之后变为由链路状态路由选择所代替。两个主要问题导致了距离矢量路由选择算法的消亡。第一,因为延迟度量是队列长度,在选择路由时,并没有将线路的带宽考虑进去。 开始,所有的线路都是56Kb/s,因此线路带宽并不是待考虑的因素。但当有些线路升级为230Kb/s,乃至1.544Mb/s后,不考虑带宽因素就很成问题了。当然,也可以在延时变量中加入线路带宽因子。但第二个问题依然存在,也就是算法往往耗去过多时间用于记录信息,即使使用了像水平分离这样的技术。因此,它被一种全新的算法,现在叫作链路状态路由选择(link state routing)算法所替代。 现在各种各样的链路状态路由选择算法得到了广泛的应用。

  隐藏在链路状态路由选择之后的思想十分简单,可以分开部分加以描述。每个路由器必须:

  1.发现它的邻居节点,并知道其网络地址。
  2.测量到它各邻居节点点的延迟或开销。
  3.组装一个分组以告之它刚知道的所有信息。
  4.将这个分组发送给所合其他路由器。
  5.计算到每个其他路由器的最短路径。

  事实上,完整的拓扑结构和所有的延时都已被测量并被测量到各个路由器中。随后,各个路由器都可以用则Dijkstra算法来找出最短路径。下面,我们将更详尽地讨论上述五个步骤。

   发现邻居节点

  当一个路由器启动以后,它的第一个任务就是要知道谁是它的邻居, 这是通过向每条点到点线路发送特殊的HELLO分组来实现的。在另一端的路由器应发送回来一个应答来说明它是谁。这个名字必须是全局惟一的,因为当一个远端路由器得知有3个路由器都连在F时,它得弄清是否这3个路由器指的是同一个F。

  当两个或多个路由器由一个LAN连接起来时, 情况就更复杂了一点。 如图5-13(a)所示, 一个LAN将3个路由器A,C和F直接连接起来。每个路由器都是与其他的路由器相连。

  一种模型化LAN的方法是将它本身当作一个节点,如图5-13(b)所示。 这里,我们引入了一个新的人工节点N,与A,C和F相连。从A经LAN到C的路径在这里表示为路径ANC。


   测量线路开销

  链路状态路由选择需要每个路由器知道它到邻居节点的延迟,至少得有个可信的估计值。取得延迟时间的最直接方式就是发送一个要求对方立即响应的特殊的ECHO分组。通过测量一个来回的时间再除以2,发送方路由器就可以得到一个可靠的延迟估计值。想要更精确些,可以重复这一过程多次。再取平均值。

  其中一个有趣的话题是,在测量延迟时是否将载荷考虑进去。如果要考虑载荷因素,往返时间应该从ECHO分组进入队列时开始计时;如果忽略载荷,计时器就得从ECHO分组排列队列第一位时开始计时。

  两种方法都会有争议。在延时测量中引入流量因素意味着当一个路由器在两条具个相同带宽的线路间进行选择时,如果一条线路总是很繁忙。刚另一条相比要好得多,那么后者将被认为是一条更短的路径。这种选样能导致良好的性能。


  但不幸的是,在延时计算中引入载荷因素也有争议。考虑如图5-14所示的子网,该子网分为东西两部分,由两条线路CF和EI相连。

  假设东西两部分的人部分通信都通过线路CF, 结果, 这条线路拥挤不堪,延迟很长。如果在最短路径计算中考虑排队延迟,那么EI线路便会很有吸引力。当新的路由表在装入以后,大部分东西的通信又会选择EI线路,使之过载;接着, 在下次更新路由表时,C又变成最短路径。最后,路由表会变得摇摆不定,导致不稳定的路由选择和很多潜在的问题。如果忽略裁荷因素而只考虑带宽.这种问题就不会发生。可供选择的办法还有,将在两条线路之间半分,但这样一来就不能充分利用最佳路径。

  一旦用于交换的信息收集起来,下一步就是构造一个包含所有数据的分组。 该分组以发送者的标志符开头, 紧跟着是顺序号和年龄(后面再介绍),和一个邻居节点列表,对于每个邻居节点,都给出了到它们的延迟。图5-15(a)给出了一个示例子网, 其延时标在线路上,相应的6个链路状态分组见图5-15(b)。



  创建路接状态分组很容易,难的是决定何时创建分组,一种可能性是定期创建,即每隔一定时间间隔就创建一次,另一种可能性是当出现重大事件时(像线路或邻居节点的增删,或它的特征值的明显改变时)再创建。

   发布链路状态分组

  本算法中最具技巧性的部分就是如何可靠地发行链路状态分组。当分组被发布和安装后,首先得到分组的路由器将改变其路由选择。同时,别的路由器可能还在使用不同版本的拓扑结构,这样导致了不一致性、死循环、不可达机器和其他问题。

  首先,我们将描述基本发布算法,随后,我们针对它进行一些调整。基本思想是利用扩散来发布链接状态分组。为了控制扩散,每个分组包含一个顺序号。该顺序号在每次发送新分组时加1。 路由器记下它所见过的所有信息对(源路由器,顺序号)。当一个新的链路状态分组到达时,它先查看一下该分组是否已收到过。如果是新的,把它再向除了进入线路之外的所有线路发布; 如果是重复的, 则丢弃它。如果一个分组的顺序号比目前为止已到达的最大的顺序号还小,则被认为己过时而拒绝。

  这个算法有一点问题,但这些问题是可以控制的。首先,如果顺序号循环使用,就会发生冲突。解决办法是使用32位的顺序号;如果每秒钟发送一个链路状态分组, 就得花137年才能使计数循环回来,所以避免了发生冲突的可能性。

  其次,如果一个路由器崩溃了,它将丢失其顺序号。如果它再从
0开始,那么后面的分组可能会被当作重复分组而被拒绝。

  第三,如果顺序号传送后出现错误,4被错看成65540(一个位错误),分组5到65540都会被当成过时分组而遭拒绝,因为当前顺序号被认为是65540。

  解决这些问题的办法是,在每个分组的顺序号之后再加上年龄字段(age),每秒钟将年龄递减1,当年龄变成零时,来自于那个路由器的信息就被丢弃掉。 比如说,通常每10min进入一个新分组,因此当路由器关掉后, 路由器的信息便会过时(或者6个连续的分组部被丢失,不太可能发生)。 在初始化扩散过程中, 年龄字段也一样递减,以保证没有任何分组会丢失并无限长地存活下去(一个年龄为零的分组将被丢弃)。

  对该算法的一些细化会使之更健壮。当一个链路状态分组扩散到一个路由器时,它并不立即排队等待传送。相反,它先被送到一个保持区中等待一小会儿。如果已有来自同一路由器的其他链路状态分组先行到达,则比较一下它们的顺序号。 如果相等, 重复分组就被丢弃。如果不相等,老的分组就被丢弃。为了防止路由器至路由器线路出问题,所有的链路状态分组都要应答。一旦线路空闲,保持区就会循环扫描以选择发送一个分组或应答。

  如图5-15(a)所示子网中,路由器B所用的数据结构如图5-16所示。这里的每一行对应于一个新近到达,但还未安全处理完毕的链路状态分组。 这张表记录了分组来自何处, 它的顺序号和年龄以及数据。另外,对应于B的每条输出线(到A,C和F)各有一个传送和应答标志位。传送标志位表示分组必须发向所指示的线路,应答标志位表示应向哪儿发送应答。

  在图5-16中, 从A来的链路状态分组可直接到达,所以它必须被送住C和F,并且A发应答,如标志位所示。类似地,从F来的分组必须发向A和C,并向F发应答。

  仍是, 第三个来自F的分组就有所不同,它有两次到达,一次经过EFB=因此,它只需发往C,但要向A和F发应答,如标志位所示



  如果重复分组在原外组未出缓冲区时到达,标志位就得进行一下修改。例如, 在第四个分组还未被处理完之前,又有一个C的状态拷贝从F到达,那么标志位就应改为100011,表示应向F发应答,而不必再发向那儿。

   计算新路由

  一旦一个路由器积累了一整套的链路状态分组,它便可以重组整个子网结构,因为每条线路出现过了。实际上,链条线路都出现了两次,两个方向各出现一次。两个值可以取平均,也可以分开用。

  现在Dijstra的算法就可以在内部运行, 以确定到所有可能目的地的最短路径。此算法的结果可以安装在路由选择表中,并且通常通过操作恢复。

  对于一个有n个路由器,每个路由器有k个邻居节点的子网来说,所需的存储输入数据的空间为kn的倍数。对于大的子网,这可能还是个问题。而且,计算时间也可能成为一个问题,然而,在很多实际应用中,链路状态路由选择算法工作得很好。

  但是, 硬件或软件问题也能破坏该算法 (对于其他算法也一样)。例如,如果一个路由器声明它拥有一条其实并不存在的线路,或忘记了一条确实存在的线路,子网图将会是不正确的。如果路由器不能正常地向前传递分组,或在向前传递时将分组破坏了,也会出现麻烦。 最后, 如果它的存储空间溢出或路由计算出错,也会导致错误。当子网逐渐增加到成百上干或上万个节点时,某些路由器崩溃的可能性就变得个不忽视了。解决这个问题的技巧是,在不可避免地发生连续事故后,尽量将破坏限制在最小的范围之内。

  链路状态路由选择在实际网络中得到广泛的应用,所以有必要谈谈运用此算法的例子协议。OSPF协议被越来多地应用于因特网,它使用的就是链路状态算法。我们将在5.5.5小节中描述述OSPF。

  另一个重要的链路状态协议是中间系统至中间系统IS-IS(intermediate system-inter-mediate system),它是为DEGnet所设计的,后为ISO)采纳,用于它的无连接网络层协议CLNP。 因此,它还被修改以适应其他协议, 最著名的如IP协议IS-IS被用于多种因特网骨干网中(包括老的NSFNET骨干网),和一些数字蜂窝系统,像CDPD。 NovellNetWare使用一种IS-IS小的变型协议(NLSP)来为IPX分组选择路由。

  基本上IS-IS能发布一个路由器拓扑结构图, 通过该图能计算出最短路径。每个路由器都在其链路状念分组中宣布它能直接到达的网络层地址。 这个地址可以是IP,IPX,AppleTalk或其他任何地址。IS-IS甚至可以同时支持多种网络层协议。

  很多IS-IS设计的革新都被OSPF(OSPF比IS-IS晚几年设计)所采纳, 它包括一种扩散链接状态更新信息的自稳定措施,支持LAN的命名路由器的概念,以及能计算和支持路径分裂及多种度量单位。最终导致IS-IS与OSPF之间只有很小的差别。最大的差别是,IS-IS能很容易地和自然地同时携带有关多个网络层协议的信息,而OSPF没有这一特征。在大型的多协议环境中,这一优势显得尤为重要。

   5.2.7 分级路由选择

  随着网络的增大,路由器路由选择表也会成比例地增大。增大的表格不仅占用路由器的内存, 而且需要更多的CPU时间扫描表格,以及更大的带宽来发送关于表格友倍的状态报告。在某一时刻,网络可能会增大到不可能让每一个路由器都给出至其他每一个路由器的路径表项。因此,就像在电话网络中一样,不得不进行分级路由选择。

  当采用分级路由选择时,将路由器划分为区域,每个路由器知道在自己的区域内怎样选择路由,将分组送到目的端的全部细节,仍并不知道其他区域的内部结构。当不同的网络相连时,很自然地将每个网络看作为独立的区域,以便让一个网络中的路由器免于必须知通其他网络的拓扑结构。

  对于巨型网络,分两级可能是不够的,有必要将区域分组,形成簇(cluster),簇又分成区(zone),区又分成组(group),可以这样继续下去,直到集体性名词用完为止。作为分多级的例子,考虑怎样为从加利福尼亚州的Berkeley (伯克利) 到肯尼亚的Malinda(马琳迪)的一个分组选择路由。伯克利的路由器知道加利福尼亚州内的网络详细拓扑结构,但它会将所有至州外的信息发送到洛杉矶的路由器中,洛杉矾的路由器才能将选择路由信息送到国内的其他路由器,但到国外的信息必须送到纽约。纽约路由器将信息送到目的网中处理国外信息的路由器中,如在肯尼亚的内罗毕。最后,此分组沿着肯尼亚中的树往下传送,直到它到达马琳迪。

  图5-17给出了在有5个区域的两级结构中作路由选择的一个定量分析的例子。路由器1A的整个路由表共有17个表项, 如图5-17(b)所示,虽然与前面一样,表中有全部本地路由器的表项,但把所有其他区域压缩进一个单独的路由器中。 因此,到区域2的所有通信量都经过1B-2A的线路,其余的远程通信量都经过1C-3B的线路。分组路内选择将该表中的表项从17个减到7个。 当区域数与区域中路由器的比例增大时,节省的表格存储空间也会按比例增长。

  遗憾的是,节省空间的收益并非没有代价。这种代价的形式是增加路径长度。 例如,从1A到5C的最好路由是过区域2,但在分级路由选择中, 到区域5的所有通信且都须经过区域3,因为对于区域5中多数路由器来讲,经过区域2是较好的选择。

  当一个单独的网络变得非常大时,一个有趣的问题是分级应该分到多少级?例如, 考虑个有720个路由器的子网。如果不分级,每个路由器需要720项路由选单项。如果将通信子网分成24个区域, 每个区域有30个路由器,则每个路由器只需要30个本地表项加23个远程表项,共有53个表项。 如果选用三级的分级结构,其中有8个簇,每个簇包含9个区,每个区包含10个路由器。那么, 每个路由器需要10个本地路由器表项,以及7个远程簇表项,共计25个表项。   

  Kamon和Kleitrock(1979) 发现有N个路由器的子网的最优级数为1nN,其中,每个路由器需要的表项总数为e1nN。 他们还发现,由分级路由选择引起的有效平均路由长度的增长是如此之小,因而通常都能接受。



   5.2.8 移动主机的路由选择

  如今,成千上万的人拥有便携式计算机。通常,他们希望能在世界的任何地方读到他们的电子函件和访问自己的普通文件系统。这种移动式主机引入了新的复杂性,要想把一个分组发给一移动主机,首先网络得找到它。如何将移动主机联入网络中是很新的话题,但在这里我们将大概地描述有关的一些要点,并给出一种可靠的方案。

  图5-18是网络设计者喜欢使用的世界模型。这里我们有一个由路由器和主机构成的WAN。与WAN相连的是若干个LAN,MAN,以及我们在第2章中学到的那种无线蜂窝单元。

  从来不移动的用户称作静态的用户,他们通过铜线或光纤与网络相连。我们把与此相反的非静态用户分为两类。迁移用户基本上是静态的,他们不断地从一个固定的地方转移到另一个固定的地方,但他们只在机器物理地连上网络之后才上网。漫游用户实际上是在流动过程中使用计算机,并希望他们在到处奔波时也能保持与网络的连接。我们将用移动用户 (mobile user)一词来代表后两类用户中的任一类,也就是那些总不在本地的用户。



  假设所有用户都有一个不变的永久性主方位(home location),用户还有一个永久性的主地址用来确定他们的主方位,类似于电话号码1-212-5551212表示美国(国家是1)和曼哈顿(212)。 用主地址作为动态用户在系统中的路由选择目标,就有可能将分组发送给动态用户,再使分组有致地到达用户所在的任何地方。当然,前提是得找到用户。

  在图5-18所示的模型中, 世界 (按地理位置)被分成许多小单元,我们称之为区域,每个区域常常是一个LAN, 或无线单元。每个区域有一个或多个外地代理(foreign agent), 用来管理所有来到当地的动态用户。另外每个区域还有一个主代理(home agent),用来管理原本属于本区域,但当时正在外地的用户。

  当一个新用户进入某地区,通过与当地网络相连(例如,插入当地的LAN), 或者进入该无线单元而必须将自己登录到当地的外地代理。典型的登录工作过程如下:

  1.外地代理定期广播一个分组, 宣布自己的存在及其地址。一个新来的移动主机可以等待这类消息,但如果这类消息来得不够快,移动主机可以广播一个分组问:“这里有没有外部代理”。
  2.移动主机登录到外地代理, 并给出其原来所在地的地址,当前数据链路层地址,以及一些安全性信息。
  3.外地代理与移动主机的主代理联系, 并说:“有一台你的主机在我这里。”从外地代理发给主代理的信息包括外地代理的网络地址,还包括安全信息,以向主代理证实移动主机的确在那儿。
  4.主代理检查安全性信息, 信息中包括一个时间标记,以证实它是在过去几秒钟内生成的。如果一切通过,它告诉外地代理继续。
  5.当外地从从代理处得到确认后,它在它的表中开出一个表项,并通知移动主机,它已经登录上了。

  在理想的情况下,当一个用户离开某区域时,也应该退出登录,但很多用户只是突然关掉他的计算机。

  当一个分组被发行移动用户时, 它先路出到用户的主 (home)LAN,因为那里才是该用户的有效地址。如图5-19所示,发往主LAN的流动用户的分组被主代理拦截。宿主代理接着查找流动用户的新(临时)方位,并找出管理流动用户的外地代理。然后,主代理又做了两件事:第一,它将发给移动用户的分组装进一个外部分组的有效载局(playLoad)字段中,再将该外部分组发给外地代理(如图5-19所示的第2步)、这一机制称为隧道;我们随后将更详细地论述。 外地代理得到封装起来的分组后,将原分组从有效载荷字段中取出,并以数据链路帧的形式发给移动用户。



  第二件事是,主代理告诉发送者,将分组装进有效载荷字段后,直接发往外部代理所在的地址, 再由外地代理发送给移功主机(第3步)。现在, 随后的分组都可以直接通过外地代理路由到用户(第4步),完全绕道了主代理。

  经提议的几种方案在几个方面有些差别。第一,该协议在多大程序度上由路由器执行,又在多大程度上由主机执行;对于后者,又在哪一层执行。第二,在少数方案中,沿途的路由器记下映射地址,以便在分组到达原地区前就将其拦截并重定向到外地代理。第三,在某些方案中,每一个移动用户都有一个惟一的临时地址;而在另一些方案中, 临时地址指向管理所省移动用户信息通信的一个代理。第四,如何管理实际发送地址与标准地址不同的分组,也是各方案的区别所在:一种方法是改变目标地址,再重发一次修改过的分组;另一方法是将整个分组,包括原地址,都装进另一个分组发往临时地址的分组有效载荷字段中。最后一点,各方案在安全性方面有所不同。通常,当一个路由器或主机收到形如“开始吧, 请将所有Cayla的信件发送给我”的消息后,它会提出两个问题:它在与谁交谈,是否应该与它交谈。

   5.2.9 广播路由选择
  
  对于有些应用,主机需要向所有其他主机发送报文。例如,发布大气预报、股市行情或现场直播节目。这类服务如果用广播的形式发往所有机器,有兴趣的人都可能看到这些数据,效果会非常好。将分组同时发往所有目的地称作广播〔broadcasting)。已经有人提出了各种各样的方法来实现这种算法。

  无需子网具有的特殊功能的一种广播方法是让源端简单地发送一个独特的分组到每一个目的端。这种方法不仅浪费带宽,而且还要求源端拥有全部目的端的完整清单。在实际应用中,这也许是惟一可能的办法,但也是最个理想的力法。

  扩散显然是另一种候选方法。虽然扩散很不适合于普通的点到点的通信,但对于广播而言,尤其是当下面所介绍的方法都不适用时,扩散是值得慎重考虑的。扩散作为一种广播技术所碰到的问题,与它作为点到点路由选择算法所碰到的问题一样,它生成了太多的分组和消耗太大的带宽。

  第三种算法是多目的地路由选择(multi destination routing)。 如果采用这种方法,每个分组含有一张目的地清单,或者一张指出所希望目的地的地图。当分组到达路由器时,路由器检查所有的目的地,以确定将需要用的输出线路集合(如果某线路是到达至少一个目的地的最好路由,则需要该线路)。路由器为所使用的每一条输出线路复制一个新的分组,每个分组中仅含要用此线路的那些目的地。实际上,目的地集合是划分在各条输出线路上的,经过足够多数量的站点后,每个分组将仅带有一个目的地。此时,可将它当作普通分组对待。多目的地路由选择像各自寻址分组一样,只是若干分组必须经过同一路由时,其中一个分组负担全部费用,而其他的分组则不必承担费用。

  第四种广播算法利用发起广播的路由器的信息树,或者利用任何其他合适的生成树(spanning tree)。 生成树是子网的一个子集,它包括所有的路由器,但不包含回路。如果每个路由器知道它所属的生成树的线路,它就可以将进入的广播分组复制到除该分组到来线路外的所有生成树线路。这种方法使带宽得到最佳的利用,生成非常少的必须做此工作的分组。惟一的问题是每个路由器必须知道它的可用生成树。有时可以得到这类信息(例如,链路状态路由选择),但有时不能(例如,距离矢量路由选择)。

  我们的最后一种广播算法是,即使当路由器完全不知道关于生成树的任何情况时,也试图与前面提到的第四种算法的性能近似。一旦挑明,其原理是异常地简单。当广播分组到达路由器时,路由器对此分组进行检查,查看该分组是否来自于通常用于发送分组到广播源的线路,如果是,则此广播分组本身非常有可能是从源路由器来的第一个拷贝。在这种情况下,路由器将此分组复制转发到除进入线路外的所有线路。然而,如果分组到来的线路不是到达源端的线路,那么分组就被当作副本而扔掉。

  此算法的一个例子称为逆向路径转发(revese path forwarding), 如图5-20所示。 图5-20(a)是一个子网; 图5-20(b)是该子网中路由器I的汇集树; 图5-20(c)说明逆向路径转发算法是怎样工作的,如树中第二行所示。在第一站点, I发送分组到F,H,J和N。每个这样的分组从所希望的I的路径上到来 (假设所希望的路径就在此汇集树A中),用带圆圈的字母表示。 在第二站点生成8个分组,在第一站点中收到一个分组的每个路由器生成两个。 结果,8个分组全都到达先前没有访问的路由器, 并且除了一个分组外都是沿着所希望的线路到来的。在第2站点生成的9个分组中,只有两个从所希望的路由而来(在C和L),并且仅有这两个分组才生成更多的分组。 经过5个站点和生成24个分组以后,广播算法结束。与汇集树相比,真正经过了汇集树的有的个站段和14个分组。



  逆向路由转发的主要优点是它既合理有效又容易实现。它不要求路由器知道生成树的情况,也没有像多目的地址那样,要在广播分组中包含目的地表或地图,而它的额外开销,也不像扩散那样要求采用特殊机制来停止进程(在每个分组中没有一个站点计数器,并预先知道子网大小,或者当各路由器收到已见到道的分组时即停止)。

   5.2.10 多点播送路由选择

  在有些应用中,一些相对远离的进程以小组的入式协同工作。例如,一组进程使用同一个分布式数据库系统,这常常需要一个进程向小组内的其他成员发消息。如果组的规模较小,它还可以用点到点的方向式向其他成员发消息。如果组很大,这种策略就很浪费。有时也能用广播方式,但在一个有上百万个节点的网上用广播方式通知1000台机器,也是很没效率的,因为大多数接收者都对这些消息不感兴趣(或者更糟,它们很感兴趣,但却不应该知道),因此我们需要有一种向定义良好的小组发送消息的方法,那些小组成员很多,但与整个网络成员相比又只是少数。

  向这样的小组发消息称作多点播送(multicast), 其路出算法称作多点播送路由选择(multicast routing)。 本节我们将讨论一种多点播送路由选择的方法。

  要实现多点播送,就需要有良好的小组管理机制。得有一定的办法来创建和取消小组,以及允许进程加入和离开小组。路由选择算法并不关心这些任务如何完成,它关心的是进程何时加入小组,以及如何通知它的主机已加入小组。很重要的一点是,路由器应该知道它的哪台主机属于哪个小组。或者主机应通知其路由器小组成员的变化情况;或者路由器定期查询它的主机。通过任意一种方式,路由器就能知道它的哪台主机属于哪个小组,路由器再将这些告诉其邻居,这样就在整个子网中传播开来。

  计算一棵生成树,其树根(核心)靠近组的中间部位,要发一个多点播送消息,主机先将它发往核心,再由核心沿着生成树多点播送消息,虽然这棵树并不是对于任何源节点都是最优的, 但它将每组M个树的存储开销降低到了一棵树,节省了大量空间。  
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值