转自: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功能的路由器了。