|
TC HTB流量控制
一.背景簡介 最近幾個(gè)月在參與一個(gè)軟路由器的開發(fā).該路由器的流量控制功能由TCHTB實(shí)現(xiàn)。下面寫點(diǎn)總結(jié)性的文字,因水平有限,不對(duì)之處敬請各位及時(shí)指出。 TC為TrafficControl的縮寫,HTB顧名思義是一個(gè)層次式的過濾框架,我們可以通過配置TC HTB規(guī)則來實(shí)現(xiàn)流量控制. 二.基本概念 TC規(guī)則涉及到隊(duì)列(queue),分類器(class)和過濾器(filter)三個(gè)概念. 隊(duì)列用來實(shí)現(xiàn)控制網(wǎng)絡(luò)的收發(fā)速度.通過隊(duì)列,linux可以將網(wǎng)絡(luò)數(shù)據(jù)包緩存起來,然后根據(jù)用戶的設(shè)置,在盡量不中斷連接(如TCP)的前提下來平滑網(wǎng)絡(luò)流量.需要注意的是,linux對(duì)接收隊(duì)列的控制不夠好,所以我們一般只用發(fā)送隊(duì)列,即“控發(fā)不控收”,。 class用來表示控制策略.很顯然,很多時(shí)候,我們很可能要對(duì)不同的IP實(shí)行不同的流量控制策略,這時(shí)候我們就得用不同的class來表示不同的控制策略了. filter用來將用戶劃入到具體的控制策略中(即不同的class中).正如前述,我們要對(duì)A,B兩個(gè)IP實(shí)行不同的控制策略(C,D),這時(shí),我們可 用filter將A劃入到控制策略C,將B劃入到控制策略D,filter劃分的標(biāo)志位可用u32打標(biāo)功能或IPtables的set-mark功能來實(shí) 現(xiàn)。 三、應(yīng)用過程 我們要實(shí)現(xiàn)這樣的功能。局域網(wǎng)中的用戶分為兩類:特權(quán)用戶和普通用戶,對(duì)特權(quán)用戶和普通用戶的各應(yīng)用的上行/下載實(shí)現(xiàn)獨(dú)立的控制。設(shè)eth0為內(nèi)網(wǎng)網(wǎng)絡(luò)接口,eth1位外網(wǎng)網(wǎng)絡(luò)接口。 i)首先在eth0和eth1分別建立qdiscA和 qdiscB。qdiscA控制外網(wǎng)數(shù)據(jù)注入內(nèi)網(wǎng)的速度,因此是用來控制下行速度的;qdiscB控制內(nèi)網(wǎng)數(shù)據(jù)灌入外網(wǎng)的速度,因此是用來控制上行速度的。示例指令如下。 tc qdisc add dev eth0 root handle 1:htb default 91 解釋如下:無論是隊(duì)列,還是class和filter都有ID之類的標(biāo)志符,一般都有parent,注意ID具有接口本地性,不同的網(wǎng)絡(luò)接口可以有相同的ID。對(duì)于這里因?yàn)?/font>qdisc在頂部,所以parent無,用'root'字樣來標(biāo)識(shí),ID用1:來標(biāo)志,'default 91'表示當(dāng)某個(gè)ip流不滿足任何已設(shè)定的filter規(guī)則時(shí),將自動(dòng)歸入class 91中.更詳細(xì)的指令規(guī)則說明請參考手冊. ii)然后在qdisc下建立兩個(gè)root class,分別用來控制普通用戶和特權(quán)用戶的帶寬(對(duì)于eth0是用來控制下行帶寬,對(duì)于eth1是用來控制上行帶寬的).示例指令如下. tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2 解釋如下:rate是指在帶寬緊張的情況下的最大網(wǎng)絡(luò)速度,當(dāng)帶寬空閑時(shí),class可通過向其兄弟借用帶寬而達(dá)到ceil大的網(wǎng)絡(luò)速度,注意,借用表兄弟之間也可借用帶框.prio用來指示借用帶寬時(shí)的競爭力,prio越小,優(yōu)先級(jí)越高,競爭力越強(qiáng). iii)接著針對(duì)不同的應(yīng)用在各rootclass下設(shè)置不同的類,.示例如下. tc class add dev eth0 parent 1:30 classid 1:31 htbrate 0.5mbit ceil 2mbit prio 3 指令意義同ii). 同時(shí)為了不使一個(gè)會(huì)話永占帶寬,在葉子結(jié)點(diǎn)(即本文的各應(yīng)用結(jié)點(diǎn))添加隨即公平隊(duì)列sfq. tc qdisc add dev eth0 parent 1:31 handle 31:sfq perturb 10 iv)接著添加過濾器. tc filter add dev eth0 parent 1: protocol ipprio 31 handle 31 fw flowid 1:31 v)用iptable打標(biāo) iptables -t mangle -I FORWARD -i eth1-p tcp --sport %80 -d $IPaddr--j MARK --set-mark 31 iptables -t mangle -I FORWARD 2 -i eth1 -d $IPaddr--j RETURN 注意下行速率在eth0處控制,但打標(biāo)應(yīng)在進(jìn)入eth0前進(jìn)行,所以規(guī)則中出現(xiàn)了'-i eth1'字樣.下行達(dá)標(biāo)規(guī)則可類推之. 四.遺留問題. 有很多細(xì)節(jié)需要考慮,如上行控制與下行控制應(yīng)比較獨(dú)立,即上行控制時(shí),對(duì)下行中局域網(wǎng)內(nèi)用戶上行的ack之類的包應(yīng)不予限制,這個(gè)顯然應(yīng)在iptable之類的打標(biāo)上做文章,但我實(shí)在沒想出什么具體的打標(biāo)策略.有哪位比較清楚,煩請告訴我. 五.附圖. 整個(gè)應(yīng)用中的規(guī)則示意圖如下. ![]() |
|
|