1、5.4 QoS前一节所看到的技术是减少拥堵和提高网络性能。然而,应用程序想要从网络得到更强的性能保证,而不是“尽最大努力” 。特别是多媒体程序,经常有最小吞吐量和最大延迟的要求。这一节,我们将继续研究网络性能,但是现在要重点关注提供满足应用程序需求的服务质量的方法。为了提供好的服务质量,一个简单的解决方案是建造一个足以容纳任何流量的具有足够容量的网络。这个解决方案叫做 overprovisioning。根据这个方案建造的网络将不会有明显的丢包,而且低延迟(假设有一个恰当的路由选择方案) 。这样的网络的性能是最好的。某种程度上,电话系统是 overprovisioning的,因为一般情况下,拿起
2、听筒立刻就能听到拨号音。这是因为,电话系统有足够多的可用容量,总是能满足需求。这个方案的问题在于,太过昂贵。基本上就是砸钱来解决问题。QoS 机制使用较少的容量同时较低的成本来让网络满足应用程序的需求。此外,overprovisioning 基于预期的流量。如果流量模式有较大的改变,所有投资就白费了。使用 QoS 机制,网络能坚持做出的性能保证,即使流量模式有较大的变化,代价是拒绝一些请求。为了确保服务质量,有四个问题必须解决:1、应用程序对网络有什么需求。2、如何调整进入网络的流量。3、为了保证性能,如何在路由器上预留资源。4、网络能否稳妥地接受更多的流量。没有单项技术能有效应对所有这些问题
3、。相反,发展了多种技术用在网络(传输)层。实际使用的服务质量解决方案捆绑了多种技术。为此,我们将描述用于互联网的两个版本的服务质量,称作 Intergrated Services 和 Differentiated Services。5.4.1 应用程序需求从源到目的的一连串数据分组,称作流(flow) 。一条流,在面向连接的网络中是一个连接上的所有数据分组,在无连接网络中是从一个进程发往另一个进程的所有数据分组。每条流的需求能用下面四个主要参数来描述:带宽、延迟、抖动和丢失率。这些一起决定了流的服务质量需求。几个常用的应用和他们的网络需求的强度。对网络的要求比对应用程序的要求低,应用程序能改善
4、网络提供的服务。特别是,对于可靠的文件传输,网络不需要做到没有丢失,对于银视频的播放,网络不需要统一分组的延迟,一定量的抖动能够通过在接收端缓存来平滑。然而,如果网络带宽太小或者延迟太大,没有应用程序能够补救这种状况。Application Bandwidth Delay Jitter LossEmail Low Low Low MediumFile sharing High Low Low MediumWeb access Medium Medium Low MediumRemote login Low Medium Medium MediumAudio on demand Low Low
5、High LowVideo on demand High Low High LowTelephony Low High High LowVideoconferencing High High High Low图 5-27 应用程序的服务质量需求强度应用程序对带宽的需求有所不同,email、各种形式的 Audio 和 Remote login 不需要很多带宽,但是 File Sharing 和各种形式的 Video 需要大量带宽。更有意思的是对延迟的需求。文件传输应用程序,包括 email 和 video 对延迟不敏感。如果所有分组都统一延迟了几秒,没有害处。交互式应用程序,例如网上冲浪和 Re
6、mote login 对延迟更敏感。实时应用程序,例如 Telephony和 Video Conferencing 对延迟有严格的要求。如果打电话时说的话延迟太长,这是令人无法接受的。另一方面,从一台服务器播放音频和视频不要求很低的延迟。延迟或分组到达时间的变动(例如,标准偏差)称作抖动(jitter) 。图5-27 中前三个应用程序对分组到达的时间间隔的规律性不敏感。Remote login对抖动稍微有些敏感,如果连接存在抖动,屏幕上的更新会以突发的方式显示。Video 和 Audio 对抖动非常敏感。如果某人正在通过网络观看视频,视频的帧全部恰好延迟 2 秒,一切平安无事。但是如果传输时间
7、在 1 秒到 2 秒内随机变动,结果将是很糟糕的,除非应用程序隐藏了抖动。对于音频,甚至是一个几微秒的抖动能够被清楚地听出来。前四个应用程序对丢包比音视频有更强的要求,因为所有的位必须正确传递。传输层重传网络层丢失的数据分组来实现正确传递的目标。这是很费带宽的做法。如果网络层在第一时间拒绝看起来会丢失的分组,这样做也许会更好,音视频应用程序能够容许一些丢失分组而不进行重传,因为人们不会注意短的暂停或者偶尔的跳帧。为了容纳多种应用程序,网络可以支持不同的 QoS 类别。ATM 网络是一个颇具影响的例子。它们支持:1、恒定比特率(例如:电话)2、实时可变比特率(例如:压缩的视频会议)3、非实时可变
8、比特率(例如:看一部点播的视频)4、可用比特率(例如:文件传输)这些类别也能用于其它的目的和其他的网络。恒定比特率试图模仿一根提供统一带宽和统一延迟的电线。可变比特率发生在视频被压缩时,一些帧压缩的比其它帧利害。如果一个帧有很多细节可能要求发送很多比特,而如果是一堵白墙,可以很好的进行压缩。点播的视频实际上不是实时的,接收端在播放开始前能很容易的缓存几秒钟的视频。可用比特率用于像 email 那样对延时和抖动不敏感的应用,只要能得到带宽无论什么样的它们都能使用。5.4.2 流量整形(Traffic shaping )在网络做出 QoS 保证之前,必须要知道保证的是什么样的流量。在电话网络,流量
9、描述是简单的。例如,一个语音电话呼叫(非压缩格式)需要64kbps,每 125 微秒一个样本。然而数据网络流量是突发(bursty)的。流量速率变化(例如,压缩的视频会议) 、用户与应用程序交互(例如:新开一个web 页面)和计算机在任务间切换,这些时候通常分组都会以不一致的速率到达。突发的流量比恒定速率的流量更难处理,因为它们能填满缓存,导致分组丢失。流量整形是一种技术,它能调整进入网络的数据流的平均速率和突发。它的目标是允许应用程序传输适合它们需求的变化范围宽泛的流量,包含一些突发,然而有一个简单又用的方法来向网络描述可能会发生的流量模式。当一个流被建立,用户和网络(例如,客户和网络提供商
10、)为这个流商定一个流量模式。实际上,客户对网络提供商说:“我的传输模式看起来会像这样;你能处理吗?”有时这种协定被称作 SLA(Service Level Agreement) ,特别是基于很长一段时间的聚合流,例如某个给定客户的所有流量。只要客户履行他那部分协定并且只要基于商定的合同发送分组,网络提供商保证及时传递所有这些分组。流量整形减少了拥堵,帮助网络履行它的承诺。然而,要实现这些,还存在着如下问题:网络提供商如何知道客户是否遵守协定,如果客户不遵守协定该怎么办。超出商定模式的分组可以被网络丢掉,或者标上低优先级标记。对通信流量的监控被称作流量监管(traffic policing)整形
11、和监管对点对点和其他会消耗所有可用带宽的传输来说不那么重要,但是对实时数据,例如音视频等有严格的服务质量要求的连接来说非常重要。漏桶和令牌桶 Leaky and Token Buckets使用漏桶和令牌桶来特征化流量。图 5-28(b)是一个底下有个小洞的桶。不管水进入该桶的速度是多少,只要桶里有水,从小洞里流出的水是恒定速率 R,当桶空了,速度就变为了零。同样,当桶里的水达到的桶的容量 B,任何再加入的水都从边上溢出了,被丢失。这个桶能被用来整形和监管进入网络的分组,如图 5-28(a)所示。从理论上说,每台主机通过一个含有漏桶的接口连接到网络。要发送分组进入网络,必须把尽可能多的水放进桶里
12、。当桶满的时候,如果一个分组到达了,这个分组必须排队,直到流出足够的水,使得桶能容纳它,或者被取消。前者可能发生在主机,调整它发往网络的流量,这个功能作为操作系统的一部分。后者可图 5-28能发生在网络提供商网络接口的硬件上,监管进入网络的流量。这项技术被称作漏桶算法(leaky bucket algorithm) 。一个不同但是等价的构想是:把网络接口想像成一个将被填满的桶,如图5-28(c)所示。水龙头的流速是 R,桶的容量是 B。发送一个分组必须能够取水(或令牌)出桶(而不是把水放进桶) 。桶内最多能放的令牌数量是 B,如果桶空了,要发送分组,必须等待,直到更多的令牌到达。这个算法被称作
13、令牌桶算法(token bucket algorithm) 。漏桶和令牌桶限制了流的长期的速率,但是允许短期的调节至最大长度的突发通过,不会被改动,不会有任何的人为延迟。较大的突发将被一个漏桶流量整形器平滑,以减少网络上的拥塞。例如,假设一台计算机能够产生高达1000Mbps 的数据(每秒 125 兆字节) ,而网络的第一条链路也能以这样的速度运行。这台主机产生的流量模式如图 5-29(a)所示。这个模式是突发的。即使主机以最高速率 1000Mbps 发送一个 16000KB 的突发(持续 1/8 秒) ,一秒钟之后的平均速率是 200Mbps。现在假设路由器仅能在一小段时间内用最高速接收数据
14、,直到缓存被填满。缓存尺寸为 9600KB,比流量突发小。长时间的话,该路由器最佳速率不超过200Mbps(比方说,这是给与该客户的所有带宽) 。言下之意,如果流量以这个模式发送,部分流量会在网络里被丢弃,因为无法全部放入路由器的缓存内。图 5-29为了避免分组丢失,可以在主机处使用令牌桶调整流量。如果使用速率 R为 200Mbps,容量 B 为 9600KB,这个流量就处于网络能处理的范围之内。令牌桶的输出如图 5-29(b)所示。主机能够以 1000Mbps 全速发送一小段时间,直到耗尽桶里的令牌。然后削减到 200Mbps,直到突发被发送完毕。这个效果就是延长突发的时间,因为这个突发太大
15、不能一下子处理完。令牌桶的水位如图5-29(e)所示。开始的时候桶是满的,突发开始之后就被耗尽。当桶空了,新到的分组只能按照缓存填充的速度发送;桶的水位恢复了,才能有突发。当没有流量的时候,桶的水位升高,当流量按照桶填充的速度发送的时候,桶的水位不变。我们还能把流量整形成更少的突发。图 5-29(c)中令牌桶的输出速率R=200Mbps,容量为 0。这是一个极端的例子,流量被完全抹平了。突发不被允许,进入网络的流量速率稳定。图 5-29(f)显示的对应的桶的水平一直为空。要进入网络,流量需要在主机排队,总是有一个分组等着被发送。最后,图 5-29(d)显示了一个令牌桶的水位,该令牌桶的流速R=
16、200Mbps,容量 B=16000KB。前面假设的主机所发送的突发流量不经修改恰好能通过这个令牌桶。这个桶可能用于网络中的一台路由器,该路由器用来监控主机发送的流量。如果主机发送的流量符合与网络协商好的令牌桶,那么这个流量就能通过网络边界路由器上的令牌桶。如果主机发送的流量速度太快或者突发太强,令牌桶就会耗尽令牌。如果发生这种情况,流量监管器就会知道这个流量违反了协定。然后就会丢掉过量的分组或者降低优先级,至于采用何种方法根据网络的设计。例子中,在第一个突发之后,桶立刻空了,然后恢复到足够满,等待下一个突发。漏桶和令牌桶很容易实现。现在描述令牌桶的操作。例子中所描述的是水流持续的流进流出桶,
17、而真正的实现必须使用离散量。使用一个计数器来描述桶的水位。每 T 秒计数器增加 R/T 单位。在上面这个例子中每 1 毫秒 200K比特。每次一单位的流量被发送到网络,计数器就递减,流量不停的发送,直到计数器为 0。当分组都是同样尺寸的时候,桶的水位只要用分子来计算(例如,200K 比特是 20 个 1250 字节的分组) 。然后,经常使用的是可变尺寸分组。这种情况下,桶的水位用字节来计数。如果桶里剩下的字节计数太少,不够发送一个大的分组,该分组必须等到桶里的令牌攒的足够多(如果令牌填充率比较慢,需要等的久一点) 。计算最大突发长度(直到桶空)需要点小技巧。最大突发长度比 9600KB 除以
18、125MBps 要长一点,因为当突发在输出的时候,令牌也在不停到达。假设突发长度为 S 秒,最大输出速率为 M 字节/秒,令牌桶的容量为 B 字节,令牌到达的速率为 R 字节/秒,一个输出突发最多能容纳 B+RS 字节。同时,一个长度为S 秒的高速突发的字节数为 MS。因此, , 。SRB)/(RM令牌桶算法把大的突发拉低到长期速率 R。经常有这样的需求:把峰值速率拉下来,但是不要低至长期速率(也不需要提升长期速率以让更多的流量进入网络) 。平滑流量的办法之一是在第一个令牌桶后面再插入第二个令牌桶。第二个桶的速率要比第一个大。第一个桶塑造流量,固化它的平均速率,但是允许一些突发。第二个桶拉低突
19、发的峰值速率。例如,如果第二个桶的速率被设置成 500Mbps,容量为 0,初始突发将以峰值速率 500Mbps 进入网络,比前面的1000Mbps 要低。使用所有这些桶,需要点小技巧。当令牌桶被用于在主机处进行流量整形,分组会被迫排队和等待,直到桶允许他们被发送。当令牌桶被用于网络中的路由器上进行流量监管,算法被用于确保发送的数据包数量不会比允许的更多。这些工具提供方法来网络流量整形成更可管理的形态,以便于满足服务质量需求。5.4.3 分组调度能够调整被交付的流量的形状是一个好的开端。然而要提供性能保证,还必须沿着分组穿越网络的线路预留足够的资源。为了做点这一点,假设一个流中的分组都是沿着同
20、样的线路。把一个流中的分组随机喷洒到路由器上会使任何保证都变得困难。因此,从源到目的地必须建立起类似虚电路的东西,属于一条流的所有分组必须都沿着这条路径。为一个流中的分组之间或者参与竞争的流之间分配路由器资源的算法被称作分组调度算法(packet scheduling algorithms) 。有三种资源能被预留:1、带宽2、缓存空间3、CPU 周期第一个,带宽,使最显而易见的。如果一条流要求 1Mbps,输出线路的容量为 2Mbps,那么试图把三条流导到那条输出线路将不会正常运作。因此,预留带宽意味着不要把任何输出线路塞满。Thus, reserving bandwidth means no
21、t oversubscribing any output line.第二个资源是缓存空间,这是经常供不应求的。当一个分组到达,它被缓存在路由器里面,直到它能被在选种的输出线路上传输。缓存的目的是当流相互之间竞争的时候吸收小的流量突发。如果没有缓存可用,分组不得不取消,因为没有地方存放它。对于好的服务质量,会为某条特殊的流预留一些缓存,这样,这条流就不必为了缓存而与其它流竞争。在某个最大值范围内,总有可用的缓存为这条流准备着。最后,CPU 周期也可能是一种稀缺的资源。处理分组会占用 CPU 时间,因此一台路由器每秒只能处理一定数量的分组。现代路由器能够快速处理大多数分组,某些种类的分组需要占用大
22、量的 cpu 处理周期,例如 ICMP 分组。为了确保及时对这些分组的处理,需要设法确保 CPU 没有过载。分组调度算法分配带宽和其他路由器资源,通过决定缓存了的分组中哪个是下一个即将发送的。每个路由器以队列的形式为每条输出线路缓存分组,直到它们能被发送,发送的顺序与到达的顺序一样。这个算法叫做 FIFO(First-In First-Out) 。当队列满了的时候,FIFO 路由器通常会丢掉新到的分组。新到的分组会被放在队列的末尾,因此这种丢掉分组的行为被称作 tail drop。下面将介绍的其他调度算法创建了新的机会来决定当缓存满了之后哪个分组会被丢掉。FIFO 调度实现起来很简单,但是它不
23、适合用来提供好的服务质量,因为当有多条流的时候,其中一条能够很容易的影响其他流的性能。如果前面的一条流是强势的,发送大的分组突发,这些分组将停留在队列里。按顺序处理分组,意味着强势的发送者能够占据它路径上路由器的大多数容量,使其他流严重缺乏资源,降低了它们的服务质量。雪上加霜的是,那些特别想要通过路由器的流的分组很可能要被延迟,因为它们不得不在队列里面坐在强势发送者发送的许多分组后面。许多分组调度算法被设计出来,提供了更强的流间隔离,阻止相互干涉的企图。最早被设计出来的算法之一是公平队列(fair queueing)算法。这个算法的实质是:路有器为每个流准备一个队列,每条流有一条指定的输出线路
24、。当线路空闲的时候,路有其循环稍描队列,如图 5-30 所示。然后取下一个队列的第一个分组。这样,如果 n 台主机竞争这条输出线路,每台主机每 n 个输出分组中占一个。感觉上这是公平的,所有的流用同样的速率发送分组。发送更多的分组也不会提升这个速率。这个算法有一个缺点:它给使用大分组的主机的带宽,比使用小分组的主机多。改进的建议是:把按分组的循环改成按字节的循环。使用的技巧是:计算循环的次数,把这个当作虚拟时间,这个时间是每个分组完成发送的时间。分组按照他们完成时间排序,并按这个顺序发送。图 5-31 展示了这个算法和一个例子,在这个例子中有三个流中达到的分组的结束时间。如果一个分组的长度为
25、L,从启动时间(start time)到结束排队发送需要 L 轮。启动时间要么是前一个分组(同一队列)的结束时间,要么是分组的到达时间(如果当它到达时队列是空的) 。仅看前两个队列中各自的前两个分组,它们到达的顺序为 A,B,D 和 F。图 5-30图 5-31分组 A 在第 0 轮到达,8 字节长度,因此结束时间为 8 轮。同样 B 的结束时间为 11。分组 D 在 B 被发送之后达到。D 的长度为 9 字节因此,D 的结束时间为11+9=20。F 的到达时间比 A 结束的时间晚,所以 F 的结束时间为它的到达时间10+长度 6=16。不考虑新来的分组,这四个分组的相对发送顺序为A,B,F,
26、D,即使 F 比 D 晚到。很可能在最上面的流中到达一个小分组,然后比 D 更早发送。只有 D 的传送还没开始,才能比 D 早一步发送。公平队列不抢占正在传送的分组。因为分组是按整体发送的,公平队列仅是对理想的逐字节(byte-by-byte)方案的一种近似。这个算法的缺点是:它给与所有主机同样的优先级。例如,在很多情况下,可望给予视频服务器比文件服务器更多的带宽。每一轮循环给视频服务器两个或多个字节,这是很方便的。这个改进的算法被称作加权公平队列WFQ(Weighted Fair Queueing) 。把每轮的字节数作为流的权重,W。给出计算结束时间的公式: , 是到达时间, 是结束时间,L
27、FAiii /,max1iAiF是分组 i(同一个队列中的分组)的长度。图 5-31(a)中最低下的队列的权iL重是 2,因此它的分组发送的更快,可以从图 5-31(b)中给出的结束时间中看出。另一个现实的考虑是实现的复杂度。加权公平队列需要在结束时间把分组插入到一个排序队列 sorted queue。如果有 N 个队列,那么每个分组至少需要复杂度的操作,这在有许多流的路由器上很难实现。加权公平队列的NOlog一个近似亏空轮询(deficit round robin) ,实现起来非常高效,没分组仅复杂度操作。有了这个近似,加权公平队列被广泛的使用。1也存在着其他的调度算法。一个简单的例子是优先
28、级调度,每个分组被标上优先级。高优先级的分组总是先于低优先级的分组发送,低优先级的被缓存起来。同一优先级的分组按照 FIFO 的顺序发送。然而,优先级算法有缺点,那就是:高优先级分组突发会阻塞低优先级分组,低优先级分组不得不无限等待。加权公平队列是更好的选择。给高优先级队列一个大的权重,比如 3,高优先级分组通常走短线(因为高优先级的分组相对较少) ,低优先级的分组仍能少量通过,即使有高优先级的流量的时候。分组可以携带时间戳,按时间戳顺序发送。时间戳纪录分组沿着路径在路由器上发送的时候,落后或提前的程度。在一个路由器上排在别的分组后面的分组往往是落后,被优先服务的分组往往是提前。按分组时间戳的顺序发送分组有利于把慢的分组加速,同时把快的分组减速。这样做的结果是,网络上传递的分组的延迟更趋向一致。