◆駱華杰 陳 洋 鄭仕龍
?
基于Linux的流量控制研究及應用
◆駱華杰 陳 洋 鄭仕龍
(中國電子科集團公司第三十研究所 四川 610041)
本文分析了流量控制的幾種功能,介紹了Linux系統(tǒng)下的流量控制模塊(TC),討論了 T C的隊隊規(guī)定、 分類和過濾器三個關鍵組件的相關細節(jié),并針對Linux流量控制的機制在分類時若處理不當會降低帶寬的缺點,結合具體實例,提出了一種流量控制設計。
Linux;TC;隊列;過濾器
當今時代,為提高辦事效率,政府、學校、企業(yè)等機構依托于互聯(lián)網(wǎng)開展各種業(yè)務,隨著交互數(shù)據(jù)量的迅猛增加,如何保障主流業(yè)務占用絕大部分帶寬、對非主流業(yè)務進行流量控制是一個值得研究的問題。流量控制能夠?qū)W(wǎng)絡帶寬進行合理分配和規(guī)劃,比如根據(jù)不同的QoS劃分不同的流量類型,還可以允許帶寬合理借用,針對不種的流量執(zhí)行不同的流量控制策略,這樣可實現(xiàn)有限帶寬下網(wǎng)絡的最優(yōu)利用。
Linux作為當前網(wǎng)絡設備中應用最廣泛的操作系統(tǒng),其自帶的流量控制模塊TC也正在越來越多的被研究和使用。本文利用流量控制模塊TC對數(shù)據(jù)包進行應用層協(xié)議識別、分類,設計了一個高效的流量控制系統(tǒng)。
Linux的流量控制模型如圖1所示,該模型基于Linux網(wǎng)橋模式,使用TC對內(nèi)網(wǎng)傳輸?shù)臄?shù)據(jù)進行識別和標記完成流量控制。

圖 1 Linux流量控制模型
Linux內(nèi)核發(fā)展到現(xiàn)在,其流量控制模塊TC已經(jīng)比較成熟穩(wěn)定。TC的三個組件:隊列規(guī)定(Qdisc)、過濾器(Filter)、類(Class)。
(1)隊列規(guī)定
每個網(wǎng)卡都與一個隊列規(guī)定(Qdisc)相聯(lián)系,當有報文分組需要從網(wǎng)卡發(fā)送出去,會把該報文分組添加到該網(wǎng)卡對應的隊列規(guī)定中,并由該隊列規(guī)定決定報文分組的發(fā)送順序。故流量控制只能在隊列規(guī)定中進行。
隊列規(guī)定分為兩種:無類隊列規(guī)定(Classless Qdisc)和分類隊列規(guī)定(Classful Qdisc)。
無類隊列規(guī)定比較簡單,能夠接收數(shù)據(jù)包和重新編排、 延遲或丟棄數(shù)據(jù)包。可用作對網(wǎng)卡的流量進行整形, 不細分各種情況, 屬于粗放型的流量管理。常見的無類隊列規(guī)定有先進先出 (pfifo_fast)、隨機公平隊列 (SFQ)、令牌桶過濾器(TBF)。
分類隊列規(guī)定的概念中又延伸出類 (Class) 和過濾器(Filter)兩個組件,在類和過濾器的支持下,Linux可以根據(jù)數(shù)據(jù)包的類型、優(yōu)先級別、端口等來區(qū)分不同類型的流量,然后通過不同的規(guī)則來控制數(shù)據(jù)包的發(fā)送,從而實現(xiàn)對流量的控制。
(2)三種常見的分類隊列規(guī)定
①優(yōu)先級隊列(PRIO Qdisc,PRIO)
PRIO 隊列規(guī)定僅根據(jù)配置的過濾器把流量進一步細分,不進行流量整形。PRIO 隊列規(guī)定是pfifo_fast 的一種衍生物,區(qū)別在于每個波段都是一個單獨的類,非簡單的FIFO。
PRIO 隊列規(guī)定中有數(shù)據(jù)包進入,它將根據(jù)你給定的過濾器設置選擇一個類。
PRIO 隊列規(guī)定實現(xiàn)對流量進行優(yōu)先級管理很容易, 發(fā)送完高優(yōu)先級類別的數(shù)據(jù)包, 才會發(fā)送低優(yōu)先級類別的數(shù)據(jù)包。
②基于類的隊列(Class Based Queueing,CBQ)
CBQ既具有帶寬優(yōu)先級管理的能力, 又具有固定帶寬的能力,實現(xiàn)了一個豐富的共享連接的類別層次。CBQ確保一定的傳輸速率下,根據(jù)對流量特征處理數(shù)據(jù)包,在接收數(shù)據(jù)包時根據(jù)IP協(xié)議頭、 IP地址、應用程序或協(xié)議、URL或其它參數(shù)等進行分類。
③分層的令牌桶(HierarchicalTokenBuchet,HTB)
HTB的分層機制較好地滿足這樣一種情況:在帶寬固定的情況下實現(xiàn)對每個類別的帶寬分配,且允許特定的類可以突破帶寬上限,占用其它類的空閑帶寬,對于要在具有固定連接速率的鏈路上實現(xiàn)帶寬管理非常方便。
從以上一些概念及其相關內(nèi)容的描述不難看出,分類隊列規(guī)定不僅可以看作是一個分類器,可以使流量得到分類;而且也可以看作是一個整形器,因為它實際上也起了限制帶寬的整形作用。
在分類隊列規(guī)定中,分類器負責流量大小及分類,過濾器為分類選擇適當?shù)臄?shù)據(jù)包。
(3)過濾器
過濾器應用于分類隊列中。一個過濾器根據(jù)源IP地址、端口、目地IP、端口、協(xié)議類型、TOS 字段等參數(shù)對進入隊列的數(shù)據(jù)包分類。常用的過濾器有種:fw、u32、route等。
fw 依據(jù)防火墻如何對這個數(shù)據(jù)包做標記進行判斷。
u32依據(jù)數(shù)據(jù)包中的各個字段進行判斷,如源IP 地址等。
route依據(jù)數(shù)據(jù)包將被哪條路由進行路由來判斷。
過濾器中提供可設置的參數(shù)一般有protocol、parent、prio、handle。其中protocol和parent是必要參數(shù)。protocol指示過濾器接受的協(xié)議,parent用來指示附帶在哪個已經(jīng)存在的句柄上。
prio指的是分類器的優(yōu)先權值。優(yōu)先權值低的優(yōu)先。
Handle是過濾器句柄的描述。對于不同過濾器,它的意義不同。
命令格式:tc qdisc add dev DEV parent qdisk-id|root handle qdisc-id qdisc qdisc specific parameters
例如需要為網(wǎng)卡eth1配置一個HTB隊列,使用下列命令:
tc qdisc add dev eth1 root handle 1:htb
其中,“add”示意要添加一個隊列,“dev eth1”示意要操作的網(wǎng)卡為eth1。”root”示意為網(wǎng)卡eth1添加的是一個根隊列。“handle 1:”示意該隊列的句柄為1:。“htb”示意該隊列為HTB隊列。
命令格式:tc class add dev DEV parent qdisc-id
Classid class-id qdisc qdisc specific parameters
例如為根隊列1創(chuàng)建1:10、1:20、1:30三個類別,它們分別占用55、35和10Mbit的帶寬。
tc class add dev eth1 parent 1:classid 1:10 htb rate 55Mbit ceil 55Mbit
tc class add dev eth1 parent 1:classid 1:20 htb rate 35Mbit ceil 35Mbit
tc class add dev eth1 parent 1:classid 1:30 htb rate 10Mbit ceil 10Mbit
其中“parent 1:”示意類別的父親為根隊列1:。“classid 1:10”示意創(chuàng)建一個標識為1:10的類別,“rate 55Mbit”示意系統(tǒng)將為該類別確保帶寬55Mbit,“ceil 55Mbit”示意該類別的最高可占用帶寬為55Mbit。
命令格式:tc filter add dev DEV protocol protocolname [parent qdisc-id|root] prio priority filtertype [filtertype specific parameters] flowid flow-id
例如分別將WWW、E-mail、FTP三種流量分配到上述三個類別1:10、1:20、1:30中。創(chuàng)建三個過濾器的命令如下:
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:20
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 21 0xffff flowid 1:30
其中,“protocol ip”示意該過濾器應該檢查報文分組的協(xié)議字段。“prio 1”示意它們報文處理的優(yōu)先級是相同的,對于不同優(yōu)先級的過濾器,系統(tǒng)將按照從小到大的優(yōu)先級順序來執(zhí)行過濾器,對于相同的優(yōu)先級,系統(tǒng)將按照命令的先后順序執(zhí)行。這幾個過濾器還用到了u32選擇器(命令中u32后面的部分)來匹配不同的數(shù)據(jù)流。以第一個命令為例,判斷的是dport字段,若該字段與0xffff進行與操作的結果是80,則“flowid 1:10”表示將把該數(shù)據(jù)流分配給類別1:10。
某中小型企業(yè)的出口(網(wǎng)卡eth1)有100Mbit/s的帶寬,分配給WWW、E-mail和FTP三種數(shù)據(jù)流量,其中的FTP獨立分配10Mbit/s的帶寬。另一方面,WWW分配55Mbit/s的帶寬,E-mail分配35Mbit/s的帶寬。同時,它們又共享90Mbit/s的帶寬。

圖 2 業(yè)務帶寬需求圖
首先我們來了解HTB的特性:某一個類別中的所有子類別,均可共享該父類別所擁有的帶寬,而且每個子類別各自申請的帶寬能得到保證。當某個數(shù)據(jù)流的實際使用帶寬小于配額時,剩余的帶寬可以被其它的數(shù)據(jù)流借走。入股該數(shù)據(jù)流的數(shù)據(jù)量增大,則被借走的帶寬部分將收回,用來保證該數(shù)據(jù)流的帶寬配額。
(1)在根隊列1中創(chuàng)建根類別1:5、根類別1:6,其中根類別1:5對應FTP數(shù)據(jù)流,根類別1:6對應90Mbit帶寬數(shù)據(jù)流。
tc qdisc add dev eth1 root handle 1:htb default 21
tc class add dev eth1 parent 1: classid 1:5 htb rate 10Mbit ceil 10Mbit
tc class add dev eth1 parent 1: classid 1:6 htb rate 90Mbit ceil 90Mbit
(2)在根類別1:6中,分別為WWW、E-mail數(shù)據(jù)流創(chuàng)建子類別1:61、子類別1:62。
tc class add dev eth1 parent 1:6 classid 1:61 htb rate 55Mbit ceil 90Mbit
tc class add dev eth1 parent 1:6 classid 1:62 htb rate 35Mbit ceil 90Mbit
(3)分別為FTP、WWW、E-mail數(shù)據(jù)流創(chuàng)建過濾器。
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:61
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:62
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 21 0xffff flowid 1:5
本實例中,類別1:6包含類別1:61和類別1:62兩個子類別,故子類別1:61和類別1:62可共享分配90Mbit的帶寬,且子類別1:61的帶寬至少55Mbit,子類別1:62的帶寬至少35Mbit。因此我們可以看出,要構建更加復雜的多層次類別樹,實現(xiàn)更加靈活的帶寬,共享和獨占模式達到企業(yè)級的帶寬管理目的,利用HTB類別和子類的包含關系可以實現(xiàn)。
網(wǎng)絡流量管控問題讓許多網(wǎng)絡管理者感到困擾, 如何根據(jù)實際業(yè)務制定靈活的網(wǎng)絡流量方案是當今網(wǎng)絡管理者必須思考的課題。通過實踐證明通過 Linux平臺下的流量控制模塊TC可以實現(xiàn)網(wǎng)絡流量的有效管控,提升用戶的網(wǎng)絡服務體驗。
[1]蔡文郁,金心宇,張昱.基于 Linux 的網(wǎng)絡流量控制機制[D].浙江:浙江大學,2006.
[2]郭正球.基于Linux下TC的網(wǎng)絡流量管理[D].湖南:長沙航空職業(yè)技術學院,2010.
[3]高旸,聶永鋒.一種基于Linux下TC的流量控制管理架構[D].重慶:重慶郵電學院,2006.
[4]周序生,陽愛民,孫星明等.TC控制器在校園網(wǎng)絡帶寬管理中的應用[D].湖南:株洲工學院,2004.