27、服务质量(网络层)

引言

  • 有一些应用对网络的性能保障有很强的需求,而不仅仅是“在当前情况下尽力而为”。特别是多媒体应用往往需要具备最小延迟和最大吞吐量才能正常工作。本节将注重如何提供与应用需求相匹配的服务质量。提供良好服务质量的一个简单解决方案就是建设有足够容量的网络,无论扔给它什么样的流量都能承担。这种解决方案的名称是过度配置。在一定程度上,电话系统就是过度配置的一个例子,因为拿起电话而没有拨号音的情况很罕见(所以也不见得非常浪费,寒注)。这里有太多的可用容量,所以需求总是能够得到满足。这种解决方案的麻烦在于成本太昂贵,它基本上是用一堆钱来解决问题。服务质量机制让一个小容量网络以较低的成本来满足应用需求的解决途径。此外,过度配置基于预期的流量模式。如果流量模式变化太大,那么所有的赌注都将一去无返。有了服务质量机制,网络可以兑现其所做的性能保证,即使在网络流量高峰期拒绝了一些请求。
  • 确保服务质量必须解决如下4个问题:(1)应用程序需要网络什么样的质量?(2)如何规范进入网络的流量?(3)为了保障性能如何在路由器预留资源?(4)网络能否接收更多流量?
  • 没有一种单一的技术能解决上述所有问题。研究人员已经陆陆续续开发出许多可用在网络层(和传输层)的各种技术。实际的服务质量解决方案要结合多种技术。为此,我们将介绍Internet服务质量的两个版本,即综合服务和区分服务。

1、应用需求

  • 从一个源端发到一个接收方的数据包流称为一个流。在面向连接的网络中,一个流或许是一个连接上的全部数据包;而在无连接网络中,一个流是从一个进程发到另一个进程的所有数据包。每个流的需求可由4个主要参数来表示:带宽、延迟、抖动(抖动是指最大延迟与最小延迟的时间差,局域网的延迟一般小于1毫秒,广域网的延迟一般10-50毫秒)和丢失。总之,这些参数决定了一个流要求的服务质量(QoS).
  • 下图列出了几种常见的应用和它们分别对网络质量的严格要求。请注意,网络需求小于应用需求,在这些情况下,应用程序可以改善由网络提供的服务。特别是,网络并不需要为可靠的文件传输做得真正的无丢失,也不需要为音频和视频的播放传递具有相同延迟的数据包。丢失部分可以通过重传来修复,一些抖动可以通过接收端缓冲端缓冲来平滑,然而,如果网络提供的带宽太少或者延迟太大,则无论应用程序做什么也无法弥补。在这里插入图片描述
  • 应用程序对它们的带宽需求是不同的,电子邮件、各种形式的音频和远程登录不需要太多的带宽,但文件共享和所有形式的视频应用则需要大量带宽。更有趣的是网络对网络延迟的需求。文件传输应用,包括电子邮件和视频,对延迟并不敏感。如果所有的数据包被均匀地延迟几秒钟,则无伤大雅;交互式应用,比如网上冲浪和远程登录,对延迟比较敏感;而实时应用,例如电话和视频会议,则有严格的延迟要求。
  • 延迟的变化(即标准方差)或者数据包到达时间的变化称为抖动(注意这里有两个定义了,寒注)。图中前三个应用对相邻两个数据包到达时间的无规律性不敏感。远程登录对此有点敏感,如果连接遭遇太多抖动,屏幕更新将呈现小的突发状。视频,尤其是音频对抖动非常敏感。相比音视频应用前4种应用对于丢失有更严格的要求,因为任何一位都不允许被错误递交给接收方。实现这个目标的通常做法是由传输层把网络丢失的数据包重传。音视频应用可以容忍少量数据包丢失而无需重传,因为人们不会注意到音频的短暂停顿或者画面的偶尔跳跃。
  • 为了适应各种应用,网络可以支持不同类别的QoS。一个比较有影响的例子是ATM网络。该网络曾经是网络互联宏大愿景的一部分,但却早已成为了一种利基(Niche)技术(利基是更窄地确定某些群体,这是一个小市场并且它的需要没有被服务好,或者说“有获取利益的基础”。)。ATM网络支持:(1)恒定比特率(如电话)(2)实时可变比特率(比如压缩的视频会议)(3)非实时可变比特率(如点播电影)(4)可用比特率(如文件传输)
  • ATM这样的分类对于其他的用途或者其他网络也是有用的。恒定比特率是指试图模拟一条线路,提供恒定的带宽和恒定的延迟。当视频信号被压缩时,由于有些帧的压缩比率大于其他的帧,所以会发生比特率变化的情况。如果发送的帧中包含了许多细节,那么它发送就要请求许多位,而只包含一面白色墙壁的帧可能会被压缩成极少的位。观看点播的电影实际上并不那么实时,因为接收端在开始播放前很容易地就缓冲了好几秒钟的视频,因此网络中的抖动仅仅导致“已缓存但未播放视频”的变化(所以播放时完全没有影响)。可用比特率适用于电子邮件这类应用,它们对抖动或延迟并不敏感,而且能做到得到什么样的带宽就用什么样的带宽工作。

2、流量整形

  • 在网络做出服务质量保证之前,它必须知道要保证哪些流量的服务质量。在电话网络中,这种特性是简单的。例如,语音通话(非压缩格式)需要64kbps,它由一系列每125微秒的8位样本值组成。然而,数据网络中的流量是突发性的。通常包的到达是非均匀的,比如当流量速率可变(如压缩视频会议)、用户与应用程序交换(如浏览一个新的网页),以及计算机在不同的任务之间切换。突发流量比固定比特率的流量更难以处理,因为它们可以填满缓冲区并导致数据包丢失。
  • 流量整形是指调节进入网络的数据流的平均速率和突发性所采用的技术。它的目标是允许应用程序发送适合它们需求的各种各样流量,包括带有某种程度的突发,但要有一个简单而有用的方式向网络描述可能的流量模式。当一个流在建立时,用户和网络(即客户和网络提供者)就该流的流量模式(即流量形状)达成一致的协议。实际上,客户可以向服务提供者说“我的流量模型看起来是这样的:你能处理它吗?”有时候客户和服务提供者之间的约定称之为服务等级约定(SLA),特别是当它由聚合流量组成,并且存在一段比较长期的时间时,比如一个给定客户的全部流量。只要客户履行了约定中的义务,并且根据商定的合约发送数据包,那么服务提供者就承诺按时将数据包递交到目标。
  • 流量整形技术可以减少拥塞,然而要使流量整形工作,还有一个问题需要解决,那就是服务提供商如何确定客户是否遵守它们之间的约定,以及如果客户违反约定该怎么办。超出约定模式之外的数据包可能会被丢弃,或者被打上低优先级标记。对一个流进行监测称为流量监管。流量整形和流量监管对于P2P和其他可能消耗掉任何可用带宽的数据传输并不那么重要,但它们对实时数据传输有非常重大影响,比如音频和视频连接等这种具有严格服务质量需求的数据流。

漏桶和令牌桶

  • 我们已经看过一种限制应用程序发送数据量的方式:滑动窗口,它通过一个参数限制在任何特定时间内可以发送的数据量,因而间接地限制了数据速率。现在我们来看另一种描述流量特征的更普遍的方式,漏桶算法和令牌桶流量。方法略有不同,但效果基本均等。请想象这样一个桶,它的底部有一个小洞,如图b所示。无论流入桶的水的速率多大,只要漏桶中还有水,那么水流出桶的速率是个恒定速率R;如果桶内没有水,则流出桶的速率为0。此外,一旦桶内的水达到桶的容量B,任何额外进入桶的水都会沿着桶侧分流,最终流失。在这里插入图片描述
  • 漏桶可以应用到注入网络的数据包上,对其进行整形和监管,如图a所示。概念上,每个主机在连接到网络的接口中包含一个漏桶。为了向网络发送数据包必须有可能往漏桶中灌入更多的水。如果漏桶满时来了一个数据包,那么该数据包必须排入队列等漏桶空出来时再接纳,或者被丢弃。前一种策略作为操作系统的一部分可用在对主机进入网络的流量实施整形;后一种策略可用在服务提供商的网络接口,通过硬件对进入网络的流量实施监管。这个技术由Turner提出,称为漏桶算法。
  • 一个形式不同但效果相当的方法是把网络接口想象成一个漏桶,正在往里灌水,如图c所示。水龙头的速率为R,水桶容量为B。现在为了发送一个数据包,我们必须能够从桶内掏出水或令牌(水/令牌不是数据包,寒注),俗称为内容。桶内只可积累固定数量的令牌,即B,不可能有更多的令牌;如果桶是空的,我们必须等更多的令牌到达才能发送一个数据包。该算法称为令牌桶算法。
  • 漏桶和令牌桶研制了一个流的长期速率,但允许其短期突发某个最高的调节长度,不会改变延迟也不会受到任何人为的拖延。大量突发数据将被一个漏桶流量或整形器进行平滑处理,以便减少网络拥塞。作为一个例子,假设一个计算机能够产生高达1000Mbps的数据,而且该网络的第一条链路也是以这个速率运行。主机生成的流量模式如图a所示。这种模式就是突发性的。每秒的平均速率是超过200Mbps(图中125MB/s是25MB/s的5倍,1000Mbps/5=200Mbps,寒注),即使该主机以峰值1000Mbps的速率发送16000KB突发数据(125Mbps发送125毫秒等于15625KB,近似16000KB,寒注)。在这里插入图片描述
  • 现在假设路由器可以在很短的时间内接受峰值速率的数据,直到缓冲区填满为止。缓冲区大小为9600KB,远远小于突发流量。在很长时间内,路由器的最佳工作速率不能超过200Mbps(比方说,因为这是给予客户的全部带宽),这里是说如果以200Mbps发送流量,其中有一些可能会被网络丢失,因为缓冲区已经被突发流量填满。
  • 为了避免数据包丢失,我们可以在主机端用一个令牌桶对其进行流量整形。如果我们使用速率R为200Mbps(假设1bit发送,取出1个令牌,则桶的令牌到达速率也是200M令牌/s,寒注),容量B为9600KB,则流量属于网络能够处理的范围。令牌桶的输出显示如图b所示。主机可以1000Mbps全速发送一小段时间,直到它耗尽桶的容量(比如说发送1bit对应的就从桶内取出一个令牌,假设初始时桶是满的,寒注);然后它必须把发送速率削减至200Mbps(应该是峰值被削减,否则在客户的全部带宽只有200Mbps的速度下,只能维持一个平衡,桶内的令牌已经没有了,寒注),直到突发数据被发送出去。其效果是把突发流量分散到一段时间内,因为突发量太大无法一次处理完。该令牌桶的水平如图e所示。开始的时候它是全速率发送,很快被突发耗尽(桶的所有令牌);当它到达0时(没有令牌),只能以填满缓冲区的速率发送新的数据包(取决于令牌到达的速率了,寒注);此时,不再有突发,直到桶恢复。没有流量发送时桶被慢慢填满(令牌逐渐增多),当以(令牌)填充速度发送时桶保持当前水平。
  • 我们也可以把流量整形成更少的突发。图c给出了一个以R=200Mbps和容量为0的令牌桶输出。这是一个极端情况,流量被完全平滑了,不允许任何突发,流量以一个稳定的速率进入网络。对应的桶的水平如图f所示,桶的水平总是空的。主机上的流量排队等待输出到网络。
  • 最后,图d给出了一个R=200Mbps,容量B=16000KB令牌桶的水平。这是最小的令牌桶,通过它的流量不会被改变。这个桶可被网络路由器用来监管主机发送的流量。如果主机发送的流量符合它与网络商定的令牌桶,则流量将通过设置在网络边缘路由器上的相同令牌桶。如果主机以高于最快的或者突发速率发送,则令牌桶将耗尽。如果发生这种情况,流量监管器就知道主机发送的实际流量不是事先说明的那样;然后,它要么丢弃多余的数据包,要么降低其优先级,具体采取何种策略取决于网络的设计。在我们的例子中,桶在初始突发结束后被短暂清空,然后恢复到足够下一个突发水平。
  • 漏桶和令牌桶实现起来很容易。现在我们描述一个令牌桶的操作。尽管我们已经描述水连续不断流入和流出流通,但真正的实现必须离散度量。令牌桶用一个桶的水平计数器实现。计数器每时钟滴答Δt秒前进R/Δt单位,在上面的例子中是每毫秒200Kb,每次发送一个单位的流量到网络,然后计数器递减;只要计数器非零就可以一直发送。
  • 如果数据包都是一样大小,桶的水平可以数据包计数(如200Kb对应20个大小为1250字节的数据包),然而通常数据包大小是可变的。在这种情况下,桶的水平就由字节计量。如果剩余的字节数太低,不够发送一个大的数据包,则该数据包必须等待,直到下一个时钟滴答(或更长的时间)。
  • 计算最大突发长度(直到桶清空)需要一点技巧。突发长度刚好超过9600KB除以125MB/s的除数,因为输出的同时有更多的令牌到达。如果我们称突发长度为S秒,最大输出率为M B/s,令牌桶的容量为B字节,令牌到达率为R B/s,我们可以看到,突发输出最多可包含B+RS字节。同时,我们也知道S秒时间的最大速度突发长度为MS。因此有:B+RS=MS。可以解出S=B/(M-R),带入参数B=9600KB,M=125MB/s,R=25MB/s,我们可以得到突发时间大约为94毫秒。令牌桶算法的一个潜在问题是它把大的突发传输下降到了一个长期速率R。人们通常需要把峰值降下来,但又不希望降到长期速率。平滑流量的一个办法是在第一个令牌桶之后插入第二个令牌桶。第二个桶的速率比一个桶高许多。基本上,第一桶表述流量特征,确定其平均速率,但允许少量突发;第二桶降低了进入网络的突发峰值速率。例如,如果第二个令牌桶的速率设定为500Mbps,并且容量为0,则初始突发进入网络的峰值速率为500Mbps,这比之前的1000Mbps低了许多。
  • 有效使用这些桶可能需要不少技巧。当令牌桶被用来整形主机流量时,数据包必须排队并延迟到桶允许它们被发送时;当令牌桶被网络路由器用于流量监管时,该算法确保了发送的数据包不会比允许发送的更多。

3、包调度

  • 调整网络流量的形状是保证服务质量的一个良好开端。然而想要提供性能保证,我们必须沿着数据包经过网络的路径预留足够的资源。为了做到这一点,我们假设一个流的数据包遵循同样的路径。如果这些数据包被随机分散到路由器上是很难保证什么的。因此,有必要在源端和接收方之间建立起类似于虚电路的路径,属于这个流的所有数据包必须遵循这条路由。
  • 在同一个流的数据包之间以及在竞争流之间分配路由器资源的算法称为(数据)包调度算法。为不同的流可以预约的潜在资源有以下3种:(1)带宽(2)缓冲区(3)CPU周期。
  • 第一种资源带宽最为显见。如果一个流要求1Mbps,而输出线路的容量为2Mbps,那么如果有3个流在这条线路上就不能正常工作。因此预留带宽意味着对任何一条输出线路都不能超额预订。第二种常常短缺的资源是缓冲区空间。当一个数据包抵达时,它通常被保留在路由器的缓冲区直到可以从选择的输出线路上发送出去。当流相互竞争时缓冲区可以起到吸收小的突发流量的作用。如果没有可用的缓冲区,那么该数据包不得不丢弃。对于好的服务质量,可以为某个特定的流预留一定的缓冲区,从而该流不必跟其他流竞争缓冲区。最后CPU周期也是一种稀有资源。每个数据包的处理需要占用路由器的CPU时间,所以一台路由器每秒只能处理一定数量的数据包。虽然现代路由器能快速处理大多数数据包,但某些类型的数据包需要得到CPU更快的处理,比如ICMP数据包。
  • 数据包调度算法负责分配带宽和其他路由器资源,具体做法是确定下一次把缓冲区中的哪些数据包发送到输出线路。在解释路由器工作时已经描述了最直截了当的调度程序。每个路由器把需要转发的数据包排入相应输出线路的队列,直到它们可以发送,并且发送顺序与到达队列的顺序相同这种算法称为先入先出(FIFO)或等价的先来先服务(FCFS)。FIFO路由器在队列满时通常丢弃新到达的数据包,由于新到达的数据包会排在队列末尾,因此这种行为称为尾丢包。其他的处理方式如前述的RED算法——在平均队列长度增大时随机选择丢弃一个新到达的数据包。我们将描述一些其他调度算法在缓冲区满时也会创造其他的机会来确定丢弃哪些数据包。
  • FIFO调度算法易于实现,但它无法提供良好的服务质量,因为当存在多个流时,一个流很容易影响到其他流量的性能。如果第一个流来势汹汹并且发送大的突发数据包,它们将盘踞在队列中。按数据包的到达顺序处理意味着咄咄逼人的发送方能吃到大部分容量,因而饿死其他流量,降低它们的服务质量。
  • 研究人员已经制定了许多数据包调度算法,这些算法可提供很强的流间隔离,并且能阻止干扰企图(Bhatti和Crowcrofr)。其中一个数据包调度算法是由Nagle提出的公平队列算法。该算法的实质是针对每条输出线路,路由器为每个流设置单独的队列。当线路空闲时,路由器循环扫描各个队列,如图所示;然后从下一个队列中取出第一个数据包发送。以这种方式,如果某条输出线路被n个主机竞争,则每发送n个数据包中每个主机获得发送一个数据包的机会。正是这个意义上的公平,使得所有流量以同样的速率发送数据包。在这里插入图片描述
  • 虽然从一开始,该算法就有一个缺陷:它给使用大数据包的主机比使用小数据包的主机提供了更多的带宽。Demers建议对该算法的循环策略进行改进,把原来的“数据包接数据包”的循环方式改成“字节接字节”的循环方式。这里的诀窍是计算一个虚拟时间,这个时间指每个数据包发送完毕所需要的轮数。每一轮循环从所有有数据待发送的队列中排空一个字节;然后按照数据包的结束时间顺序排队,并以该顺序真正发送数据包。图示显示了该算法的例子,例子给出了分别属于3个流的数据包到达和完成时间。如果一个数据包的长度为L,它的完成时间恰好是启动之后的第L轮循环。启动时间要么是前一个数据包的完成时间,或者是数据包的到达时间(如果它到达时队列为空)。在这里插入图片描述
  • 现在看图b中的表,考查最上面两个队列的前两个数据包,数据包的到达顺序是A、B、D和F。数据包A在第0轮循环到达,长度为8个字节,因此其完成时间是第8轮;同样,数据包B的完成时间为11;当数据包B在发送时数据包D到达,银川它的完成时间要从B结束时开始算9字节循环,最终完成时间为20。类似地,F的完成时间为16。如果没有新的数据包到达,则相对的发送顺序是A、B、F、D,尽管F在D之后到达。有可能在最上面的那个流到达另一个很小的数据包,它的完成时间在D的完成时间之前。如果D的传输尚未开始,那么该小数据包(发送完毕时间)就会跳跃到D的前面。公平队列不能抢占当前正在传输的数据包,因为数据包的发送时整体行为因此公平队列只是理想“字节接字节”方案的近似法。但这是一个很好的近似,任何时候数据包都保持着其理想的传输方案。
  • 实际上这个算法存在一个缺点,即它给所有主机以相同的优先级。在许多情况下,比如给予视频服务器比文件服务器更多的带宽也是可取的。要做的这点很容易,只要每轮循环时给视频服务器两个或两个以上的字节。这种修改后的算法称为加权公平队列(WFQ)。设每一轮的字节数是一个流的权重W,我们现在可以给出计算完成的时间公式:Fi=max(Ai,Fi)+Li / W。其中Ai为到达时间,Fi为完成时间,Li是数据包 i 的长度。在上图中,最下面的队列权重为2,所以你可以看到在图b给出的完成时间表中,它的数据包这发送得更快。
  • 另一个实际考虑是算法的复杂度。WFQ要求数据包按照它们的完成时间插入到一个有序队列中。如果有n个流,则针对每个数据包,至少需要O(logN)次操作,这在同时存在许多流的高速路由器上很难实现。Shreedhar和Varghese描述了一种称为赤字循环的近似算法,该算法的实现非常有效,针对每个数据包只有O(1)次操作,WFQ广泛使用了这个近似算法。
  • 还存在着其他一些类型的调度算法。一个简单的例子就是优先调度,每个数据包被标记一个优先级别。高优先级数据包始终先于任何缓冲的低优先级数据包发送。具有相同的优先级别的数据包按照FIFO顺序发送。但是优先级调度的缺点是一个高优先级的突发数据包可以饿死低优先级的数据包,这将导致后者无限期地等待下去。WFQ通常提供了一个更好的选择。通过给高优先级队列更大的权重,例如高优先级数据包往往会连续发送好几个,只有一定比例的的低优先级数据包被陆续发送。一个高低优先级系统基本上是一个双队列的WFQ系统,其中高优先具有无限的权重。
  • 数据包调度的最后一个例子是数据包携带时间戳并且按照时间戳顺序发送。Clark描述了一种设计,当数据包被路径上的一系列路由发送时时间戳记录该数据包离调度之后或者之前还有多远。排在路由器队列中其他数据包后面的数据包趋向于稍后调度,而首先获得服务的数据包则趋向于优先调度。按数据包的时间戳顺序发送数据包有利于加快慢速数据包,而且同时放缓快速数据包。结果是网络传递的所有数据包具有更一致的延迟。

4、准入控制

  • 服务质量的保证通过准入控制的过程来建立。我们首先看的是用于控制拥塞的准入控制,尽管它还很脆弱,但却是性能的保障。我们现在考虑的的保障机制更强大,但模型是相同的。用户向网络提供一个有QoS需求的流量;然后,网络根据自己的容量以及向其他流做出的承诺决定是否接受或拒绝该流。如果接受,网络就要提前在路由器上预期容量,以便保证该留发送时的服务质量。
  • 沿着数据包经过网络所用的路由,沿途每个路由器都要预留相应的资源。路径上任何一台没有预留的路由器可能变得拥挤不堪,而且单个拥塞的路由器就可以打破QoS保证。许多路由算法都是在源与接收方之间找出一条最好的路径,并且通过该最好路径发送流量。如果最佳路径上没有足够的剩余流量,这种算法就可能导致某些流遭遇拒绝。如果新流所需的带宽超过了剩余容量,那么通过选择另一条产能过剩的不同路径,仍然可以为新流提供QoS保证,这就是所谓的QoS路由。有可能把到达每个目的地的流量拆分成多条路径,以便更容易地发现产能过剩的问题。一个简单方法就是选择同等成本的路径,并且将流量均等或者按照比例分摊到出境链路的容量。
  • 给定一条路径,决定接受或拒绝流量并不是一件简单的事情。相对而言,相比一个产能过剩的路由器请求资源(带宽、缓冲区和CPU周期)还要复杂一些。首先,尽管某些应用程序可能知道它们的带宽需求,但很少知道有关缓冲区或CPU周期的需求,因此至少需要不同的方式来描述流,并且将这种描述转换成路由器资源。其次,某些应用程序比其他应用更能容忍偶尔错过的最后期限。应用程序必须从网络做出的服务质量保障类型中做出选择,是否硬性保障或者大部分时间都能得到保证。对于应用来说为大多数数据包提供保障往往足够了,而且获得此类保障的更多流可被固定容量支持。最后,某些应用可能就流的参数讨价还价。例如,一个电影观众通常运行速率在30帧/秒,如果没有足够的可用带宽支持,他可能愿意把运行速率降到25帧每秒。
  • 因为流协商过程中会涉及到许多方(包括发送方、接收方,以及发送方和接收方之间的路由器),所以必须用特定参数来精确描述流,并且这些参数是可以为各方所协商的。这样的一组参数称为流规范。通常,发送方(比如视频服务器)生成一个流规范,再次流规范中指出它所希望使用的参数;当这份流规范沿着路径传播时,沿途每个路由器对它进行检查,并根据需要修改相应参数。参数只能往降低质量方面修改,当流规范到达另一端时,流的参数就建立起来了。
  • 作为一个关于流规范的例子,如图。它基于综合服务的RFC 2210和RFC 2211,综合服务是QoS的一种设计方案,我们在下一节进行详细的讨论。例子显示的流规范共有5个参数。在这里插入图片描述
  • 前两个参数“令牌桶速率”和“令牌桶容量”使用了一个令牌桶,第一个参数给出了发送方可以传输的最大持续速率,即在相当长时间间隔内的平均速率;第二参数给出了短时间隔内可以发送的最大突发量。第三个参数,峰值速率指网络能容忍的最大传输速率,即使在很短的时间间隔内也要受此约束。最后两个参数指定了数据包的最小和最大长度,包括传输层和网络层的头。最小长度的规定是有用的,因为不管一个数据包有多短,在对它进行处理时需要一些固定时间。一台路由器可能每秒钟能处理10000个1KB长度的数据包,但是可能无法处理100000个50字节长度的数据包,尽管后者的数据率比前者更低。最大数据包长度很重要,因为可能会存在一些无法超越的内部网络的限制。例如,如果路径上有一段是以太网,那么不管其他网络如何处理数据包,数据包的最大长度将被限制于不得超过1500字节。
  • 一个有趣的问题是陆有成如何将一个流规范转变成一组特定的资源而进行预留。乍一看,似乎很明显,假设一个路由器有条链路允许速率为1Gbps,并且平均包的长度为1000位,那么它能以每秒一百万个包的速率处理数据包。实际情况并非如此,由于负载的统计波动,链路总是会有空闲周期。如果链路需要利用容量的每一位来完成自己的工作,那么甚至数位的空转(原文是idling,翻译成空缺可能更好,空转一般指汽车发动起空转!翻译并不是完美的,原文永远是最好的。寒注)都可能生成一个永远也无法摆脱的积压。
  • 即使实际负载略微轻于理论容量,也可能排起队列,而且延迟也很容易出现。请考虑这样的情形:数据包随机到达,平均到达率为λ个数据包;数据包具有随机长度,并且可以平均速率每秒μ个数据包发送到链路上。假设数据包的到达和服务服从泊松分布(即M/M/1排队系统),则利用排队理论可以证明,一个数据包所经历的平均延迟T为:T=(1/μ)×(1/(1-λ/μ))=(1/μ)×(1/(1-ρ))。这里的ρ=λ/μ是CPU的利用率。第一个因子1/μ是在没有竞争情况下的服务时间。第二个因子是指由于跟其他流竞争而导致的减慢因素。例如,如果λ=950000数据包每秒,μ=1000 000数据包每秒,那么ρ=0.95,并且每个数据包经历的平均延迟将是20微秒,而不是1微秒。这个时间值包含了排队时间和服务时间,正如当负载很低时(即λ/μ约为0)能看出这一点。如果在流的路径上有30台路由器,那么仅仅排队延迟就会到达600微秒。Parekh和Gallagher给出了一个对应于带宽和延迟性能保证的流规格说明方法。该方法在流量源端采用(R,B)令牌桶整形,而在路由器采用了WFQ。每个流都有一个WFQ权重W,该权重值足够达到能排空速率为R的令牌桶,如图所示。例如,如果流的速率为1Mbps,路由器和输出链路的容量为1Gbps。那么在路由器的输出链路上该流的权重必须大于所有流的全部权重的千分之一。这保证了该流具有最低带宽。如果流得不到足够大的速度,那么该流就不允许进入网络。在这里插入图片描述
  • 流的最大排队延迟是令牌桶突发大小的函数。考虑两个极端情况。如果流是平缓的,没有任何突发,数据包将以它们到达的速率被路由器排空,此时将不会有排队延迟(忽略打包效果)。另一方面,如果流量被保存起来形成堆积,那么一次到达路由器的最大突发数为B 。在这种情况下,最大排队延迟D将是以保证带宽排空突发的时间,或B/R(再次忽视打包效果)。如果这个延迟很大,那么流必须向网络请求更多的带宽。
  • 这些保障是硬性的,令牌桶约束了源端的突发性,公平队列隔离了给予不同流的带宽。这意味着无论竞争对手在路由器上的行为如何,该流将得到其带宽和延迟保证。那些其他流量不能破坏这种保障,即使积累流量并一次全部发送出来也不会影响上述流量的服务质量。此外,这个结果对于任何网络拓扑结构下通过多个路由器的路径都成立。每个流得到了最低带宽,因为这是每个路由器做出的带宽保证。每个流得到最大延迟的理由有点微妙。在最坏的情况下,冲击第一个路由器的突发流量与其他流的流量展开竞争,它将被推迟到最大延迟D。然而这种延迟能平滑突发流量。反过来,这意味着这次突发将再也不会在后面的路由器遭受进一步的排队延迟。总的排队延迟最大为D。

5、综合服务

  • 从1995年到1997年之间,IETF做了很大的努力来设计流式多媒体的体系结构。这项工作最后产生了20多个RFC,从RFC2205~2210。此项工作的通用名称是综合服务,主要针对单播和组播应用。比如说,用户从一个新闻网站抓取一段视频片段就是单播应用的一个例子:一组数字电视台将它们的节目以IP数据包流的方式广播到各地的许多接收端,就是组播的一个例子。下面将重点关注组播,因为单播可以看做是组播的一个例子。
  • 在许多组播应用中,组的成员可能会动态地发生变化。例如,用户进入一个视频会议,然后感觉厌烦了就切换到了其他频道。在这样的情况下,让发送方提前预留带宽的做法并不能很好地工作,因为这要求每个发送方必须跟踪它的听众们的全部加入和离开情况。这对于一个拥有上百万个用户的电视传输系统而言,这样的设计显然不能工作。

RSVP——资源预留协议

  • 在综合服务体系结构中,最主要的也是网络用户可见的那部分是资源预留协议(RSVP)。RFC 2205~2210文档对该协议进行了详细的描述。该协议的主要功能是预留资源,发送数据则需要使用其他协议。RSVP允许多个发送方给多个接收组传送数据,也允许接收方自由地切换频道,并且在消除拥塞的同时优化多个带宽的使用。
  • 在最简单的形式下,RSVP使用了基于生成树的组播路由。每个组都分配一个组地址。为了给一个组发送数据包,发送方把该组地址放到这些数据包中。然后,标准的组播路由算法建立起一棵覆盖所有组成员的生成树。路由算法并不是RSVP中的一部分。与常规组播的唯一不同之处是这里的组播需要一些额外的信息,这些信息被周期性地组播给生成树中的路由器,告诉它们在内存中维护特定的数据结构。
  • 举例来说,如图a。主机1和主机2是组播发送方,主机3、4和5是组播接收方。在这个例子中,发送方和接收方是分离的;但是在一般情况下,这两个集合可以重叠。针对主机1和主机2的组播树分别如图b和c所示。为了获得更好的接收效果并且消除拥塞,一个组的任何接收方都可以沿着树给组播发送方发送一条预留信息。利用前面讨论过的逆向路径转发算法,该预留消息被传播到发送方。在沿途的每一跳,路由器会注意到此预留信息,并预留必要的带宽。在前一节中我们已经了解到如何使用加权公平队列包调度算法来进行资源预留。如果没有足够的带宽。它就返回报告失败,当这条预留消息到达组播发送方时,从发送方到该接收方一路上的带宽到得到预留,因为沿着生成树完成了预留。在这里插入图片描述
  • 下图a中显示了一个这种资源预留的例子。在这里,主机3请求一条通向主机1的信道。一旦该信道被建立起来,则从主机1到主机3的数据包流将不再遭遇语塞。现在请考虑,如果接下来主机3为了能同时观看两套节目,要预留一条通向另一个发送方(即主机2)的信道。第二条预留的路径如图b所示。请注意,从主机3到路由器E之间需要两条独立的信道因为传输的是两个独立的流。在这里插入图片描述
  • 最后在图c中,主机5决定观看主机1传送的节目,因而也请求预留带宽。首先,在主机5到路由器H之间,要预留专门的带宽。然而,路由器H看到自己已经有了一份来自主机1的流,所以既然所需的带宽已经预留了,就没有必要再次预留。不过主机3和主机5请求的带宽数量可能会不相同(比如主机3在小屏幕上播放节目,只需要低分辨信息),所以预留的带宽必须足够大,才能满足最贪婪的接收方。
  • 在进行资源预留时,接收方可以(有选择地)指定一个或多个期望接收的数据源。它也可以说明在预留期间这些选择是否固定不变,或者是否希望以后还可以改变数据源。路由器利用这些信息来优化带宽的使用计划。尤其是,如果两个接收方都同意以后不再改变数据源的话,那么它们只需共享一条路径即可。
  • 采用了这种完全动态策略的理由是将被预留的带宽于数据源的选择分离开。一旦接收方已经预留了带宽,那么它可以直接切换到另一个数据源,保留现有路径上那部分带宽并且对新数据源仍然有效。例如,如果主机2正在实况传输几个视频流,比如这是一个拥有多个节目频道的TV电视台,那么主机3可以随机在这几个频道之间切换,而不用改变 它所做的预留。

6、区分服务

  • 基于流的算法有能力为一个或者多个流提供非常好的服务质量,因为它们在沿途路由上保留了必要的资源。然而,这些算法有一个缺点,它们都需要为每个流预先进行设置。当存在数千个或数百万个流时,这些算法就不能很好地扩展使用;而且,在路由器中为每个流维护一个内部状态很容易导致路由器的崩溃;最后,为了设置数据流,需要修改的路由器代码量很大,而且还涉及复杂的路由器—路由器之间的消息交换。而且,尽管综合服务方面的研究工作还在继续并往前推进,但RSVP几乎没有实际部署,类似的实现也很少(如今不知进展如何,本书撰写于2010年)。
  • 基于上述原因,IETF还设计了另一个更加简单的服务质量方法。该方法很大程度上由每个路由器本地实现,无须事先设置流,也不牵扯整条路径。这种方法称为基于类别的服务质量(相对于基于流的服务质量),还有另一个更流行的名称称为区分服务。IETF已经对该方法的体系结构进行了标准化,RFC 2474、2475和其他一些RFC文档对区分服务进行了详细描述。
  • 区分服务可以由一组路由器提供,这些路由器构成了一个管理域(比如一个ISP或者一家电话公司)。管理规范定义了一组服务类别,每个服务类别对应于特定的转发规则。如果一个客户已经订购了区分服务,那么进入到该管理域的客户数据包就会被标记上它们属于哪类服务。这个信息可由IPv4和IPv6数据包的区分服务字段携带服务类别定义为单跳行为(PHP),对应于数据包在每个路由器得到的待遇,而不是对数据包在整个网络中保证。具有某种单跳行为(比如优质服务)的数据包相比其他数据包(比如普通服务)可以获得更好的服务。属于同一个类别的通信流量可能要先经过处理以便符合特定的形状特征,比如通过一个具有特定排空速率的漏桶。商业嗅觉灵敏的运营商可能针对每个优质服务类别的数据包收取额外的费用。这种方案并不要求提前设置,也没有资源预留,更不需要花时间为每个流进行端到端的协商。这些服务特征与综合服务有很大的不同,也使得区分服务相对容易实现。
  • 为了更好地理解基于流的服务质量与基于类别的服务质量之间的差异,请考虑一个实例:Internet电话。如果采用基于流的方案,每个电话呼叫都拥有它自己专用的资源,从而服务质量可以得到保证。如果采用基于类别的方案,则所有的电话呼叫合起来预留同一份预留给电话类别的资源。这些资源不能被网页流量类别或者其他类别的数据包夺走,但是任何一个电话呼叫也得不到独自享用的私有资源。

加速转发

  • 服务类别的选择取决于每个运营商,但是由于通常情况下大多数数据包需要在不同运营商的网络之间转发,所有IETF已经定义了某些与网络无法的服务类别。最简单的服务类别是加速转发,RFC 3246对此有详细的描述。
  • 我们可以把服务类别分成两类:常规的与加速的。绝大多数通信流量属于常规流量,但是有一小部分数据包需要加速转发。加速类别的数据包可以直接通过网络,就好像不存在其他任何数据包一样。这准,它们将获得低丢失、低延迟和低抖动服务,这正是VoIP所需的服务。这种 “双管道”系统的一种符号表示方法如图。这里依然只有一条物理路径,图中的两根逻辑管道只是表示了为不同类别服务预留带宽的方法,而不是有两条物理线路。在这里插入图片描述
  • 实现这种策略的一种做法如下:把数据包分类成常规和加速两种,做相应的标记。这一步可以在发送主机上完成,或者在入口(第一个)路由器上做。在发送主机上进行分类的好处是它可以利用更多的信息来确定哪些数据包属于哪些流。这个任务可以由网络软件甚至操作系统执行,以便更改现有的应用程序。当然如果标记工作由主机来做,则入口陆有成很可能就承担着监管流量的任务,确保客户没有发送比他们所付费用更多的加速流量。在网络内部,路由器针对每条出境线路可以有两个输出队列,一个用于加速数据包,另一个用于常规数据包。通过这种方式,加速数据包看到的是一个没有负载的网络,即使事实上普通流量的负载很重。

确保转发

  • 服务管理类别的一种更精细方案称为确保转发。确保转发服务由RFC 2597定义,它规定了4种优先级别,每种级别都拥有自己的资源。前三种服务类别或许可以称为金质、银质和铜质。而且,标准还针对正经历拥塞的数据包定义了三种丢弃概率:低、中、高。将这两个因素结合起来,共有12中服务类别。
  • 下图显示了一种确保转发下的数据包处理办法。第一步是将数据包分成4个优先级别,这一步有可能在发送主机上完成,也可能在入口路由器上完成,高优先级数据包的速率可作为服务供给的一部分运营商限制。在这里插入图片描述
  • 下一步是确定每个数据包的丢包类别。每个优先级别的数据包穿过一个诸如令牌桶这样的流量监管器,可以完成这个工作。该监管器让所有的流量都通过,但它根据突发流量大小来标识数据包的丢包概率:符合小突发量的标为低概率、大于小突发量的标为中概率、超过大突发量的标为高概率。然后将优先级和丢包概率结合起来,编码到每个数据包中。
  • 最后,数据包由网络内部的路由器处理,路由器上的数据包调度器区分不同类别的数据包。一般的选择是针对4个优先级类别采用加权公平队列,给予较高的类别以较高的权重。在这种方式中,高优先级别的数据包将获得大部分的带宽,但较低优先级别的数据包也不会饿死。例如,如果一个类别的权重是低一级类别权重的两倍,则高类别数据包将获得两倍于低类别数据包的带宽。在同类别的优先级内部,具有较高丢包概率的数据包可被运行的算法优先丢弃,比如前述的RED算法(随机早期检测)。当刚刚出现拥塞苗头且路由器还有缓冲空间时,RED就开始丢弃数据包。在这个阶段,路由器仍然有缓冲空间用来接收低丢包概率的数据包,而丢弃高丢包概率的数据包。

版权声明:本文为ao__ao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。