◆駱華杰 陳 洋 鄭仕龍
?
基于Linux的流量控制研究及應(yīng)用
◆駱華杰 陳 洋 鄭仕龍
(中國電子科集團(tuán)公司第三十研究所 四川 610041)
本文分析了流量控制的幾種功能,介紹了Linux系統(tǒng)下的流量控制模塊(TC),討論了 T C的隊(duì)隊(duì)規(guī)定、 分類和過濾器三個關(guān)鍵組件的相關(guān)細(xì)節(jié),并針對Linux流量控制的機(jī)制在分類時若處理不當(dāng)會降低帶寬的缺點(diǎn),結(jié)合具體實(shí)例,提出了一種流量控制設(shè)計(jì)。
Linux;TC;隊(duì)列;過濾器
當(dāng)今時代,為提高辦事效率,政府、學(xué)校、企業(yè)等機(jī)構(gòu)依托于互聯(lián)網(wǎng)開展各種業(yè)務(wù),隨著交互數(shù)據(jù)量的迅猛增加,如何保障主流業(yè)務(wù)占用絕大部分帶寬、對非主流業(yè)務(wù)進(jìn)行流量控制是一個值得研究的問題。流量控制能夠?qū)W(wǎng)絡(luò)帶寬進(jìn)行合理分配和規(guī)劃,比如根據(jù)不同的QoS劃分不同的流量類型,還可以允許帶寬合理借用,針對不種的流量執(zhí)行不同的流量控制策略,這樣可實(shí)現(xiàn)有限帶寬下網(wǎng)絡(luò)的最優(yōu)利用。
Linux作為當(dāng)前網(wǎng)絡(luò)設(shè)備中應(yīng)用最廣泛的操作系統(tǒng),其自帶的流量控制模塊TC也正在越來越多的被研究和使用。本文利用流量控制模塊TC對數(shù)據(jù)包進(jìn)行應(yīng)用層協(xié)議識別、分類,設(shè)計(jì)了一個高效的流量控制系統(tǒng)。
Linux的流量控制模型如圖1所示,該模型基于Linux網(wǎng)橋模式,使用TC對內(nèi)網(wǎng)傳輸?shù)臄?shù)據(jù)進(jìn)行識別和標(biāo)記完成流量控制。
圖 1 Linux流量控制模型
Linux內(nèi)核發(fā)展到現(xiàn)在,其流量控制模塊TC已經(jīng)比較成熟穩(wěn)定。TC的三個組件:隊(duì)列規(guī)定(Qdisc)、過濾器(Filter)、類(Class)。
(1)隊(duì)列規(guī)定
每個網(wǎng)卡都與一個隊(duì)列規(guī)定(Qdisc)相聯(lián)系,當(dāng)有報(bào)文分組需要從網(wǎng)卡發(fā)送出去,會把該報(bào)文分組添加到該網(wǎng)卡對應(yīng)的隊(duì)列規(guī)定中,并由該隊(duì)列規(guī)定決定報(bào)文分組的發(fā)送順序。故流量控制只能在隊(duì)列規(guī)定中進(jìn)行。
隊(duì)列規(guī)定分為兩種:無類隊(duì)列規(guī)定(Classless Qdisc)和分類隊(duì)列規(guī)定(Classful Qdisc)。
無類隊(duì)列規(guī)定比較簡單,能夠接收數(shù)據(jù)包和重新編排、 延遲或丟棄數(shù)據(jù)包??捎米鲗W(wǎng)卡的流量進(jìn)行整形, 不細(xì)分各種情況, 屬于粗放型的流量管理。常見的無類隊(duì)列規(guī)定有先進(jìn)先出 (pfifo_fast)、隨機(jī)公平隊(duì)列 (SFQ)、令牌桶過濾器(TBF)。
分類隊(duì)列規(guī)定的概念中又延伸出類 (Class) 和過濾器(Filter)兩個組件,在類和過濾器的支持下,Linux可以根據(jù)數(shù)據(jù)包的類型、優(yōu)先級別、端口等來區(qū)分不同類型的流量,然后通過不同的規(guī)則來控制數(shù)據(jù)包的發(fā)送,從而實(shí)現(xiàn)對流量的控制。
(2)三種常見的分類隊(duì)列規(guī)定
①優(yōu)先級隊(duì)列(PRIO Qdisc,PRIO)
PRIO 隊(duì)列規(guī)定僅根據(jù)配置的過濾器把流量進(jìn)一步細(xì)分,不進(jìn)行流量整形。PRIO 隊(duì)列規(guī)定是pfifo_fast 的一種衍生物,區(qū)別在于每個波段都是一個單獨(dú)的類,非簡單的FIFO。
PRIO 隊(duì)列規(guī)定中有數(shù)據(jù)包進(jìn)入,它將根據(jù)你給定的過濾器設(shè)置選擇一個類。
PRIO 隊(duì)列規(guī)定實(shí)現(xiàn)對流量進(jìn)行優(yōu)先級管理很容易, 發(fā)送完高優(yōu)先級類別的數(shù)據(jù)包, 才會發(fā)送低優(yōu)先級類別的數(shù)據(jù)包。
②基于類的隊(duì)列(Class Based Queueing,CBQ)
CBQ既具有帶寬優(yōu)先級管理的能力, 又具有固定帶寬的能力,實(shí)現(xiàn)了一個豐富的共享連接的類別層次。CBQ確保一定的傳輸速率下,根據(jù)對流量特征處理數(shù)據(jù)包,在接收數(shù)據(jù)包時根據(jù)IP協(xié)議頭、 IP地址、應(yīng)用程序或協(xié)議、URL或其它參數(shù)等進(jìn)行分類。
③分層的令牌桶(HierarchicalTokenBuchet,HTB)
HTB的分層機(jī)制較好地滿足這樣一種情況:在帶寬固定的情況下實(shí)現(xiàn)對每個類別的帶寬分配,且允許特定的類可以突破帶寬上限,占用其它類的空閑帶寬,對于要在具有固定連接速率的鏈路上實(shí)現(xiàn)帶寬管理非常方便。
從以上一些概念及其相關(guān)內(nèi)容的描述不難看出,分類隊(duì)列規(guī)定不僅可以看作是一個分類器,可以使流量得到分類;而且也可以看作是一個整形器,因?yàn)樗鼘?shí)際上也起了限制帶寬的整形作用。
在分類隊(duì)列規(guī)定中,分類器負(fù)責(zé)流量大小及分類,過濾器為分類選擇適當(dāng)?shù)臄?shù)據(jù)包。
(3)過濾器
過濾器應(yīng)用于分類隊(duì)列中。一個過濾器根據(jù)源IP地址、端口、目地IP、端口、協(xié)議類型、TOS 字段等參數(shù)對進(jìn)入隊(duì)列的數(shù)據(jù)包分類。常用的過濾器有種:fw、u32、route等。
fw 依據(jù)防火墻如何對這個數(shù)據(jù)包做標(biāo)記進(jìn)行判斷。
u32依據(jù)數(shù)據(jù)包中的各個字段進(jìn)行判斷,如源IP 地址等。
route依據(jù)數(shù)據(jù)包將被哪條路由進(jìn)行路由來判斷。
過濾器中提供可設(shè)置的參數(shù)一般有protocol、parent、prio、handle。其中protocol和parent是必要參數(shù)。protocol指示過濾器接受的協(xié)議,parent用來指示附帶在哪個已經(jīng)存在的句柄上。
prio指的是分類器的優(yōu)先權(quán)值。優(yōu)先權(quán)值低的優(yōu)先。
Handle是過濾器句柄的描述。對于不同過濾器,它的意義不同。
命令格式:tc qdisc add dev DEV parent qdisk-id|root handle qdisc-id qdisc qdisc specific parameters
例如需要為網(wǎng)卡eth1配置一個HTB隊(duì)列,使用下列命令:
tc qdisc add dev eth1 root handle 1:htb
其中,“add”示意要添加一個隊(duì)列,“dev eth1”示意要操作的網(wǎng)卡為eth1?!眗oot”示意為網(wǎng)卡eth1添加的是一個根隊(duì)列?!癶andle 1:”示意該隊(duì)列的句柄為1:?!癶tb”示意該隊(duì)列為HTB隊(duì)列。
命令格式:tc class add dev DEV parent qdisc-id
Classid class-id qdisc qdisc specific parameters
例如為根隊(duì)列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:”示意類別的父親為根隊(duì)列1:?!癱lassid 1:10”示意創(chuàng)建一個標(biāo)識為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”示意該過濾器應(yīng)該檢查報(bào)文分組的協(xié)議字段?!皃rio 1”示意它們報(bào)文處理的優(yōu)先級是相同的,對于不同優(yōu)先級的過濾器,系統(tǒng)將按照從小到大的優(yōu)先級順序來執(zhí)行過濾器,對于相同的優(yōu)先級,系統(tǒng)將按照命令的先后順序執(zhí)行。這幾個過濾器還用到了u32選擇器(命令中u32后面的部分)來匹配不同的數(shù)據(jù)流。以第一個命令為例,判斷的是dport字段,若該字段與0xffff進(jìn)行與操作的結(jié)果是80,則“flowid 1:10”表示將把該數(shù)據(jù)流分配給類別1:10。
某中小型企業(yè)的出口(網(wǎng)卡eth1)有100Mbit/s的帶寬,分配給WWW、E-mail和FTP三種數(shù)據(jù)流量,其中的FTP獨(dú)立分配10Mbit/s的帶寬。另一方面,WWW分配55Mbit/s的帶寬,E-mail分配35Mbit/s的帶寬。同時,它們又共享90Mbit/s的帶寬。
圖 2 業(yè)務(wù)帶寬需求圖
首先我們來了解HTB的特性:某一個類別中的所有子類別,均可共享該父類別所擁有的帶寬,而且每個子類別各自申請的帶寬能得到保證。當(dāng)某個數(shù)據(jù)流的實(shí)際使用帶寬小于配額時,剩余的帶寬可以被其它的數(shù)據(jù)流借走。入股該數(shù)據(jù)流的數(shù)據(jù)量增大,則被借走的帶寬部分將收回,用來保證該數(shù)據(jù)流的帶寬配額。
(1)在根隊(duì)列1中創(chuàng)建根類別1:5、根類別1:6,其中根類別1:5對應(yīng)FTP數(shù)據(jù)流,根類別1:6對應(yīng)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
本實(shí)例中,類別1:6包含類別1:61和類別1:62兩個子類別,故子類別1:61和類別1:62可共享分配90Mbit的帶寬,且子類別1:61的帶寬至少55Mbit,子類別1:62的帶寬至少35Mbit。因此我們可以看出,要構(gòu)建更加復(fù)雜的多層次類別樹,實(shí)現(xiàn)更加靈活的帶寬,共享和獨(dú)占模式達(dá)到企業(yè)級的帶寬管理目的,利用HTB類別和子類的包含關(guān)系可以實(shí)現(xiàn)。
網(wǎng)絡(luò)流量管控問題讓許多網(wǎng)絡(luò)管理者感到困擾, 如何根據(jù)實(shí)際業(yè)務(wù)制定靈活的網(wǎng)絡(luò)流量方案是當(dāng)今網(wǎng)絡(luò)管理者必須思考的課題。通過實(shí)踐證明通過 Linux平臺下的流量控制模塊TC可以實(shí)現(xiàn)網(wǎng)絡(luò)流量的有效管控,提升用戶的網(wǎng)絡(luò)服務(wù)體驗(yàn)。
[1]蔡文郁,金心宇,張昱.基于 Linux 的網(wǎng)絡(luò)流量控制機(jī)制[D].浙江:浙江大學(xué),2006.
[2]郭正球.基于Linux下TC的網(wǎng)絡(luò)流量管理[D].湖南:長沙航空職業(yè)技術(shù)學(xué)院,2010.
[3]高旸,聶永鋒.一種基于Linux下TC的流量控制管理架構(gòu)[D].重慶:重慶郵電學(xué)院,2006.
[4]周序生,陽愛民,孫星明等.TC控制器在校園網(wǎng)絡(luò)帶寬管理中的應(yīng)用[D].湖南:株洲工學(xué)院,2004.