首页 > 代码库 > 读书笔记:计算机网络9章:QoS服务质量

读书笔记:计算机网络9章:QoS服务质量

章节概述


本章节主要讲QoS服务质量。涉及到网络层、传输层和应用层。


QoS和用户需要得到的服务种类有关。不同的服务需要的带宽、延迟、丢包率都是不一样的。QoS是未来互联网的重要问题之一。


目前的互联网没有服务质量保证。因为目前的网络只是将数据包尽力投递到对方服务器,然而投递的速度、延迟、丢包率都是没有保障的。但是有时候“尽力”投递是不够的,因为有些应用需要有性能方面有保障,比如VoIP电话。虽然我们不能增加现有网络的带宽,但是我们可以给用户分配不同的带宽给用户带来更多利益。


举个例子。假设现在有两台计算机都同时运行两个应用VoIP和BitTorrent。VoIP对网络的延迟要求比较高,BitTorrent对带宽的要求比较高。当两个应用同时运行的时候VoIP的通话质量就会因为延迟太高而大大削减。但是BitTorrent几乎不会受到VoIP的影响。为了解决这个问题,提出了两种方法。第一种方法就是将一条线路拆分成两条线路,从而让每条线路各占一半的带宽。其中一条线路用来传输VoIP数据包,另一条线路用来传输BitTorrent数据包。这样VoIP的延迟就不会受到BitTorrent的影响了。但是BitTorrent的带宽却只有原来的一半。所以这种方法并不是最好的办法。第二种方法是,通过设置将VoIP的数据包优先传递,这样就既能保证VoIP的通话质量,又能保证BitTorrent的带宽,是一种双赢的方法。


QoS就是通过分配带宽来提升应用的用户体验的一种方法。它可以保证应用的贷款、让多个应用可以同时使用同一条线路而不影响体验,后续章节我们还将探讨数据包的优先级。


为了提供QoS,我们需要知道应用需要多少带宽、延迟和丢包率。下表展示了不同的应用对网络的需求。


应用带宽延迟

Jitter

延迟的变化范围

丢包率
邮件
文件共享            
网页访问                                    
远程登录                                    
在线音频            
在线视频                        
电话                        
视频会议                                    

从表中可以看出,不同的应用对网络的要求是非常不同的。



接下来讲一讲过度供应的问题。QoS只有在网络中存在瓶颈的时候才能起到作用。因为如果没有瓶颈,就意味着没有丢包、没有消息队列,也就无从优化了。过度供应是QoS的一种替代方法。这种方法要求建立强大的网络,让整个网络不发生阻塞。显然这种方法是不现实的。


本章大致的内容有:应用对网络的需求、实时通信、流媒体通信、消息队列中的公平问题、流量整形、增量式服务(Differentiated services)、速度和延时的保障。


实时传输


本节讲的是交互媒体的实时网络通信,VoIP就是一个很好的例子。实时传输通过网络“尽力”传输,然后在到达对方后,对方将声音进行缓冲,然后播放。


实时传输最大的问题在于网络延迟。首先考虑VoIP的发送方。发送方有一个麦克风不断地产生音频数据。这就要求网络有足够的带宽来传输这些音频数据。网络延迟的变化是很快的,幅度也很大。网络延迟由两个方面组成,包括消息延时和队列延时。通常情况下,消息延时基本上是保持不变的。而变化最多的队列延时。网络延时的变化速度和幅度称之为jitter。


现在考虑VoIP的接收方。在理想的情况下,网络延时很小而且固定不变。这样的话就可以通过网络模拟电话了。理想的情况如下图1。但是实际情况下,由于网络的延时一直在变化,接收方收到数据的速度是不均匀的,甚至顺序也有可能颠倒。实际情况如下图2。




为了解决这个问题,在播放声音的时候加入了缓冲区。这样就能将快速变化的网络延时进行平滑。上图3展示了有缓冲的情况。粉红色的部分是缓冲,有了缓冲才能让声音连续地播放。注意到图中有一段音频延时太大,超过的缓冲区的时间。这种情况下播放声音的时候就会跳过这段,因为音频数据已经超时了。为了减少超时发生的次数,可以增加缓冲区的长度。但是缓冲区并不是越长越好。因为缓冲区太长就会导致延时过高,用户之间无法沟通。另外,如果缓冲区太短,就会让超时发生的次数增加,影响通话质量。所以缓冲区的长度要根据实际情况选择一个合适的长度。通常情况下VoIP无法恢复丢失的一小段音频,因为VoIP是实时通信的。 


接下来讲一下实时通信的组成部分。一次实时通信由这些部分组成:用SIP来进行会话配置,用SDP描述一次会话,用RTP来传输流媒体数据,用缓存技术播放流媒体。流媒体可以包括视频、音频等。


RTP就是实时传输协议,用来传输实时的流媒体数据。它基于UDP协议。协议头部包含了流媒体格式、时间戳、序号等。媒体格式一般是标准的格式,比如G.711、MP4等。值得注意的是,协议中包含了时间戳的字段。有了时间戳才能在播放的时候进行同步。


SIP是会话初始化协议,用来在IP协议层上建立音频或视频连接。这个协议只是一种信号,真正传输数据是通过RTP(或其他)协议进行的。题外话,Skype使用的不是SIP协议,而是另外一种专利协议。SIP是用来控制拨号的。它的表现形式类似于HTTP,使用简单的“操作”“回应代码”来完成操作。可以运行于UDP或者TCP。SIP代理服务器可以给移动设备提供服务。下图展示了SIP协议的工作流程。图中用到的操作有INVITE、ACK、BYE,回应代码有180 RINGING、200 OK。




流媒体


本节主要讲的是通过网络实时播放流媒体。所谓的流媒体就是指网络上的视频、音频等。比较常见的流媒体网站有Coursera, Youtube, Netflix等。流媒体的应用非常广泛。


接下来讲一下流媒体和VoIP的区别。流媒体所需要的网络质量比VoIP低。VoIP需要双向传输音频,而流媒体只需要考虑从服务器传输到客户端这样一个方向就行了。而且流媒体不一定需要较低的延时,延时高只会导致播放流媒体之前需要缓冲比较久的时间,在播放的时候还是比较流畅的。流媒体和VoIP有一个共同点就是都需要考虑带宽和jitter延时跳动。


接下来讲一下解决延时jitter延时跳动的方法。在播放流媒体之前,播放器会缓冲一段时间。当缓冲区准备就绪之后播放器才开始播放。有了缓冲区,网络延时的跳动就不会被用户感觉到了。当缓冲区中的数据偏少时,播放器就开始下载更多的数据;当缓冲区中的数据快要满时,播放器就停止下载数据。


带宽问题也是流媒体需要考虑的。为了解决带宽问题,服务器方面需要准备多种编码的流媒体。每种编码格式所需带宽是不同的。质量高的编码格式需要的带宽高,质量低的编码格式所需要的带宽低。客户端在播放流媒体的时候会根据当前的网络环境选择最合适的编码格式。这样带宽不管是高还是低都可以流畅地播放流媒体,只是媒体质量上会有一些差别。


那么流媒体的传输通过哪种协议比较好呢?TCP还是UDP?首先比较一下这两种协议吧。UDP能减少消息的延时,而TCP能保证传输质量。 我们知道,流媒体不一定需要较低的延时,所以在实际应用中一般使用TCP传输流媒体。TCP让流媒体在传输的过程中不需要考虑丢包、恢复等情况,简化了传输协议。如果使用TCP的话,还可以通过HTTP进行传输,部署起来比较方便,而且服务器端能透过防火墙接收HTTP请求,这样就不需要额外的配置了。


流媒体由四个部件组成:通过RTSP发起请求,通过HTTP传输流媒体,通过缓存技术播放流媒体,使用HTML5标准。流媒体服务商可以通过CDN来支持更多的用户。


RTSP就是实时流媒体协议。它的工作方式可以参考下图。首先第一步是客户端发起HTTP请求试图获取流媒体的基本信息。第二步是服务器返回流媒体的基本信息。第三步是客户端将流媒体的基本信息传递给媒体播放器。然后第四步就是媒体播放器通过RTSP协议向媒体服务器发起请求。第五步是服务器通过TCP或UDP将流媒体数据传输到客户端。这样就实现了流媒体的播放。




除了RTSP以外,还有一种传输流媒体的方式,那就是通过HTTP。首先客户端从服务器获取流媒体的描述信息,包括索引、大小、速度等。索引中包含了流媒体的各个分段信息。然后客户端根据索引依次从服务器获取流媒体的各个分段,并存放到缓冲区中用于播放。播放器还会根据网络带宽的情况自动选择最合适的编码格式。这种协议名为DASH,基于HTTP的动态自适应流媒体,仍然处于发展阶段。它提升了HTTP和HTML5的价值。同时,服务端仍然不需要知道客户端所处的状态,只需要根据客户的请求作出相应的回应即可。


公平队列


本节主要话题是在共享带宽的时候如何保证带宽的合理分配,主要是通过带权重的消息队列保证带宽合理分配。这是QoS中比较关键的部分。


首先介绍一下最传统也是最简单的队列方式,那就是FIFO先进先出的队列。FIFO在队列满的时候会丢弃新接收的数据包。这种队列没有优先级机制,所有的信息都是平等对待的。所以带宽的分配主要是根据协议的行为来进行分配,数据包多的协议占的带宽自然就多。下图展示了FIFO队列的工作过程。




轮询队列是另外一种队列算法,它提高了队列的公平性。最基本的规则就是按照信息流将数据包进行分类,然后轮流传输各个分类中的数据包。下图展示了工作过程。这种队列算法的优点就是每个用户几乎都感觉不到带宽的延时。但是有缺点,就是不同的数据包大小会造成带宽分配的不公平。




公平队列在轮询队列的基础上作了一些改进。它会考虑数据包的大小,这样就不会因为数据包大小的不同而造成带宽分配不公平了。公平队列先大致计算一个数据包发送的完成时间。这里的时间并不是我们生活中的时间,而是将路由器中的计数器当作时钟。这个计数器在每发送1比特数据后就增加1。数据包的发送顺序按照数据包的虚拟完成时间进行排序。这种方式并不是最完美的,因为数据包没有优先级机制。以下是虚拟完成时间的计算公式。

Arrive(j) = 第j个包的到达时间
Length(j) = 第j个包的数据包长度
Finish(j) = max(Arrive(j), Length(j)) + Length(j)


WFQ加权公平队列是公平队列的推广形式。它仅仅在公式中做了稍微的修改。如果需要给某个数据流分配2倍带宽,只需要将Weight=2代入公式即可实现。

Arrive(j) = 第j个包的到达时间
Length(j) = 第j个包的数据包长度
Finish(j) = max(Arrive(j), Length(j)) + Length(j) / Weight

WFQ的功能强大,它可以防止数据流之间竞争,也可以给数据流提供优先级机制,是计算机网络中重要的组成部分。但是目前WFQ仍然不是一个完美的解决方案。我们不知道如何去区分一个数据流,按用户区分还是按应用区分还是按TCP连接进行区分呢?WFQ很难应用于实际中,因为实际情况是网络速度快、数据流非常多,所以WFQ很难实现。WFQ需要给不同的数据流分配不同的权重,比如Skype的权重大,BitTorrent的权重小,权重尚且没有标准的规定。


流量整形(Traffic Shaping)


本节的话题是通过流量整形来防止网络数据的突然爆发,主要通过标记桶来实现,它是QoS中重要的组成部分。


流量限制就是限制数据传输到网络上的速度。限制流量之后才能保证其他用户的带宽,限制数据流量的突然爆发可以避免不必要的延时和丢包。我们应该怎样实现流量限制呢?实际生活中的应用所产生的网络流量非常不同。下图中Flow A和Flow B是两种不同的数据流,它们的平均速度是一样的,但是它们的形状相差很大。所以就描述网络流量而言,平均速度并不是最好的表示方法。平均速度只能反映长期占用的带宽,而无法反映瞬时占用的带宽。我们需要找到一种更加合理的表示方法,它能够反映长期占用的带宽,也能够反映瞬时占用的带宽。这两种特性是非常实用的,它比平均速度的表达能力更加强大,从使用角度而言,它也相对简单。




标记桶是一个二阶向量,记为(R,B)。R表示平均传输速度,B表示整个传输过程中最大速度为R+B。下图表示了在标记桶的限制之下,网速没有呈现出爆发性。横坐标表示时间,纵坐标表示总共发送的比特数。下面那条红线表示平均速度×时间,上面那条红线表示最多能达到的网络流量。有了流量整形,网络的流量就被限制在两条红线之间,这样就不会有网络数据突然爆发的问题了。




标记桶可以有两种用途。一种是用于流量的整形,另外一种是用于策略控制。流量整形就是主机通过运行(R,B)标记桶来防止数据爆发。当达到标记桶的极限时,就将数据包延迟之后再发送。流量整形是为了遵守进网协议。另外一种用途是策略控制。它用来验证网络流量是否达到(R,B)标记桶的要求。当网络流量超出极限时,就将超出部分的数据表进行丢弃。策略控制是用来检测用户是否遵守了进网协议。


标记桶在QoS中有很大的用途。标记桶帮助用户调整网络流量,从而实现QoS服务质量。网络提供商可以通过标记桶限制网络流量,同时用户也可以自己选择限制流量。在其他一些特殊的场合也通过WFQ实现QoS。


分级服务


本节讨论的话题是根据不同的服务级别区别对待数据流。这种方法称之为粗略QoS,目前正在渐渐地普及。


回到上几节中的几个例子,两个用户同时运行Skype和BitTorrent。为了保证通话质量,对于Skype的数据包,给它加上VIP标志,这样在Skype的数据包就能在网络中优先传输了,从而保证了通话质量。


分级服务的基本思想就是将网络服务分成不同的级别,比如金牌级别、银牌级别、铜牌级别等,不同的级别享有不同的网络优先级,不同的应用配置不同的服务级别。这就是分级服务的基本思想。比如将Skype设置成金牌级别的服务质量。ISP会使用标记桶来限制金牌服务的流量,会根据WFQ规则来实现优先传输Skype数据包。


那么如何将数据包进行标记呢?如何让路由器知道数据包的优先级如何?其实IPv4的头部就有一个字段用来描述优先级的,它叫DSCP分级服务代码。常见的DSCP见下表。DSCP标记可以通过用户的配置进行标记,也可以由主机或者应用进行标记,也可以通过路由器进行标记,路由器可以根据端口号等猜测应用,然后作出相应的标记。


服务名称DSCP值应用举例
默认值0BitTorrent
保证转发10-38流媒体
快速转发46VoIP,游戏
高优先级48路由协议

万一用户将所有的数据包都标记成最高优先级怎么办啊?所以为了保持网络的秩序,ISP需要确保数据包的优先级符合协议。数据包策略是通过标记桶来实现的,将超过极限的数据包降低优先级或者直接丢包。


ISP的路由器中的消息队列是通过WFQ来实现的,而不是普通的FIFO。不同的服务质量对应着不同的数据流,DSCP值就是用来区分不同数据流的啊。下图展示了通过WFQ优先级算法。




QoS的普及度还不是很高。因为只有当QoS普及之后才能发挥作用,不然只能在单个ISP中使用。另外QoS对资费是很敏感的,有些应用可能将所有的数据包都设置成高优先级的,但是用户完全不知道。正是因为这两种情况导致了普及缓慢。


速度保证/延时保证


本节主要的话题是如何保证网络的通信质量。这种保证是一种“硬QoS”,它能保证网络性能有一个具体的数值。


有时候我们想要网络有一个特定的性能:最大速度,最小延时,并且性能不受到其他人的影响。就像电话一样。为了达到这种性能,我们可以建立一条专线来进行通信,但是显然这种方案太昂贵,我们能不能通过和别人共享网络达到硬性的网络性能呢?


假如我们想要以一定的速度R和一定的延时D连接到网络,当网络性能不能达到我们的要求时,我们就需要拒绝连接,相反如果网络性能可以达到要求那就继续连接。当然拒绝连接应该是很少出现的一种情况。这就是Admission Control许可控制。最关键的地方在于我们需要控制网络负载来达到指定的网络性能。


WFQ可以保证路由器中某条数据流的速度。如果所有数据流的权重之和为100,数据流F的权重为10,那么数据流F的速度就是总带宽的10/100。对于多个路由器而言,只要每个路由器都能达到速度要求,整条线路就能达到要求了。


那么如何保证队列延时小于某个值呢?队列延时和数据流量有关,如果流量过大,就会导致延时增加,使得网络性能无法达到要求。所以需要将数据流进行整形,整形的方法就是标记桶。假设数据流经过(R,B)标记桶进行整形,那么最坏的情况就是B比特的数据同时到达路由器,那么队列延时就是B/R秒。对于多个路由器,并不是将所有路由器的延时相加那么简单。首先假设网络中没有任何消息队列,那么数据传输将不需要排队,队列延时就是0。同样地,当数据流通过第一个路由器之后,数据流被重新整形过了,在后续的路由器中是不需要排队的。也就是说对于多个路由器的情况,只需要考虑第一个路由器的延时即可。所以整条线路的延时=传播延时+B/R。