第五章:网络层
网络层关注的是如何将源端数据包一路送到接收方.为了将数据包送到接收方,可能 沿途要经过许多跳(hop)中间路由器。这种功能显然与数据链路层的功能不同,数据链路层的目标没那么宏伟,只是将帧从线路一边传送到另一边。因此, 网络层是处理端到端数据传输的最底层。
为了实现这个目标, 网络层必须知道网络拓扑结构〈即所有路由器和链路的集合〉,并从中选择出适当的路径,即使是大型网络也要选出一条好路经。同时,网络层还必须仔细选择路由器,避免某些通信线路和路由器负载过重,而其他线路和路由器空闲。最后,当源端和接收方位于不同网络时,还会出现新的问题,这些问题都需要由网络层来解决。在本章,我们将讨论所有这些问题,并主要结合 Internet 及其网络层协议(IP)来深入探讨。
网络层的主要功能
1.异构网络互联
2.路由选择和分组转发
3.拥塞控制
网络层设计时的问题
1.存储转发数据包交换
网络中最主要的组件是网络服务提供商 (ISP)的设备(通过传输线路连 接的路由器〉和客户端设备,在图中 ISP 的设备位于阴影椭圆内,而客户设备位于椭圆之 外。
这种网络配置的使用方式如下所述.如果一台主机要发送一个数据包,它就将数据包传输给最近的路由器,路由器可能在它自己的 LAN 上,也可能在一条通向 ISP 的点到点链 路上。在该数据包到达路由器,并且路由器的链路层完成了对它校验和的验证之后,它先被存储在路由器上:然后沿着路径被转发到下一个路由器,直至到达目标主机,这里就是数据包的目的地。这种机制即为存储—转发数据包交换,正如在前面几章已经看到的那样。
2.提供给传输层服务
网络层通过网络层/传输层接口向传输层提供服务。
在设计网络层服务时,一定要牢记下面这些目标:
(1 )向上提供的服务应该独立于路由器技术。
(2)应该向传输层屏蔽路由器的数量、类型和拓扑关系。
(3 )传输层可用的网络地址应该有一个统一编址方案,甚至可以跨越 LAN 和 WAN。
给定这些目标后,网络层设计者有很大的自由度来编写提供给传输层的详细服务规范。 这种自由度通常演变为两个竞争派别之间的激烈争斗。最终讨论的焦点集中在网络层应该 提供面向连接的服务还是提供无连接的服务。
路由算法
路由算法可以分成两大类: 非自适应算法和自适应算法。
非自适应算法(nonadaptive algorithm)不会根据当前测量或者估计的流量和拓扑结构,来调整它们的路由决策。
从 I 到 J (对所有的 I 和 J) 所使用的路由选择是预先在离线情况下计算好,并在网络启动· 时被下载到路由器中的。这个过程有时候也称为静态路由(static routing)。因为它无法响 应故障,所以静态路由对于路由选择已经很清楚的场合非常有用。
与此相反,自适应算法(adaptive algorithm)则会改变它们的路由决策以便反映出拓扑 结构的变化,通常也会反映出流量的变化情况。
这些动态路由(dynamic ronting)算法在多 个方面有所不同:获取信息的来源不同〈例如,来自于本地、相邻路由器, 或者所有的路 由器〉、改变路径的时间不同(比虫日,·每当拓扑发生变化时,或者每隔 .M 秒随负载变化〉 以及用于路由优化的度量不同(比如,距离、跳数或者估计的传输时间〉。
我们在这里描述的所有路由算法都基于拓扑结构进行路由决策。
优化路径:
这个论述称为最优化原则( optimality principle ) (Bellman, 1957)。最优路径的一般陈述如下z 如果路由器 J 在从路由器 I 到路由器K 的最 优路径上,那么从 J 到 K 的最优路径也必定遵循同样的路由。
1. 最短路径算法
最短路径(shortest path)概念:
1.一种测量路径长度的方法是跳数。
2.另一种度量是以千米为 单位的地理距离,
Dijkstra 算法
2. 泛洪算法
在实现路由算法时,每个路由器必须根据本地知识而不是网络的全貌做决策。一个简 单的本地技术是泛洪(flooding),这种技术将每一个入境数据包发送到除了该数据包到达 的那条线路以外的每条出境线路。
很显然,泛洪法会产生大量的重复数据包。事实上,除非采取某些措施来抑制泛洪过 程,否则将会产生无限多的数据包。其中一项措施是在每个数据包的头中设置一个跳计数 器,每经过一跳该计数器减一,当计数器到达 0 时就丢弃该数据包。理想情况下,跳计数 器的初始值应该等于从源端到接收方之间路径的长度。如果发送方不知道该路径有多长, 它可以将计数器的初始值设置为最坏情形下的长度,即网络的直径。
发送大多数数据包来说,泛洪算法是不切实际的,但它确实有一些重要的用途。
1.首先,它确保数据包能被传送到网络中的每个节点,对于广播信息来说,这是一种有效的广播手段。
2。其次,泛洪途径的鲁棒性非常好。即使大量路由器被炸成碎片(例如,位于战争地区 的一个军事网络〉,泛洪也能找到一条路径(如果存在〉,使得数据包到达目的地。
而且,泛洪能并发选择每一条可能的路径,因此总能选出最短的那条路径, 没有其他算法能够产生一个更短的延迟(如果我们忽略泛洪过程本身产生的开销〉。
3. 距离矢量算法
计算机网络通常使用动态路由算法。
特别地,两个动态算法最为流行,即距离矢量路由算法和*链路状态路由算法。
距离矢量路由(distance vector routing)算法是这样工作的z 每个路由器维护一张表(即 一个矢量〉,表中列出了当前己知的到每个目标的最佳距离,以及所使用的链路。这些表通过 邻居之间相互交换信息而不断被更新,最终每个路由器都了解到达每个目的地的最佳链路。
在距离矢量路由算法中,每个路由器维护一张路由表,它以网络每个路由器为索引, 并且每个路由器对应一个表项。该表项包含两部分:到达该目标路由器的首选出境线路, 以及到达该目标路由器的距离估计值。距离的度量可能是跳数,或者其他因素。
想象一个路由器接收了来自邻居 X 的一个表, 其中 xi表示邻居X估计的到达路由器i 所需要的时间。如果该路由器知道它到 邻居 X 的延迟为 m 毫秒,那么它也能明白在Xi+m 毫秒之内经过X可以到达路由器 i。对 每个邻居都执行这样的计算,最终可以发现到每个目标的最佳估计值,然后在新的路由表 中使用这个最佳估计值以及对应的出境线路。
无穷计算问题
整个网络最佳路径的寻找过程称为收敛(convergence)。
距离矢量路由算法有一个严重的缺陷:
它对于好消息的反应非常迅速,而对于坏消息的反应异常迟缓。
这个问题称为无穷计数(count-to-infinity)问题。
4. 链路状态路由
1979 年以前 ARPANET 一直使用距离矢量路由算法,而在此之后则改为使用链路状态 路由算法。导致距离适量算法退位的主要问题在于,当网络拓扑结构发生变化后距离矢量 路由算法需要太长时间才能收敛到稳定状态(由于无穷计数问题)。因此,距离矢量路由算 法被一个全新的算法所替代,该算法称为链路状态路由算法(link state routing)。今天,链 路状态路由算法的变种算法--一IS-IS 或者 OSPF 己经成为大型网络或 Internet 应用最为广 泛的路由算法。
链路状态路由算法的设计思想非常简单,可以用五个部分加以描述。每一个路由器必 须完成以下的事情,算法才能正常工作:
( l )发现它的邻居节点,并了解其网络地址。
(2)设置到每个邻居节点的距离或者成本度量值。
(3)构造一个包含所有刚刚获知的链路信息包。
(4)将这个包发送给所有其他的路由器,并接收来自所有其他路由器的信息包。
(5)计算出到每个其他路由器的最短路径。
实际上,算法将完整的拓扑结构分发给了每一个路由器。然后每个路由器运行 Dijkstra 算法就可以找出从本地到每一个其他路由器的最短路径。
-
发现邻居
为了实现这个 目标,它只需在每一条点到点线路上发送一个特殊的 HELLO 数据包。线路另一端的路由 器应该返回一个应答说明自己是谁。这些名字必须是全局唯一的,因为当一个远程路由器 以后昕到有三个路由器都能连接到 F 时,它必须能够确定这三个路由器所提到的 F 是同一 个路由器 F。 -
设置链路成本·
为了寻找最短路径,链路状态路由算法需要每条链路以距离或成本度量。到邻居的成 本可自动设置或由网络运营商配置的度量。一种常用的选择是使成本与链路带宽成反比。 例如, lGbps 以太网的成本可能是 l ,而 100 Mbps 以太网的成本可能是 10。这样可以使得 高容量的路径成为路由更好的选择。 -
构造链路数据包
一旦收集到了所需要的交换信息,每个路由器的下一步工作是构建一个包含所有这些 信息的数据包。该数据包的内容首先是发送方的标识符,接着是一个序号( Seq)和年龄 (Age,后面再介绍),以及一个邻居列表。
-
分发链路状态包
链路状态路由算法最技巧的部分在于分发链路状态数据包。所有路由器必须快速并可 靠地获得全部的链路状态数据包。如果不同的路由器使用了不同版本的拓扑结构,那么它 们计算出来的路由可能会不一致,例如出现环路、目标机器不可达以及其他的问题。
首先,我们描述最基本的发布算法,然后再对它进行改进。
基本思路是使用泛洪法将 链路状态数据包分发给所有路由器。为了控制泛洪规模,每个数据包都包含一个序号,序号随着每一个新数据包发出而逐一递增。
路由器记录下它所看到的所有(源路由器、序号〉 对。当一个新的链路状态数据包到达时,路由器检查这个新来的数据包是否己经出现在上 述观察到的列表中。如果这是一个新数据包,则把它转发到除入境线路之外的所有其他线 路上。如果这是一个重复数据包,则将它丢弃。
如果数据包的序号小于当前所看到过的来 自该源路由器的最大序列号,则它将被当作过时数据包而拒绝接受,因为路由器己经有了 更新的数据。
这个算法还有几个问题有待处理,不过,这些问题都是可管理的。
第一,如果序号绕 回,可能会产生混淆。这里的解决方案是使用一个 32 位的序号。即使每秒钟产生一个链路 状态数据包,也需要 137 年才可能发生绕回,所以,这种可能性可以忽略不计。
其次,如果一个路由器崩溃了,那么它将丢失所有的序号记录表。如果它再从 0 开始, 那么,下一个数据包将被作为重复数据包而拒绝。
再次,如果一个序号被破坏了,比如发送方发送的序号为 4,但是由于产生了 1 位错 误,所以接收方看到的序号是 65 540,那么,序号从 5 到 65 540 的数据包都将被当作过时 数据包而拒绝接受,因为接收方认为当前的序号是 65 540 。
所有这些问题的解决方案都一样z 在每个数据包的序号之后包含一个年龄(age)宇段, 并且每秒钟将年龄减 1。当年龄宇段的值被减到 0 时,来自路由器的该信息将被丢弃。通 常情况下,每隔一段时间,比如说 10 秒,一个新的数据包就会到来:所以,只有当一个路 由器停机时(或者 6 个连续的数据包被丢失,这种情形发生的可能性不大),路由器信息才 会超时。在初始泛洪过程中,每个路由器也要递减 age 宇段,这样可以确保没有数据包丢 失,也不会无限制生存下去(如果一个数据包的 age 为 0,则被丢弃〉。
- 计算新路由
一旦路由器己经积累了全部的链路状态数据包之后,它就可以构造出完整的网络图, 因为每条链路都己经被表示出来了。事实上,每条链路被表示了两次,每个方向各表示一 次。不同方向的链路可能有不同的成本。最短路径计算可找到从 A 到 B 与从 B 到 A 不同 的路径。
链路状态路由算法被广泛地应用于实际网络中,所以现在提一下某些使用该算法的例
子。许多 ISP 使用中间系统到中间系统 CIS-IS, Intermediate System-Intermediate System) 链路状态协议(Oran, 1999),它是专门为 DECnet 而设计的,后来被 ISO 采纳用于 OSI 协议:自此以后,它被作了多次修改以便能够处理其他的协议,例如最著名的F协议。开 放最短路径优先 C OSPF, Open Shortest Path First)是另一个主流链路状态协议。它是在 IS-IS 之后几年由 IEπ 设计的,而且它吸收了 IS-IS 的许多创意。这些创意包括:一种泛洪链路 状态更新的自稳定方法、 LAN上的指定路由器概念以及计算和支持路径分裂和多个度量的 方法。因此, IS-IS 和 OSPF 之间的差异非常小。其中一个最重要的差别是, IS-IS 可同时 携带多个网络层协议的信息(比如, IP、 IPX 和 AppleTalk), OSPF 不具备这个特性。
5. 层次路由
随着网络规模的增长,路由器的路由表也成比例地增长.不断增长的路由表不仅消耗 路由器内存,而且还需要更多的 CPU 时间来扫描路由表以及更多的带宽来发送有关的状态 报告。当网络增长到一定时可能会达到某种程度,此时每个路由器不太可能再为其他每一 个路由器维护一个表项。所以, 路由不得不分层次进行。
在采用了分层路由之后,路由器被划分成区域(region)。
每个路由器知道如何将数据 包路由到自己所在区域内的目标地址,但是对于其他区域的内部结构毫不知情。当不同的 网络被相互连接在一起,很自然地就会将每个网络当作一个独立的区域,一个网络中的路 由器不必知道其他网络的拓扑结构。
对于大型网络,两级的层次结构可能还不够:可能有必要将区域组织成簇(cluster) , 将簇组织成区(zone),将区组织成群(group),等等。
不幸的是,这种空间的节省不是免费得来的,它需要付出代价,其代价的形式是增加 了路径长度。例如,从 lA 到 5C 的最佳路径是经过区域 2,但采用了层次路由之后,所有 到区域 5 的流量都要经过区域 3,因为对于区域 5 中的大多数目标来说这是更好的选择。
当单个网络变得非常大时,一个有趣的问题是“应该分多少层?”。
例如,考虑一个具有 720 个路由器的子网。如果没有分层,每个路由器需要 720 个路由表项:如果子网被分 成 24 个区域,每个区域 30 个路由器,那么每个路由器只需要 30 个本地表项,加上 23 个 远程表项,总共 53 个表项:如果采用三级层次结构,总共 8 个簇,每个簇包含 9 个区域, 每个区域 10 个路由器,那么,每个路由器需要 10 个表项用于记录本地路由器, 8 个表项 用于到同一簇内其他区域的路由, 7 个表项用于远程的簇,总共 25 个表项。(Kamoun 和 Kleinrock, 1979)发现,对于一个包含N 个路由器的网络,最优的层数是 h N,每个路由 器所需的路由器表项是 eln N 个。他们还证明了,由于分层路由而导致的平均路径长度的 实际增长非常小,通常是可以接受的。
6. 广播路由
- 一种不要求网络具有任何特殊性质的广播方法是让源机器简单地给每一个目标单独发 送一个数据包。这种方法不仅浪费带宽,而且还要求源机器拥有所有目标机器的完整地址 列表。
- .一种改进方法称为多目标路由(multidestination routing).
- 我们早就看到了更好的广播路由技术一一唱泛洪。当每个源实现了序号,泛洪能有效地 利用链路,而且路由器要做的决策相对地简单。虽然泛洪方法不适合普通的点到点通信, 但它被认为值得考虑用作广播。
- 逆向路径转发(reverse path 岛附缸ding)思想一经提出就获得了关注,它被认为是一种 既优雅又相当简单的广播技术。
当一个广播数据包到达一个路由器时,路由器检查它到来 的那条线路是否正是通常用来给广播源端发送数据包用的那条线路。如果是,说明这是一 个极好的机会,该广播数据包是沿着最佳路径被转发过来的,因而是到达当前路由器的第 一份副本。如果是这种情况,则路由器将该数据包转发到除了到来的那条线路之外的所有 其他线路上。然而,如果广播数据包是从其他任何一条并非首选的到达广播源的线路入境 的话,该数据包被当作一个可能的重复数据包而丢弃。
7. 组播路由
生成树修剪
8. 移动主机路由
这些移动主机引入了新的复杂性: 路由一个数据包到移动主机,网络 首先要找到该主机。
我们将考虑的模型世界中,假设所有主机都有一个永久的家乡位置(home location ), 该位置永远不会改变。
每个主机也有一个永久的家乡地址 C home address),用来确定其家 乡位置。家乡地址有点类似于电话号码,比如 1-212-5551212 表明这个号码在美国(国家 代码。的曼哈顿地区(212)。移动主机所在系统的路由目标是使人们有可能利用固定的 家乡地址来发送数据包,无论他们在哪里都能有效地把数据包送到。当然,这里的关键是 要找到他们。
一种不同的模型是每当移动主机移动, 以及拓扑发生变化后就重新计算路由。
另一种方法是在网络层之上提供移动,这就是今天笔记本电脑典型的用法。当它们被
转移到新的 Internet 位置,笔记本电脑就获得一个新的网络地址。这里新老地址之间不存 在任何关联:网络也不知道它们属于同一台笔记本电脑。
Internet 和蜂窝网络的移动路由采用的基本想法是移动主机把当前自己在哪里告诉给家乡位置的一台主机。这台主机称为家乡代理 ( home agent),它将以移动主机的名义采取 行动。 一旦它知道移动主机的当前位置,它就可以转发数据包以便数据包传递给移动主机。
本地 地址称为转交地址(care of address )。一旦移动主机有了这个地址,它可以告诉其家乡代理 它现在哪儿。它给家乡代理发送一个带有转交地址的注册消息〈第 1 步〉。该消息用图 5-19 中的虚线表示,以表明它是一个控制信息而不是一个数据报文。
接下来,发送者使用其永久地址发送一个数据包给移动主机(第 2 步〉。这个数据包被 网络路由到主机的家乡位置,因为这是主机家乡地址的所属地。在纽约,家乡代理截获该数据包,因为移动主机己经离家:然后用一个新的头包裹或者封装 (encapsulated)该数据包,并把捆绑后的结果发送给转交地址(第 3 步〉。这种机制称为隧道(tunneling)。
当封装后的数据包到达转交地址,移动主机解开它并提取出来自发送者的数据包:然 后移动主机直接给发送者发应答数据包(第 4 步〉。整个路由过程称为三角路由(triangle routing),因为如果远程位置离家乡位置很远时,这条路由可能是迁回的。
拥塞控制算法
(一部分)网络中存在太多的数据包导致数据包被延迟延迟和丢失,从而降低了传输’性 能,这种情况称为拥塞(congestion)。
网络层和传输层共同承担着处理拥塞的责任。由于 拥塞发生在网络内,正是网络层直接经历着拥塞,而且必须由它最终确定如何处理过载的 数据包。
然而,控制拥塞的最有效方法是减少传输层注入网络的负载。这就需要网络层和传输层共同努力协同工作。
图 5-21 描给了拥塞的发生。当主机发送到网络的数据包数量在其承载能力范围之内时, 送达的数据包数与发送的数据包数成正比例增 长。如果发送量增加了两倍,则送达量也增长 了两倍。然而,随着负载接近承载能力,偶尔 ,宗 突发的流量填满了路由器内部的缓冲区,因而某些数据包会被丢失。这些丢失的数据包消耗 自 了部分容量,因此,送达的数据包数量低于理想曲线。网络现在开始拥挤了。
除非网络是精心设计的,否则它极有可能 会遭遇拥塞崩溃 ( congestion collapse),
表现为 随着注入负载的增加到超出网络的容量,网络负载(包/秒) 图 5-21 太多的流量导致性能急剧下降。
我们想设计出这样的网络:首先尽可能地避免产生拥挤,其次如果它们确实变得拥挤 时不会道遇拥塞崩溃。不幸的是,拥塞不能完全避免。如果突然间,从三四条线路入境的 数据包流都需要转发到相同的输出线路,则会形成一个队列。如果没有足够的内存来容纳 所有这些数据包,数据包将被丢弃。为路由器添加更多的内存可以缓解这一点,但(Nagle, 198T)认识到如果路由器拥有无限内存,拥堵情况将更加恶化而不是缓解。这是因为当数 据包排到队列前面时,它们早己经超时(重复地)并且它们的副本也己经发送。这样使得 事情变得更糟,而不是更好一一最终导致拥塞崩惯。
低带宽链路或者处理数据包速度比线路速率还低的路由器也会变得拥挤不堪。在这种 情况下,把一些流量导出瓶颈区域指向网络的其他部分可以改善这种拥塞状况。然而,最终网络的所有地区都将出现挤塞。在这种情况下,没有什么办法,只好卸下负载或建立一 个更快的网络。
值得指出的是拥塞控制和流量控制之间有很大的差异,它们之间的关系非常微妙。
拥塞控制的任务是确保网络能够承载所有到达的流量。这是一个全局性的问题,涉及各方面的行为,包括所有的主机和所有的路由器。
与此相反,流量控制只与特定的发送方和特定的接收方之间的点到点流量有关。它的任务是确保一个快速的发送方不会持续地以超过接 收方接收能力的速率传输数据。
拥塞的出现意味着负载(暂时)大于资源(在网络的一部分〉可以处理的能力。
很自然人们能想到两个解决方案:增加资源或减少负载。如图 5-22 所示,这些解决方案通常应 用在不同的时间尺度上,要么预先避免拥塞,要么一旦发生拥塞随之做出反应。
避免拥塞的最基本方法是建立一个与流量匹配良好的网络。如果存在一条低带宽的链 路,大多数流量所走的路径都要经过这条链路,那么发生拥塞的可能性非常大。有时当出 现严重拥塞时,可以动态增加网络资源,例如,把通常只用来备份的路由器或线路〈使系统容错〉打开,或者在公开市场上购买带宽。更多的时候,经常大量使用的链路和路由器 都尽早实行升级。这就是所谓的供给(provisioning),在长期流量趋势推动下大约需要儿个 月的时间。
1. 流量感知路由
我们考查的第一种方法是流量感知路由。
我们在 5.2 节看过的路由方案采用固定链路 权重。这些方案能适应拓扑结构的变化,但不能适应负载的变化。在计算路由时考虑链路 负载的目的是把热点地区的流量转移出去,而热点地区是指网络中体验到拥塞的第一位置。 最直接的方式是把链路权重设置成一个(固定)链路带宽、传输延迟,(可变)测量负 载或平均排队延迟的函数。
在所有其他条件都相同的情况下,最小权重的路径更青睐那些轻负载的路径。
如果忽略负载,只考虑带宽和传输延迟,这个问题就不会发生。尝试在路由权重中包 括负载但将其限定在一个狭窄的范围可减缓路由振荡。两种技术有助于获得成功的解决方案。
首先是多路径路由,即从源到目的地可以存在多条路径。在我们的例子中,这意味着 可以把整个流量分散到东部和西部的两条链路上。
第二个技术是把流量慢慢迁移,足够慢到路由算法得到收敛,比如(Gallagher, 1977)方法。
由于存在这些困难, Internet 路由协议通常不依赖于负载来调整自己的路由。相反,在路由协议外部通过慢慢改变它的输入来调整路由。这种方法就是所谓的流量工程(traffic engineering )。
2. 准入控制
一种广泛应用于虚电路网络,防止出现拥塞的技术是准入控制(admission control )。 其基本思想非常简单:除非网络可以携带额外的流量而不会变得拥塞,否则不再建立新的 虚电路。因此,任何建立新的虚电路的尝试或许会失败。这种方法比起那种让更多的人进 入一个己经繁忙的网络更好,因为更多的人只会使情况变得更糟糕。类似地,在电话系统 中,当一台交换机实际超载时,它也会采用准入控制的方法,不再送出拨号音。
这种方法的诀窍是当一条新的虚电路将导致拥塞时如何工作。这项任务在电话网络中 比较简单,因为电话呼叫所需的带宽固定(64 kbps 的无压缩音频〉。然而,计算机网络中 的虚拟电路有各种形状和大小。因此,如果我们想要采用准入控制,必损归纳出虚电路的 一些流量特性。
流量往往用其速度和形状来描述。如何以一种简单而又有意义的方式来描述流量是困 难的,因为流量呈现突发性一一平均速率只讲述了故事的一半。例如,浏览网页时的流量 变化很大,比具有固定长期吞吐量的流式电影更难以处理,因为突发性的网页流量更容易 墙塞住网络中的路由器。捕获这个效果通常采用的描述符是漏桶 (leaky bucket)或令牌桶 (token bucket) ,一个漏桶有两个参数约束了平均速率和瞬时突发流量大小。由于漏桶被广 泛应用于服务质量,我们将在 5.4 节仔细描述它。
准入控制还可以和流量感知路由相结合,在虚电路建立过程中,考虑绕开流量热点区 域的路由。
如图 5-24 Cb)所示,去掉拥塞的路由器和它们所有的线路。图中的虚线显示了一 条可能的虚电路路径,它避开了拥塞的路由器。(Sha抽等, 1999)给出了这类负载敏感的路由方案设计。
3.流量调节
首先,路由器必须确定何时快要接近拥塞,最好在拥塞发生之 前能确定。为此,每个路由器可连续监测它正在使用的资源。三种可能的资源分别是
- 输出线路的利用率、
- 在路由器内缓冲的排队数据包,
- 以及由于没有足够的缓冲而丢失的数据包 数量。在这些可能性中,第二个是最有用的。
平均利用率并没有直接考虑大多数流量的突 发一50%的利用率对平滑流量来说或许很低,但对于变化很大的流量来说就太高了。丢失数据包的计数来得太迟。在数据包丢失时拥塞早就己经形成。
路由器内部的排队延迟直接捕获了数据包经历过的任何拥塞情况。它在大部分时间应 该很低,但当有一个突发流量产生积压时会跳跃。为了维持良好的排队延迟估计 d,假设 s 表示瞬时队列长度的样值,则 d 可定期生成,并按如下方式进行更新。
其中常数 α 决定路由器多快忘记最近的历史。这就是所谓的指数加权移动平均
(EWMA, Exponentially Weighted Moving Average)。它能平滑流量的波动,相当于一个低 通滤波器。每当 d 升高到某个阔值之上,路由器就要注意开始拥塞了。
要考虑的第二个问题是,路由器必须及时把反馈信息传递给造成拥塞的发送方。拥塞 是网络的一种体验,但缓解拥塞则需要使用网络的发送方采取行动。为了传递反馈信息, 路由器必须标识适当的发送方:然后提醒它们小心谨慎,别向本己拥挤的网络发送更多的 数据包。不同的方案使用不同的反馈机制,我们马上对此分别描述。
1.抑制包
通知拥塞发送方的最直接方式是直接告诉发送方。在这种方法中,路由器选择一个被 拥塞的数据包,给该数据包的源主机返回一个抑制包(choke packet)。抑制包中的目标地 址取自该拥塞数据包。同时,在原来的拥塞数据包上添加一个标记(设置头部中的一位),因而它在前行的路径上不会产生更多的抑制包。除此以外,数据包的转发过程如同平常一样。
当源主机收到了抑制包,按照要求它必须减少发送给指定目标的流量,比如说减少50%。在数据报网络中,发生拥塞时路由器简单地随机选择一个数据包,很有可能就把抑 制包发给了快速发送方,因为发送方的速度越快,它的数据包排队在路由器队列中的数 目就越多。这个协议隐含的反馈有助于防止拥塞,但又不会抑制任何发送方,除非真的 发生了拥塞。出于同样的原因,很可能多个抑制包被发送到了一个给定的主机和目的地。 主机应该忽略掉在固定时间间隔内到达的这些额外抑制包,直至其减缓流量的行为产生 了效果。超过这个固定的时间间隔,从路由器进一步反馈来的抑制包则指出网络仍然处 于拥塞状态。
2. 显式拥塞控制
除了生成额外的包发出拥塞警告外,路由器可以在它转发的任何数据包上打上标记(设置数据包头的某一个标志位)发出信号,表明它正在经历着拥塞。当网络传递数据包时, 接收方可以注意到有个拥塞己经发生,在它发送应答包时顺便告知发送方。然后发送方可 以像以前那样紧急刹车降低传输速率。
这种设计方案称为显式拥塞通知(ECN, Explicit Congestion Notification),且己被用在Internet 上(Ramakrishnan 等, 2001 )。这是早期拥塞信令协议的细化,尤其是对二进制反 馈方案(Ramakrishnan 和 Jain, 1988)的细化,该方案曾经用在 DEC阳T 体系结构。 IP 数 据包头中的两位用来记录数据包是否经历了拥塞。数据包从源端发出时没有标记,如图 5-25 所示。如果它们通过的任何一个路由器正经历着拥挤,该路由器在转发数据包时将其标记 为经历拥塞:然后接收方在它的下一个应答数据包里回显该标志作为显式拥塞信号。这显 示为图中的一条虚线,它表明在 IP 层以上(如在 TCP)。发送方必须紧踩油门控制传输, 如同采用抑制包的情况。
3. 逐跳后压
当网络速度很高或者距离很远时,由于传播延迟的缘故,拥塞信号发出后到它产生作 用这期间又有许多新的数据包己经被注入到网络。
例如,请考虑这样的情形z 旧金山的一 台主机(图 5-26 中的路由器 A)正在给纽约的一台主机(图 5-26 中的路由器 D)发送数 据,速度为 OC-3 的 155 Mbps。如果纽约的主机现在用完了缓冲空间,它将花 40 毫秒的时 间才能将抑制包发回给旧金山主机,告诉它降低传输速度。如果采用 ECN 指示,则需要更长的时间,因为抑制消息通过接收方传递。
抑制包的传播过程如图 5-26 (a)中的第二 3 、 4 步所示。在这 40 毫秒期间, A 又给D 发送了 6.2 Mb 的数据。即使旧金山的主机立刻停 机,传输管道里的 6.2 Mb 数据也将连续倾入网络,而且网络必须要对它们进行处理。只有 在图 5-26 (a)的第 7 个图中,纽约的路由器才会注意到数据包流减慢了。
另一种办法是让抑制包在沿途的每一跳都发挥作用,如图 5-26 (b)中的序列所示。在 这里,只要抑制包到达 F,则 F 必须按照要求减慢发给D 的数据包流。这样做的结果是要 求 F 为 D 的数据包流分配更多的缓冲区,因为源主机仍然在全速发送数据,但是 F 这么做 却让 D 立刻得到缓解,就好像电视广告中的头痛疗法一样。在下一步,抑制包到达E,它 告诉 E 减慢给F 的数据包流。这一行动给E 的缓冲区带来更大需求,但是却让F 立即得到 缓解。最后,抑制包到达 A,数据包流才真的减慢下来。
这种逐跳方案的实际效果是拥塞点上的拥塞现象很快得到了缓解,但是其代价是上游路径需要消耗更多的缓冲区空间。使用这种方法可以将拥塞消灭在萌芽状态,而不会丢失任何数据包。
4. 负载脱落
当以上任何一种方法都无法消除拥塞时,路由器可以亮出它的杀手铜,即负载脱落。
**负载脱落 (load shedding)**是一种富有想象力的说法,它指当路由器因为来不及处理数据包 而面临被这些数据包淹没的危险时,就将它们丢弃。此术语来源于电力发电领域,在炎热 的夏日,当电力需求超过了供电能力,为了避免电力系统崩溃而有意切断某些特定区域的 电力供给。
对于一个被数据包淹没的路由器来说,关键的问题是选择丢弃哪个数据包。首选的方 案可能取决于使用网络的应用程序类型。对于文件传输,旧的数据包价值要高于新的数据 包。这个原因我们可以用一个例子加以说明。如果丢弃数据包 6,而保持数据包 7~10,只 会迫使接收方做更多的工作来缓冲它已经接收但尚不能使用的数据。相比之下,对于实时 媒体流,新的数据包价值超过老的数据包。因为如果数据包被延迟并且错失了给用户的播 放时间,那么该数据包就变得一无所用。
前一种策略(即旧的比新的好〉通常称为葡萄酒(wine)策略,而后一种策略〈即新 的比旧的好〉通常称为牛奶(milk)策略,因为大多数人更愿意饮用新鲜牛奶和品尝陈年葡萄酒。
更智能的卸载方式需要发送方的合作。 一个例子是携带路由信息的数据包。这些数据 包比普通数据包要重要得多,因为它们是被用来建立的路由:如果丢失它们,或许就会丢 失网络连接。另一个例子是视频压缩算法,如 MPEG,这些算法定期发送全帧,然后发送 一系列与上一个全帧的差异帧。在这种情况下,应该优先丢弃那些属于差异帧的数据包, 而不能丢弃属于全帧的数据包,因为未来数据包的工作依赖于它们之前的那个全帧。
为了实现智能丢弃政策,应用程序必须在它们的数据包上打上标记,指示网络它们有 多重要。然后,当不得不丢弃数据包时,路由器可以首先丢弃重要性最轻一类数据包,然 后是次重要一类数据包,以此类推。
当然, 除非有一些明显的激励措施来避免每个数据包都标志成“非常重要”一"永远不要丢弃”,否则没有人会愿意把自己的数据包标示成不那么重要。通常计费和金钱可用 来阻止轻浮的标志。例如,如果发送方购买了某项服务,该服务规定了一定的发送速度, 网络可能允许发送方的发送速度超过他们购买的额度,只要他们把超出部分的数据包标记 为低优先级。这种策略其实并不是一个坏主意,因为它可以更加有效地利用闲置资源:只 要没有其他人对此有兴趣,主机就可以使用这些资源,但不能给它们在网络困难时也拥有这种权利。
5.随机早期检测
在拥塞刚出现苗头时就处理它比等拥塞形成之后再设法解决它更加有效。这一观察导致了一个针对负载脱落的有趣转折,即在所有的缓冲空间都精疲力竭之前丢弃数据包。
这一观点的动机在于大多数 Internet 主机没有从路由器获得ECN 形式的拥塞信号。相反,主机从网络能获得的唯一可靠的拥塞迹象是丢包。毕竟,很难构造出一个路由器,在 它超负荷工作时能做到不丢包。因此,诸如 TCP 这样的传输协议硬性规定了对丢包现象做出拥塞反应,减缓源端的响应。这背后的逻辑推理是 TCP 是专为有线网络设计的,并且有 线网络非常可靠,所以丢包大多是由于缓冲区溢出而不是传输错误造成的。无线链路必须恢复链路层传输错误(所以它们没有看到在网络层)以便 TCP 能正常工作。
可以利用这种情形来帮助缓解拥塞。在局面变得毫无希望之前让路由器提前丢包,但 这里有个时间点的确定问题,即发送方何时采取行动以免为时过晚。解决这个问题的一个 流行算法称为随机早期检测(RED, Random Early Detection) (Floyd 和 Jacobson, 1993 )。 为了确定何时开始丢弃数据包,路由器要维护一个运行队列长度的平均值。当某条链路上 的平均队列长度超过某个阔值时,该链路就被认为即将拥塞,因此路由器随机丢弃一小部分数据包。随机选择丢弃的数据包使得快速发送方发现丢包的可能性更大:因为在数据报 网络中,路由器不能分辨出哪个源引起了网络的最大麻烦,因此随机选择丢弃的数据包或 许是最佳选择。当没有出现期待的确认信息时,受此影响的发送方就会发现丢包,然后传 输协议将放慢速度。因此,丢失的数据包起到了传递抑制包的同样作用,但却是隐含的, 无须路由器发送任何显式信号。
相比那些只在缓冲区溢出才丢包的路由器,RED 路由器能提高网络性能,虽然它们可 能需要调整正常工作方式。举例来说,理想的丢包数量取决于有多少发送方必须得到拥塞通知。然而,如果ECN可用,那么它就是首选的选项。它的工作方式几乎完全一样,但提供了一个显式拥塞信号而不是依据丢包来判断是否拥塞:RED 用在主机不能接收显式信号的环境里。
服务质量
我们在上一节考查的技术主要用来减少拥塞并提高网络性能。然而,存在一些应用(和 客户),它们对网络的性能保障有很强的需求,而不仅仅只是“在当前情况下尽力而为”。 **特别是多媒体应用往往需要具备最小延迟和最大吞吐量条件才能正常工作。**在本节中,我 们将继续我们的网络性能研究,但现在更加注重如何提供与应用需求相匹配的服务质量。 这是一个 Internet 正在经历长期变革改进的领域。
从一个源端发到一个接收方的数据包流称为一个流 (flow) (Clark, 1988)。在面向连接的网络中,一个流或许是一个连接上的全部数据包:而在无连接网络中,一个流是从一 个进程发到另一个进程的所有数据包。每个流的需求可由四个主要参数来表示:带宽、延迟、抖动和丢失。总之,这些参数决定了一个流要求的服务质量(QoS, Quality of Service )。
图 5-27 列出了几种常见的应用和它们分别对网络质量的严格要求。请注意,网络需求小于应用需求,在这些情况下,应用程序可以改善由网络提供的服务。特别是,网络并不需要为可靠的文件传输真正做到无丢失,也并不需要为音频和视频的播放传递具有相同延迟的数据包。丢失部分可以通过重传来修复,一些抖动可以通过接收端缓冲数据包来平滑。 然而,如果网络提供的带宽太少或者延迟太大,则无论应用程序做什么都无法补救这种情况。
延迟的变化(即标准方差)或者数据包到达时间的变化称为抖动 (jitter)。图 5-27 的 前三个应用对相邻两个数据包到达时间的无规律性不敏感。远程登录对此有点敏感,如果 连接遭遇太多的抖动,屏幕更新将呈现小的突发状。视频,尤其是音频对抖动非常敏感。 假设用户正在通过网络观看视频,如果帧都刚好延迟了 2.000 秒,则不会损害播放效果。但是,如果传输时间随机地在 1 秒和 2 秒之间变化,那么结果将非常可怕,除非应用程序 能隐藏抖动。对于音频,即使是几毫秒的抖动都能被清楚昕到。
流量整形
流量整形 ( traffic shaping)是指调节进入网络的数据流的平均速率和突发性所采用的 技术。
漏桶和令牌捅
我们己经看过一种限制应用程序发送的数据量的方式:滑动窗口,它通过一个参数限 制在任何特定时间内可以发送的数据量,因而间接地限制了数据速率。现在我们来看一种 描述流量特征的更普遍的方式,漏桶算法和令牌桶流量。方法略有不同,但效果基本均等。
请想象这样一个桶,它的底部有一个小洞,如图 5-28 (b)所示。无论流入漏桶的水的速率 多大,只要漏桶中还有水,那么水流出桶的速率是个恒定速率 R:如果桶内没有水,则流 出桶的速率降为 0。此外,一旦桶内的水达到桶的容量 B,任何额外进入桶的水都会沿着 桶侧分流,最终流失。
漏桶可以应用到注入网络的数据包上,对其进行整形和监管,如图 5-28 Ca)所示。概念上,每个主机在连接到网络的接口中包含一个漏桶。为了向网络发送数据包,必须有可能往漏桶中灌入更多的水。如果漏桶满时来了一个数据包,那么该数据包必须排入队列等 漏桶空出来时再接纳,或者被丢弃。前一种策略作为操作系统的一部分可用在对主机进入 网络的流量实施整形:后一种策略可用在服务提供商的网络接口,通过硬件对进入网络的 流量实施监管。这个技术由 C Turner, 1986)提出,称为漏桶算法 ( leaky bucket algorithm )。
一个形式不同但效果相当的方法是把网络接口想象成一个漏桶,正在往里灌水,如图 5-28 (c)所示。水龙头速率为 R,水桶容量为 B (跟以前一样〉。现在,为了发送一个 数据包,我们必须能够从桶内掏出水或令牌,俗称为内容(而不是往桶内注水)。桶内只可累积固定数量的令牌,即 B,不可能有更多的令牌:如果桶是空的,我们必须等更多的令 牌到达才能发送另一个数据包。该算法称为令牌桶算法(token bucket algorithm )。
IPv4 和 IPv6
1. IPv4
CIDR
2.IPv6
Internet 控制协议
1. ICMP-一-Internet 控制消息协议
2. ARP-一一地址解析协议
3. DHCP-动态主机配置协议
网关协议(路由协议)
1. RIP协议
2. OSPF协议
3. BGP协议
路由器