"第5章 网络层 第5章 网络层 5.1 网络层主要功能和服务 5.2 电路交换和分组交换 5.3 虚电路和数据报 5.4 路由选择 5.5 流量控制和拥塞控制 5.6 Internet的网际协议IP 5.7 路由器 思考题与习题 第5章 网络层 5.1 网络层主要功能和服务 网络层是OSI参考模型中的第三层,介于传输层和 数据链路层之间。它的主要任务是把网络协议数据单 元或分组从源计算机经过适当的路径发送到目的地计 算机。从源计算机到目的计算机可能要经过若干个中 间节点,这需要在通信子网中进行路由选择。网络层 与数据链路层有很大的差别,数据链路层仅把数据帧 从线缆或信道的一端传送到另一端(即在相邻节点间进 行数据传送),而网络层向运输层提供最基本的端到端 的数据传送服务。 第5章 网络层 网络层关心的是通信子网的运行控制,解决如何 使数据分组跨越通信子网的问题,体现了网络应用环 境中资源子网访问通信子网的方式。为避免通信子网 中出现过多的分组而造成网络阻塞,需要对流入的分 组数量进行控制。另外,当分组要跨越多个通信子网 才能到达目的地时,网络层还要解决网际互连的问题。 因此,网络层的目的是实现两个端系统之间的数 据透明传送,具体功能包括路由选择、阻塞控制和网 际互连等。 第5章 网络层 网络层在其与运输层的接口上为运输层提供服务。 这一接口是相当重要的,因为它往往是公共载体网络 (如电信网络)与用户的接口,也就是说,它是通信子网 的边界。载体网络通常规定了从物理层直到网络层的 各种协议和接口,传输由其用户提供的分组。基于这 种原因,对接口的定义必须十分明确和完善。 第5章 网络层 网络层的服务设计应该按照下列原则: (1) 服务应与通信子网无关。 (2) 通信子网的数量、类型和拓扑结构对于运输层 来说是隐蔽的。 (3) 运输层所能获得的网络地址应采用统一的编号 方式,即使跨越多个局域网和广域网也应如此。 第5章 网络层 基于上述原则,网络层的设计者有较大的自由度 来编写提供给运输层的服务的技术规范。端系统之间 的通信是靠通信子网中间节点间的通信完成的,体现 了通信子网向端系统所提供的网络服务。通信子网向 端系统提供的网络服务有面向连接的(虚电路)和无连接 (数据报)两种,也即端系统的网络层向端系统的运输层 提供的服务。而通信子网内部的工作方式可以是面向 连接的,也可以是无连接的。也就是说,通信子网提 供的网络服务与通信子网内部选择的工作方式无关。 第5章 网络层 5.2 电路交换和分组交换 局域网是广播通信网络,所有网络节点共享通信 介质,不需要中间节点的介入。对于广域网一般都采 用点到点信道,而点到点信道使用存储转发的方式传 送数据,也就是说从源节点到目的节点的数据通信需 要经过若干个中间节点的转接,这涉及到数据交换技 术。数据交换技术主要有:电路交换、报文交换和分 组交换。分组交换是对报文交换的改良。 第5章 网络层 5.2.1 电路交换 交换的概念最早来自于电话系统。当用户进行拨 号时,电话系统中的交换机在呼叫者的电话与接收者 的电话之间建立了一条实际的物理线路,通话便建立 起来,此后两端的电话拥有该专用线路,直到通话结 束。这里所谓的交换是在电话交换机内部。当交换机 从一条输入线上接到呼叫请求时,它首先根据被呼叫 者的电话号码寻找一条合适的输出线,然后通过硬件 开关(如继电器)将二者连通。 第5章 网络层 假如一次电话呼叫要经过若干交换机,则所有的 交换机都要完成同样的工作。电话系统的这种交换方 式叫做电路交换。从上面我们可以知道,在电路交换 网中,一旦通话建立,在两部电话之间就有一条物理 通路存在,直到这次通话结束,才拆除物理通路。因 此,采用电路交换技术进行数据传输需要经历以下三 个过程: (1) 电路建立:在传输任何数据之前,要先经过呼 叫过程建立一条端到端的电路。 第5章 网络层 (2) 数据传输:电路建立后,数据就可以通过网络 从一端发送到另一端。在整个数据传输过程中,所建 立的电路必须始终保持连接状态。 (3) 电路拆除:数据传输结束后,由一端发出拆除 请求,然后逐个节点拆除直到对方节点。 电路交换传输延迟小,惟一的延迟是物理信号的 传播延迟;一旦线路建立,便不会发生冲突。传输延 迟小是因为电路建立后,就不再需要交换开销;不发 生冲突是因为独享物理线路。 第5章 网络层 因此,电路交换具有数据传输可靠、迅速且数据 不会丢失的优点。电路交换的缺点首先是建立连接所 需的时间比较长。在数据开始传输之前,呼叫信号必 须经过若干个交换机,得到各交换机的认可,并最终 传到被呼叫方。这个过程常常需要10 s甚至更长的时间。 对于许多很短时间数据传输的应用,电路建立和拆除 所用的时间过长是不合适的。另外,在电路交换系统 中,物理线路的带宽是预先分配好的。 第5章 网络层 对于已经预先分配好的线路,即使通信双方都没有数 据要交换,线路带宽也不能为其他用户所使用,从而 造成带宽的浪费。当然,这种浪费也有好处,对于占 用信道的用户来说,其可靠性和实时响应能力都得到 保证。因此,电路交换比较适用于系统间要求高质量 的大量数据的传输。 第5章 网络层 5.2.2 分组交换 分组交换是报文交换的一种改进,它将报文分成 若干个分组,分组从源点传送到目的地采用存储转发 方式。分组的大小有严格的上限,有限长度的分组使 得对每个中间节点所要求的存储能力降低了,分组可 以被存储在交换设备的内存而不是磁盘中,这样提高 了交换速度。同时由于分组交换网能够保证任何用户 都不能长时间独占某传输线路,因而它非常适合于交 互式通信,如终端与主机通信等。 第5章 网络层 电路交换和分组交换技术有许多不同之处。其中 一个是电路交换中信道带宽是静态分配的,而分组交 换中信道带宽是动态分配和释放的。在电路交换中已 分配的信道带宽未使用时都被浪费掉,而在分组交换 中,这些未使用的信道带宽可以被其他分组所利用, 因为在分组交换中信道不是为某对节点所专用的,从 而提高了信道利用率,相对来说每个用户信道的费用 也就降低了。但是,正是因为信道不是专用的,突发 的大量输入数据可能会耗尽交换设备的存储空间,造 成分组丢失。 第5章 网络层 另一个不同之处是电路交换是完全透明的,发送 方和接收方可以使用任何速率(在物理线路支持的范围 内)、任意帧格式来进行数据通信。而在分组交换中, 发送方和接收方必须按一定的数据速率和分组格式进 行通信。电路交换和分组交换的另一个区别是计费方 法的不同。它们所采用的技术决定了它们的计费方法 是不同的。在电路交换中,通信费用取决于通话时间 和距离,而与通话量无关,原因是在电路交换中,通 信双方是独占信道带宽的。而在分组交换中,通信费 用主要按通信流量(如字节数或分组)来计算,适当考虑 通话时间和距离。 第5章 网络层 IP电话就是使用分组交换技术的一种新型电话,它的通 话费远远低于传统电话,原因就在这里。当然分组交换 也有许多问题,比如拥塞、报文分片和重组等。对这些 问题的不同处理方法将导致分组交换的不同实现。 分组交换有虚电路分组交换和数据报分组交换两种。 分组交换是计算机网络中使用最广泛的一种交换技术, 如X.25、帧中继和ATM等都属于分组交换网。 第5章 网络层 5.3 虚电路和数据报 端系统间的通信是依靠通信子网中节点间的通信来 实现的。在分组交换方式中,通信子网向端系统提供 虚电路和数据报两种网络服务,而通信子网内部的操 作也有虚电路和数据报两种方式。 第5章 网络层 5.3.1 虚电路 在虚电路操作方式中,为了进行数据传输,要在 网络的源节点和目的节点之间先建一条逻辑通路。每 个分组除了包含数据之外还包含一个虚电路标识符。 该标识符使在预先建好的路径上的每个节点都知道把 这些分组传送到哪里去,无需进行路由选择。最后, 由任何一个端节点发出清除请求分组来结束这次连接。 它之所以是""虚""的,是因为这条通路不像电路交换时 建立的物理通路那样,它不是专用的。 第5章 网络层 分组在每个节点处被存储,并在线路上排队等待转发。 每个节点到其他任一节点之间可能同时有若干条虚电 路。每条虚电路支持特定的两个端系统之间的数据传 输,两个端系统之间也可能有多条虚电路为不同的进 程服务,这些虚电路的实际路径可能相同也可能不同。 第5章 网络层 节点间的物理信道在逻辑上均可看作由多条逻辑 信道组成,这些逻辑信道实际上是由节点内部的分组 缓冲器来实现的。所谓占用某条逻辑信道,实质上是 指占用节点分配的分组缓冲器。不同的逻辑信道在节 点内部通过虚电路号加以区分,各条逻辑信道异步时 分复用同一条物理信道。 第5章 网络层 一条虚电路可能要经过多个中间节点,在节点间 的各段物理信道上都要占用一条逻辑信道用以传送分 组。由于各节点均独立地为通过的虚电路分配逻辑信 道,也就是说同一条虚电路通过各段物理信道时获取 的逻辑信道可能是不相同的,所以各节点内部必须建 立一张虚电路表,用以记录该点的各条虚电路所占用 的各个逻辑信道。 第5章 网络层 为使节点能区分一个分组属于哪条虚电路,每个 分组必须携带一个虚电路号。同样,同一条虚电路的 分组在各段逻辑信道上的虚电路号可能也不相同。传 输中,当一个分组到达节点时,节点根据其携带的虚 电路号查找虚电路表(每个节点必须保持一张虚电路表), 以确定该分组应发往的下一个节点及其在下一段信道 上所占用的虚电路号。用该虚电路号替换分组中原先 的虚电路号后,再将该分组发往下一个节点。 第5章 网络层 各节点的虚电路表是在虚电路建立过程中建立的。 比如,与A节点相连的源端系统要经中间节点B、C跟 与D节点相连的目的端系统建立一条虚电路,源端系统 可发出一个呼叫请求分组,该分组除了包含目的地址 外,还包含源端系统选取的当前未用的最小虚电路号N。 例如,A节点收到请求分组后,在A节点与下一节点B 间所有已使用的虚电路号之外选取一个最小编号NA, 并将请求分组中的逻辑信道N替换成该虚电路号NA, 再将分组发送给节点B。 第5章 网络层 此后的各节点依次逐个根据自身实际情况选取新的虚 电路号(如NB、NC、ND等)来替换收到的分组中的虚 电路号。最后,目的节点D将请求分组传送给与它连接 的端系统。在此过程中,每个节点的虚电路表中要记 录两个逻辑信道:前一个节点所选取的虚电路号和本 节点所选取的虚电路号。这样便使得虚电路所跨越的 每一节点上的虚电路号都是惟一的。 第5章 网络层 图5-1给出了一个虚电路表建立的示例。这里假设 建立了6条虚电路。由于虚电路上的数据是双向传输的, 为保证两节点之间正、反两个方向的虚电路不相混淆, 在一个节点选取虚电路号来替换其前一节点的虚电路 号时,不仅要考虑与该节点下一节点之间的虚电路号 不相同,还要考虑与下一节点作为另一条反向虚电路 时前一节点所选取的虚电路号相区别。例如,在建立 虚电路1-BAE时(这里1-BAE表示源节点为B,建立虚电 路时选取1为虚电路号,并经A传送到E), 第5章 网络层 B ③ ④ ⑥ A 0 H 0 H 1 H 2 C C F 0 1 0 C B 0 A 0 B 1 D 0 D 1 D 2 A 1 A ① ② ⑤ H 0 H 1 B 1 H 2 来路 B 0 C 0 E E 0 1 出路 E A 0 A 1 F 1 H 0 F 0 H 1 ④ 虚 电 路 建 立 顺 序 ① 0-ABCD ② 1-ACD ③ 0-BCD ④ 1-BAE ⑤ 2-AEFD ⑥ 2-BFE D C C C F 0 1 2 0 H 0 H 1 H 2 H 3 ① ② ③ ⑤ F ⑥ E 0 D 0 E 1 B 0 图5-1 虚电路建立示例 第5章 网络层 在节点B中,尽管A节点是第一次作为B节点的下一节 点,但由于虚电路0-ABCD中A到B间已使用了虚电路 号0,因此在出路一栏选B到A间的虚电路号为1。这样, 当从节点A发来一个分组时,若它所携带的虚电路号为 0,则说明是虚电路ABCD上的正向分组;若为1,则 说明是虚电路BAE上的反向分组。对于虚电路2-BFE的 建立也是同样情况。 第5章 网络层 各节点的虚电路表空间和虚电路号都是网络资源, 当虚电路拆除时必须回收。这可通过任何一个端系统 发出一个拆链请求分组,告知虚电路中各节点删除虚 电路表中的有关表项来实现。 虚电路服务是网络层向运输层提供的一种让所有分 组按顺序到达目的端系统的可靠的数据传送方式。进 行数据交换的两个端系统之间存在着一条为它们服务 的虚电路。 第5章 网络层 为了建立端系统之间的虚电路,源端系统的传输层 首先向网络层发出连接请求,网络层则通过虚电路网 络访问协议向网络节点发出呼叫分组;在目的端,网 络节点向端系统的网络层传送呼叫分组,网络层再向 运输层发出连接指示;最后,接收方运输层向发起方 发回连接响应,从而使虚电路建立起来。此后,两个 端系统之间就可以传送数据。数据由网络层拆成若干 个分组送给通信子网,由通信子网将分组传送到数据 接收方。 第5章 网络层 上述虚电路的服务是网络层向运输层提供的服务, 也是通信子网向端系统提供的网络服务。但是,提供 这种虚电路服务的通信子网内部的实际操作既可是虚 电路方式,也可以是数据报方式。以虚电路操作方式 的网络,一般总是提供虚电路服务。OSI中面向连接的 网络服务就是虚电路服务。在虚电路操作方式中,端 系统的网络层同通信子网节点的操作是一致的。 第5章 网络层 以数据报方式操作的网络,也可以提供虚电路服 务,即通信子网内部节点按数据报方式交换数据,而 与端系统相连的网络节点则向端系统提供虚电路服务。 对于端系统来说,它的网络层与节点间通信仍像虚电 路操作方式的网络节点间一样,先建立虚电路,再交 换数据分组,最后拆除电路。但实际上每个报文被网 络节点分成若干个数据报,附加上地址、序号、逻辑 信道等信息分送到目的网络节点。 第5章 网络层 目的网络节点再将数据报进行排序,拼成原来的 分组,送给目的端系统。因此,源端系统和源网络节 点之间、目的网络节点和目的端系统之间的网络层按 虚电路操作方式交换分组,而目的网络节点和源网络 节点之间则按数据报方式完成分组的交换。尽管通信 子网的数据报交换是不可靠的,但是与两端(源端和目 的端)紧邻的网络节点做了许多诸如排序、重发等额外 工作,从而满足了虚电路服务的要求。例如,在 ARPANET中,其内部使用数据报操作方式,但可以向 端系统提供数据报和虚电路两种服务。 第5章 网络层 5.3.2 数据报 在数据报操作方式中,每个分组的传送是被单独 处理的。每个分组称为一个数据报,每个数据报自身 携带足够的地址信息。一个节点收到一个数据报后, 根据数据报中的地址信息和节点所储存的路由信息, 找出一个合适的出路,把数据报原样地发送到下一节 点。由于各数据报所走的路径不一定相同,并且各个 节点是根据当时网络的流量、故障等情况进行路由选 择的,因此不能保证各个数据报按顺序依次到达目的 地,有的数据报甚至会中途丢失。整个过程中,没有 虚电路建立,但是要为每个数据报做路由选择。 第5章 网络层 数据报服务一般仅由数据报交换网来提供。端系 统的网络层同网络节点中的网络层之间,一致地按照 数据报操作方式交换数据。当端系统要发送数据时, 网络层给该数据附加上地址、序号等信息,然后作为 数据报发送给网络节点;目的端系统收到的数据报可 能是不按序到达的,也可能有数据报的丢失。例如, 在ARPANET、DNA等网络中,就提供了数据报服务。 数据报服务与OSI的无连接网络服务类似。 第5章 网络层 由虚电路交换网提供数据报服务的组合方式并不 常见。可以想象有这么一种特殊情况:一个端系统的 网络层已经构造好了用于处理数据报的服务,而当它 要接入以虚电路方式操作的网络时,网络节点就需要 做一些转换工作。当端系统向网络节点发送一个携带 有完整地址信息的数据报时,如果发向同一地址的数 据报数量足够大,则网络节点可以为这些数据报从源 网络节点到目的网络节点间建立一条虚电路,所有具 有相同目的地址的数据报在这条虚电路上传送完时, 这条虚电路便可以拆除。所以,这种数据报服务具有 了虚电路服务的通信质量,但这样做不经济且效率不 高。最明显的例子是在ATM子网上运行IP。 第5章 网络层 5.3.3 虚电路子网和数据报子网的比较 如果两个端系统间要长时间进行数据传输,特别 是在交互式应用中每次传输的数据很短的情况下,使 用虚电路方式可能更加合适些。虚电路方式允许数据 分组只含位数较少的虚电路号,而并不需要完整的目 的地址,从而节省路由器和输入/输出线路的带宽。虚 电路方式的代价是,在中间节点占用用于存放虚电路 表的内存空间。另外,虚电路的建立需要一定的时间, 这个时间主要是用于各个路由器寻找输出线路和填写 虚电路表。但在数据传输过程中,分组的路由选择却 比较简单,仅仅查找虚电路表即可。 第5章 网络层 数据报方式不需要连接建立过程,它传输少数几 个分组时的速度比使用虚电路时要简便灵活得多,每 个数据报根据当时网络的流量等情况来选择路由。每 个节点没有额外的开销,只是每个分组在每个节点都 要进行路由选择,这样会增加分组传输延迟。 第5章 网络层 在通信子网内部,虚电路方式比数据报方式更容 易避免拥塞。这是因为,在虚电路建立好后,可以预 约所需的网络资源。当分组到来时,所需的带宽和网 络节点的存储空间已经预留,可以立即转发。而对于 数据报子网,避免拥塞会更困难些,原因是数据报方 式中的中间节点不存储网络状态信息。 第5章 网络层 虚电路子网一般提供可靠的通信功能,它保证每 个分组按序正确到达。但是,虚电路有它的脆弱性, 当某个网络节点出现故障而崩溃且丢失存储的数据后, 所有经过它的虚电路就会断掉而没法正常工作。网络 节点或通信线路的故障,对于用到它的虚电路来讲是 致命的,但在数据报方式中,这种故障带来的影响要 小得多,只有暂存在该节点上的分组才可能丢失,而 其他分组可以绕过故障到达目的端系统,因此从这点 来说,数据报方式比虚电路方式更健壮些。 第5章 网络层 5.4 路 由 选 择 通信子网为网络源节点和目的节点提供了多条传 输路径的可能性。网络节点在收到一个分组后,要确 定向下一节点传送的路径,这就是路由选择。在数据 报方式中,网络节点要为每个分组路由做出选择;而 在虚电路方式中,只需在建立连接时选择一次路由。 确定路由选择的策略称为路由算法。 第5章 网络层 路由选择算法是网络层软件的一部分。它在路由 协议中起着至关重要的作用,使用何种算法往往决定 了最终的路由结果,因此选择路由算法一定要小心。 不管是数据报方式还是虚电路方式,都希望路由选择 算法具有以下特征: (1) 正确性:指算法本身是正确的并能满足用户业 务需求所要求的数据通信目标。 (2) 简单性:要求路由算法设计简单,利用最少的 软件和开销,提供最有效的功能。 第5章 网络层 (3) 健壮性:路由算法处于非正常或不可预料的环 境时,如硬件故障、负载过高或路由器配置错误时, 都能正确运行,而不会使所有主机中的任务都终止, 也不必重新启动该网络。这要求路由选择算法能妥善 处理各种变化。由于路由器分布在网络连接点上,所 以在它们出故障时会产生严重后果。最好的路由器算 法通常能经受时间的考验,并在各种网络环境下被证 实是可靠的。 第5章 网络层 (4) 公平性:指每个节点发送和接收的机会均等, 这与最优性之间存在矛盾。 (5) 最优性:指路由算法从所有可能的路由中选择 最佳路径的能力,“最优”是相对的。对某种算法采 用不同的标准所获得的最优路由是不一样的。 (6) 灵活性:路由算法可以快速、准确地适应各种 网络环境。例如,某个网段发生故障,路由算法要能 很快地发现故障,并为使用该网段的所有路由选择另 一条最佳路径。 第5章 网络层 (7) 快速收敛:收敛是指,在最佳路径的判断上所 有路由器达到一致的过程。当某个网络事件引起路由 可用或不可用时,路由器就发出更新信息。路由更新 信息遍及整个网络,引发重新计算最佳路径,最终达 到所有路由器一致公认的最佳路径。收敛慢的路由算 法会造成路径循环或网络中断。 第5章 网络层 设计路由算法时要考虑的技术要素有: (1) 选择最短路由还是选择最佳路由。 (2) 通信子网是采用虚电路操作方式还是数据报的 操作方式。 (3) 采用分布式路由算法(网络中所有节点通过相互 交换路由信息,独立地为到达的分组选择下一步的路 由),还是采用集中式路由算法(由中央节点或始发节点 周期性收集各链路状态,经过计算后周期性地向各网 络节点提供路由表,由它来决定整个网络的路由)。 第5章 网络层 (4) 关于网络拓扑、流量和延迟等网络信息的来源。 (5) 是采用静态路由选择策略(也称非自适应算法, 即只在节点或链路故障时才改变网络路由的算法),还 是采用动态路由选择策略(也称自适应算法,即根据网 络拥塞和拓扑结构变化情况,频繁改变路由选择的算 法)。 第5章 网络层 路由选择按不同的算法可以分为许多类型:静态 路由和动态路由、集中路由和分布路由、层次路由和 非层次路由、单路路由和多路路由、域内路由和域间 路由、链路状态路由和距离向量路由等等。 第5章 网络层 目前最常用的路由协议有:路由信息选择协议 RIP(Routing Information Protocol)、内部网关路由协议 IGRP(Interior Gateway Routing Protocol)。外部网关协 议EGP(External Gateway Protocol)、边界网关协议 BGP(Border Gateway Protocol)、开放式最短路径优先 协议OSPF(Open Shortest Path First)和距离矢量组播路 由协议DVMRP(Distance Vector Multicast Routing)等。 第5章 网络层 5.4.1 静态路由选择 静态路由选择算法不检测也不考虑当前的网络拓扑结 构和流量信息,而是按照某种固定规则进行路由选择。 这种策略也称为非自适应算法。路由表是在路由器加电 启动时加载到路由器中的。当一个分组到达某网络节点 (即路由器)时,节点只根据分组上的地址信息从固定路由 表中找出对应的目的地节点和应选择的下一节点。所以, 静态路由的路由表信息是手工管理的。最初是由网络管 理员将它输入到路由器的配置中,当网络拓扑结构等发 生改变而需要更新路由时,还需由网络管理员手工更新 路由信息。在静态路由算法中,有最短路由选择算法、 扩散法和基于流量的路由选择算法等。 第5章 网络层 1. 最短路由选择法 最短路由选择法是一种使用较多的简单算法。在 每个网络节点都存储一张表格,表格中每一项记录着 对应某个目的节点的下一节点或链路。当一个分组到 达某节点时,该节点只要根据分组上的地址信息,便 可从固定的路由表中查出对应的目的节点及所应选择 的下一节点。网络中一般都有一个网络控制中心,由 它按照最佳路由算法求出每对源—目的节点的最佳路 由,然后为每一节点构造一个固定路由表并分发给各 个节点。 第5章 网络层 计算最短路径的算法有多种,如Dijkstra算法、 Bellman-Ford算法和Floyd-Warshall算法等。下面将简 单介绍一下Dijkstra算法。 Dijkstra 算 法 有 时 也 称 为 最 短 路 径 算 法 (SPA , Shortest Path Algorithm ) 或 正 向 搜 索 算 法 (Forward Search Algorithm)。通常使用Dijkstra算法计算从源节点 到其他各节点的最短路径,它是利用边的权值来计算 的。权值又可以用路径长度、传输延迟、信道带宽、 负载和通信开销等项计算出来。为了在计算最短路径 的过程中构造路由表,对每个节点上的每个路由表都 要用Dijkstra算法计算一次。另外,Dijkstra算法既可作 为静态路由算法,也可作为动态路由算法。 第5章 网络层 用 来 计 算 路 由 表 项 的 软 件 把 网 络 看 成 一 张 图。 Dijkstra算法由于能用来计算各种意义的最短路径而得 到广泛应用。特别是它不要求图中的边代表地理距离, 允许为每条边赋予一个非负值,称之为权值(Weight), 并将两站点之间的距离定义为沿该两点间路径的权值 之和。值得注意的是:Dijkstra算法利用边的权值作为 距离度量来计算图中的最短路径,边数最少的路径不 一定有最小权值。 第5章 网络层 图5-2通过一条最短路径的例子来说明这个概念。 Dijkstra算法的基本原理并不复杂。算法建立一个站点 的集合S,最短距离和下一站尚未计算。最初S包含有 除源点外的所有站点,算法开始循环。每次循环时都 从S中取出并删除一个与源点之间有最短路径的站点。 当它删除站点u时,检查从源点到集合中剩下的每 个与u相邻的站点的距离。如果从源点通过u到某站点 的权值和比当前的数值小,则更新该值。当所有站点 都从S中删去后,就能计算出到每个站点的最短距离, 一张正确的下一站路由表就建成了。 第5章 网络层 1 2 3 3 11 4 9 6 8 2 5 3 5 6 7 图5-2 节点5,4之间的最短路径用粗线表示 第5章 网络层 Dijkstra算法的实现是很直观的。除了用来存储图 信息的数据结构外,算法还需要三种数据结构:到每 个站点的当前距离,最短路径的下一站,有关剩余站 点的信息。如图5-2中所示,以数字1~n来表示站点, 这样使得算法的实现比较高效,因为表示站点的数字 可用来作为数据结构的索引。特别是算法使用两个数 组D和R,每个站点都各有一项,使用站点数作为索引。 数组D的第i项存储从源点到站点i的当前最短距离,数 组R的第i项存储沿所计算路径可到站点i的下中跳。 第5章 网络层 集合S 保存有站点数的双重链接,用以搜索整个集 合或删除一个项。 下面的算法用weight(i,j)函数返回站点i到站点j的 边的权值,如果从站点i到站点j没有边,则weight函数 返回一个保留值infinity。实际上可用图中大于任何路 径权值和的数值来表示无穷大(infinity),得到无穷大值 的一个方法是把所有边的权值相加后再加1。 第5章 网络层 给定:一张指定了源点并为每条边赋以一个非负 权值的图。 计算:从源点到其他每个站点的最短距离和下一 站路由表。 方法:初始化集合S,包含除源点外的所有站点; 初始化数组D,如果从源点到v有边存在,则D[v]为该 边的权值,否则为infinity;初始化数组R,如果从源点 到v有边存在,则R[v]为源点,否则为0; 第5章 网络层 While(集合S非空) { 从S中选择一站点u,此D[u]是最小的; 如果(D[u]是infinity ){ 错误:S中无路径存在;退出; } 把u从S中删去; 对(u,v)是边的每个站点v{ 如果(v仍在S中){ 第5章 网络层 c=D〔u〕+ weight(u,v); 如果(c