本文檔的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功能的路由器了。