使用TC實現基於linux的流量管理

使用TC實現基於linux的流量管理

使用TC實現基於linux的流量管理 

2004-04-23 15:18 pm 
作者:大楠木(kent@chinalinuxpub.com) 
來自:Linux知識寶庫 
現載:http://www.douzhe.com/docs/linuxtips/ 
地址:無名 

參考文獻:tc weizhishu 
www.chinalinuxpub.com 
linux Advanced Routing & Traffic Control HOWTO by Bert Hubert 
http://www.chinalinuxpub.com/vbbfor...&threadid=18601 
請認真閱讀上面的文章,掌握好相應的概念。 
Red Hat linux 7.3 內核 2.4.18 以上。 
局域網的網路拓撲: 


在伺服器的eth0 幫定了外部位址 eth0:192.168.1.3 
eth1 幫定了內部位址 eth1:1 172.17.1.1 
eth1:2 172.18.1.1 
eth1:3 172.19.1.1 

現在要實現的功能就是整個出口限制在512kbit(上傳流量) , 172.17網段的下載流量下載到512Kbit ,172.18 網段限制在128kbit,172.19的網段限制到 3Mbit。 
方法如下: 
首先幫定相應的位址:(不細述) 
實現路由設定,使用iptables實現。 

# iptables –A input -F 
# iptables -A output -F 
# iptables -A forward -F 
#echo 1 > /proc/sys/net/ipv4/ip_forward 
#允許轉發 
# iptables -A input –j accept 
# iptables -A output -j accept 
# iptables -A forward -j accept 
# iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j MASQUERADE 
# iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j MASQUERADE 
# iptables -t nat -A POSTROUTING -s 172.19.0.0/16 -j MASQUERADE 

#進行IP位址偽裝,使得內部的主機的資料包能通過伺服器與外界聯繫。 
進行流量管理 

#tc qdisc add dev eth0 root tbf rate 512k lantency 50ms burst 1540 

#在網卡eth0上使用tbf(TokenBucket Filter)過濾佇列,將出口限制在512kbit,延遲50ms,突發資料1540,rate指定的數值就是限制的帶寬。 
繼續在eth1做限制。 

#tc qdisc add dev eth1 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8 

#創建佇列,指明網卡為100M網卡,這個跟流量限制無關,用於計算使用。 

#tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 5Mbit weight 6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded 

創建根分類,帶寬限制在5Mbit,並且不允許借用別的帶寬。 
Prio 後面的參數為優先順序,指定資料包處理的順序。 

#tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 512kbit weight 5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded 

在跟類底下,創建分類1:3 限制帶寬為512kbit,不允許借用帶寬,用於172.17網段。 

#tc class add dev eth1 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 128kbit weight 5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded 

在跟類底下,創建分類1:4 限制帶寬為128kbit,不允許借用帶寬,用於172.18網段。 

#tc class add dev eth1 parent 1:1 classid 1:5 cbq bandwidth 100Mbit rate 3Mbit weight 10Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded 

在跟類底下,創建分類1:5 限制帶寬為3Mbit,不允許借用帶寬,用於172.19網段。 

#tc qdisc add dev eth1 parent 1:3 handle 30: sfq 
#tc qdisc add dev eth1 parent 1:4 handle 40: sfq 
#tc qdisc add dev eth1 parent 1:5 handle 50: sfq 

在每個分類底下,創建佇列,使用sfq(Stochastic Fareness Queueing)隨即公平佇列。 

#tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.17.0.0/16 flowid 1:3 
#tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.18.0.0/16 flowid 1:4 
#tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.19.0.0/16 flowid 1:5 

使用u32篩檢程式,對目的地址進行分類,對應已經創建的佇列。 
通過以上方式實現了簡單的流量控制,限制出口的上傳流量以及內口的下載流量。 
測試從 172.17.1.2 進行下載 限制的是 512kbit ,下載速率為 64-65kB 
172.18.1.2 進行下載 限制的是 128kbit,下載速率為 13-16.3kB 
172.19.1.2 進行下載 限制的是 3Mbit,下載速率達到 180-500kB 
注:不匹配任何規則的資料包,將已root 設定的規則發送。 
發現3M帶寬的限制誤差比較大。 
以上的測試都是基於單機的,沒有測試滿負載的情況。 
以上的文章是匆忙之中寫出來的,TC篩檢程式涉及到的東西極多,有很多中方法可以實現,基於ip位址或者基於埠都可以實現。 

Linux 的帶寬管理系統TC (流量控制,Traffic Control) 


Linux 包含複雜的帶寬管理系統 TC (流量控制,Traffic Control)。該系統支援分 
類、優先、共用和輸入、輸出流量限制等。這套系統可以與專用的帶寬管理系統相媲美。 

1. 基本的構成塊 
tc 包括三個基本的構成塊: 
佇列規定(queueing discipline )、類(class)和分類器(Classifiers) 
佇列規定可以看作設備的流量/資料包管理器。 
佇列規定內封裝了其他兩個主要TC組件(類和分類器),控制資料的流動。 
目前,有一些設備佇列規定可以用來管理設備,包括類基佇列(CBQ),優先順序和CSZ 
(Clark-Shenker-Zhang)等。CBQ是一種超級佇列,即它能夠包含其他佇列(甚至其他CBQ)。 
類由設備佇列規定來管理。類由若干規則(rule)構成,這些規則用以管理那個類所擁有 
的數據。例如,某類裏的全部資料包都受到 1 Mbps的速率限度,而在午夜和早上6點的一 
段時間段內允許最高達 3 Mbps。 
一些佇列規定可以綁定到類上,包括FIFO(先進先出),RED(隨機早期探測),SFQ(隨 
機公平佇列)和權杖桶(Token Bucket)。 
如果設備上未綁定佇列規定,則使用基本的FIFO。 
另外, CBQ,CSZ和優先順序也能用於類,以及類的子類。這表明使用TC,可以輕鬆地建造 
非常複雜的流量控制。管理類的佇列規定可以稱為類佇列規定(class queueingdisciplines)。 
一般地,類佇列規定管理該類的資料和佇列,能決定延遲、丟掉或者重新分類它管理的包。 
分類器或篩檢程式描述包,並且把他們映射到佇列規定所管理的類。 
這些篩檢程式通常都提供簡單的描述語言,指定選擇包、把包映射到類的方法。 
目前,TC可以使用的篩檢程式有:fwmark分類器,u32分類器,基於路由的分類器和RSVP分 
類器(分別用於IPV6、IPV4)等;其中,fwmark分類器允許我們使用 Linux netfilter 
代碼選擇流量,而u32分類器允許我們選擇基於 ANY 頭的流量 。所有的防火牆篩檢程式, 
例如,ipchains,都能用來分類包。 
TC代碼位於內核,不同的功能塊既能編譯為模組,也能直接編進內核。 
與內核代碼或模組的通信和配置由用戶級程式tc完成。 
2. 示例 
2.1 編譯內核 
首先要確保選中 Kernel/User netlink socket,因為只有這樣 tc 才能通過 netlink 
與內核通訊。 
然後,把佇列規定和分類器都編進內核。這其中包括: 
QoS or fair queueing, CBQ packet scheduler, CSZ packet scheduler, the 
simplest PRIO pseudoscheduler, RED queue, SFQ queue, TBF queue, QoS 
support, rate estimator, packet classifier API, routing-tables-based 
classifier, U32 classifier, special RSVP classifier 和 special RSVP 
classifier for IPv6。 
然後就是大家熟知的編譯和安裝過程了。 
2.2 建立 
[網際網路] ---〈E3、T3 等〉--- [Linux 路由器] --- [Office+ISP] 
eth1 eth0 
上圖中的 Linux 路由器有兩個介面,不妨稱之為 eth0 和 eth1。eth1 連接到路由器, 
eth0 連接到包括公司防火牆在內的子網上。 
由於我們只能限制發送的內容,所以我們需要兩套獨立的、但可能非常相似的規則集。我 
們可以通過改變發送次序來控制傳輸速率。通過修改 eth0 上的佇列,我們可以確定客戶 
的下載(download)速率;通過修改 eth1 上的佇列,我們可以確定我們公司自己的用 
戶的上載(upload)速率。 
比如說,公司連接到網際網路的線路帶寬為 10 兆,同時滿足外部客戶和公司自己用戶的需 
要;此時,我們就需要一種策略,來進行管理和協調。CBQ 就可以滿足我們的要求。 
我們有兩個主類:ISP 和 Office。我們可以決定,客戶有 8 兆的帶寬,Office 
用戶有 2 兆的帶寬。 
我們首先發佈如下的命令: 
# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000 
其含義是:我們配置了 eth0 的佇列規定,root 表示這是根(root)規定,其控制碼 
(handle)設定為 10:’。 
其類型為 CBQ。帶寬為 10 M,平均包大小為 1000 位元組。 
下麵生成根類(root class): 
# tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate 
10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000 
這條命令其實不比前一條命令有更多的含義。其中,1514 是 MTU 的值。 
下麵生成 ISP 類: 
# tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate 
8Mbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 1000 
bounded 
我們分配了 8 兆的帶寬給它,其中 bounded 表示該類不能超過該閥值。 
下麵生成 Office 類: 
# tc class add dev eth0 parent 10:1 classid 10:200 cbq bandwidth 10Mbit 
rate 
2Mbit allot 1514 weight 200Kbit prio 5 maxburst 20 avpkt 1000 
bounded 
為了更清晰起見,我們的類可以用下圖表示: 
+-------------[10: 10Mbit]-------------------------+ 
|+-------------[10:1 root 10Mbit]-----------------+| 
|| || 
|| +-----[10:100 8Mbit]---------+ [10:200 2Mbit] || 
|| | | | | || 
|| | ISP | | Office | || 
|| | | | | || 
|| +----------------------------+ +------------+ || 
|| || 
|+------------------------------------------------+| 
+--------------------------------------------------+ 

我們已經向內核通知了我們的類,我們還需要告訴內核如何管理佇列,如下所示: 
# tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15 
# tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15 
這裏,我們使用了隨機公平佇列(sfq),在消耗 CPU 週期較少的情況下,其性能還是可 
以接受的。其他一些佇列規定可能更好,但要佔用較多的 CPU 資源。權杖桶篩檢程式也經 
常使用。 
下面還有一件事要作:告訴內核網路包和類的映射關係。 
# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst 
150.151.23.24 flowid 10:200 
# tc filter add dev eth0 parent 10:0 protocol ip prio 25 u32 match ip dst 
150.151.0.0/16 flowid 10:100 
這裏,我們假定 Office 位於防火牆 150.151.23.24 的後面,其他 IP 地址都屬於 
ISP。 
u32 匹配是一種比較簡單的匹配,我們可以使用 netfilter 生成更加複雜的匹配規則。 

我們已經分配了下載帶寬,下面是上載帶寬的分配: 
# tc qdisc add dev eth1 root handle 20: cbq bandwidth 10Mbit avpkt 1000 
# tc class add dev eth1 parent 20:0 classid 20:1 cbq bandwidth 10Mbit rate 
10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000 
# tc class add dev eth1 parent 20:1 classid 20:100 cbq bandwidth 10Mbit rate 
8Mbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 1000 
bounded 
# tc class add dev eth1 parent 20:1 classid 20:200 cbq bandwidth 10Mbit rate 
2Mbit allot 1514 weight 200Kbit prio 5 maxburst 20 avpkt 1000 
bounded 
# tc qdisc add dev eth1 parent 20:100 sfq quantum 1514b perturb 15 
# tc qdisc add dev eth1 parent 20:200 sfq quantum 1514b perturb 15 
# tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip src 
150.151.23.24 flowid 20:200 
# tc filter add dev eth1 parent 20:0 protocol ip prio 25 u32 match ip src 
150.151.0.0/16 flowid 20:100 
這與前面的描述基本一致,所以就不做更多的解釋了。 

注: 
在前面的例子中,我們注意到:即使 ISP 客戶多數離線,我們的 Office 用戶也仍然只 
有 2 M 的帶寬,這是相當浪費的。我們可以刪掉 bounded 參數,這樣,各類之間就 
可以相互借用帶寬了。 
但是,某些類也許不希望向其他類借用帶寬;比如,一條線路上的兩個互為競爭對手的 
ISP 的情況。在這種情況下,我們可以加上關鍵字 isolated。 
3. 結束語 
目前,Linux 所提供的 QoS(服務品質)是所有作業系統中最複雜、最完善的。另外, 
BSD 的 ALTQ 應該說也相當不錯;但是,在複雜性、靈活性和可擴展性等方面要落後 
Linux 一大截。我不太清楚微軟的產品是否提供了這方面的功能。Sun 的 Solaris 提供 
了 CBQ 和 RSVP 的功能。 
Linux 也支援 IETF diffserv 特徵。 
Linux 在 QoS 方面眾多的特徵,將極大提升 Linux 的市場佔有率。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值