TC主要用於企業的,當然自己家也是可以用,不過我覺得沒有必要了,企業用網絡通常都會超過流量,或者流量不受控制,因此可以用TC來控制下服務器流量,下面就教教大家怎麼做。
TC介紹
在linux中,TC有二種控制方法CBQ和HTB.HTB是設計用來替換CBQ的。它是一個層次式的過濾框架。
TC包括三個基本的構成塊: 隊列規定qdisc(queueing discipline )、類(class)和分類器(Classifiers)
隊列(queueing discipline):用來實現控制網絡的收發速度。通過隊列,linux可以將網絡數據包緩存起來,然後根據用戶的設置,在盡量不中斷連接(如 TCP)的前提下來平滑網絡流量。需要注意的是,linux對接收隊列的控制不夠好,所以我們一般只用發送隊列,即“控發不控收”。它封裝了其他兩個主要 TC組件(類和分類器)。內核如果需要通過某個網絡接口發送數據包,它都需要按照為這個接口配置的qdisc(排隊規則)把數據包加入隊列。然後,內核會盡可能多地從qdisc裡面取出數據包,把它們交給網絡適配器驅動模塊。
最簡單的QDisc是pfifo它不對進入的數據包做任何的處理,數據包采用先入先出的方式通過隊列。不過,它會保存網絡接口一時無法處理的數據包。
隊列規則包括FIFO(先進先出),RED(隨機早期探測),SFQ(隨機公平隊列)和令牌桶(Token Bucket),類基隊列(CBQ),CBQ 是一種超級隊列,即它能夠包含其它隊列(甚至其它CBQ)。
class用來表示控制策略。很顯然,很多時候,我們很可能要對不同的IP實行不同的流量控制策略,這時候我們就得用不同的class來表示不同的控制策略了。
filter用來將用戶劃入到具體的控制策略中(即不同的class中)。比如,現在,我們想對xxa,xxb兩個IP實行不同的控制策略(A,B),這時,我們可用filter將xxa劃入到控制策略A,將xxb劃入到控制策略B,filter劃分的標志位可用u32打標功能或IPtables的 set-mark(大多使用iptables來做標記)功能來實現。
目前,TC可以使用的過濾器有:fwmark分類器,u32分類器,基於路由的分類器和RSVP分類器(分別用於IPV6、IPV4)等;其中,fwmark分類器允許我們使用 Linux netfilter 代碼選擇流量,而u32分類器允許我們選擇基於 ANY 頭的流量 .需要注意的是,filter(過濾器)是在QDisc內部,它們不能作為主體。
數據包->iptables(在通過iptables時,iptables根據不同的ip來設置不同的mark)->TC(class)->TC(queue)
應用
假設eth0位是服務器的外網網絡接口。
1)首先在eth0的qdiscA,qdiscA控制通過本機到外網的速度,因此是用來控制服務器流出速度的
#tc qdisc add dev eth1 root handle 1:htb default 1
添加 設置接口 最上層 句柄(做標記用) 標記 默認使用1的class
解釋如下:無論是隊列,還是class和filter都有ID之類的標志符,一般都有parent(父,上層的),注意ID具有接口本地性,不同的網絡接口可以有相同的ID.對於這裡因為qdisc在頂部,所以parent無,用‘root’字樣來標識,ID用1:來標志
‘default 91′表示當某個ip流不滿足任何已設定的filter規則時,將自動歸入class 1中。更詳細的指令規則說明請參考手冊。
2)然後在qdisc下建立兩個class,來指定eth0控制通過本機到外網的速度
#tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
注:以上就是我們控制輸出服務器的速度,為2M,最大可以到4M
rate: 是一個類保證得到的帶寬值。如果有不只一個類,請保證所有子類總和是小於或等於父類。
prio:用來指示借用帶寬時的競爭力,prio越小,優先級越高,競爭力越強。