QoS,ToS和DiffServ

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: [email protected]
来源:http://yfydz.cublog.cn

0. 摘要

QoS是目前网络技术中一个比较热的话题,本文就讨论实现QoS的一些底层的技术。

1. 概述

QoS(Quality of Service,服务质量)是用来描述网络的服务质量和数据优先权的。在互连网早期,各种数据都是平等的,网络带宽属于先来先得的自由抢占资源。随着互联网上数据类型的增加,对数据优先级需求也开始提出,比如对音频数据的实时性就要比视频数据高;而且付费用户希望自己数据的发送优先权也要高于免费用户。这些种种需求,促使了QoS的进一步研究和发展。

2. ToS (RFC 1349)

要实现QoS,首先就要对数据进行分类,而且分类标志就要在IP头的字段中,方便路由设备识别。对于IPv4包来说,有一个字段是用于描述数据包服务类型的,就是ToS(Type of Service)字段,8位,在RFC791中,该字段几乎还没有很明确的功能描述,可能是太超前了吧,当时还想不到会有扫描用。真正开始描述ToS字段的是RFC1349。

ToS的取值不是任意的,在RFC1349中定义如下:

              76543210
              00010000   --   minimize delay           0x10
              00001000   --   maximize throughput      0x08
              00000100   --   maximize reliability     0x04
              00000010   --   minimize monetary cost   0x02
              00000000   --   normal service           0x00

minimize delay:最小延迟,如telnet,FTP等
maximize throughput:最大吞吐量,如FTP的数据通道等
maximize reliability:最大可靠性,如SNMP等
minimize monetary cost:最小费用,如NNTP等

上面这4位最多只能有一位为1,最后一位必须为0。前3位用来表示数据优先级,但在一般网络实现中很少用,也一般为0,而在NetScreen防火墙中,使用ToS的前3位作为数据优先权的表示,所以可以设置0~7共8个优先级。

RFC1349定义的ToS功能相对较弱,不过不少路由协议如OSPF都可以根据ToS进行路由决策。

在IPv6(RFC2460)中,也有一个8位字段Traffic Class,用于区分数据优先级,但功能定义不遵守RFC1349。

2. DiffServ (RFC2474, 2475)

在RFC2474中重新定义了IPv4的TOS字段,并更名为DS字段,大小还是8位,废除了TFC1349中的定义。
RFC2474中的定义:

       0     1    2   3    4   5    6   7
      +---+---+---+---+---+---+---+---+---+
      |         DSCP              |  CU   |
      +---+---+---+---+---+---+---+---+---+

        DSCP: differentiated services codepoint
        CU:   currently unused

只有低6位有效,是一个大小不超过63的数。

这个定义同时支持IPv4(ToS字段)和IPv6(Traffic Class字段)。

在RFC2475中,详细描述了差别服务的体系结构。

3. QoS

有了数据级别,剩下的就是路由设备如何根据数据级别来转发数据包了,算法有简单的也有复杂的,理论用的最多的就是排队论了,俺一个大学同学后来出国读博士的题目就是和QoS有关的,他的论文俺也没看过,不过数学太深的俺也看不懂了。在linux内核中,有了多种QoS分配算法,在net/sched目录下,算法包括:CBQ、HTB、CSZ、ATM、RED、SFQ、TEQL、TBF、GRED等。在用户空间,可通过iproute2来进行控制,详细见Advance Routing

Howto.

在netfilter中,也有关于TOS目标用于ToS字段的修改等处理,可以配合iproute2实现数据分级控制。

4. 总结

QoS真正的难点还是在于数据的分发,但用Linux现有的open source的东西,也能做成一个相当不错的带QoS功能的路由器了。

你可能感兴趣的:(数据结构,linux,算法,互联网,网络协议)