在LINUX中實現流量控制器(轉)

BSDLite發表於2007-08-15
在LINUX中實現流量控制器(轉)[@more@]Linux從kernel 2.1.105開始支援QOS,不過,需要重新編譯核心。執行 make config時將 EXPERIMENTAL _OPTIONS 設定成 y,並且將 Class Based Queueing (CBQ), Token Bucket Flow,Traffic Shapers 設定為 y ,執行 make dep; make clean; make bzilo,生成新的核心。
在Linux作業系統中流量控制器(TC)主要是在輸出埠處建立一個佇列進行流量控制,控制的方式是基於路由,亦即基於目的IP地址或目的子網的網路號的流量控制。流量控制器TC,其基本的功能模組為佇列、分類和過濾器。Linux核心中支援的佇列有,Class Based Queue ,Token Bucket Flow ,CSZ ,First In First Out ,Priority ,TEQL ,SFQ ,ATM ,RED。這裡我們討論的佇列與分類都是基於CBQ(Class Based Queue)的,而過濾器是基於路由(Route)的。
   配置和使用流量控制器TC,主要分以下幾個方面:分別為建立佇列、建立分類、建立過濾器和建立路由,另外還需要對現有的佇列、分類、過濾器和路由進行監視。
   其基本使用步驟為:
   1) 針對網路物理裝置(如乙太網卡eth0)繫結一個CBQ佇列;
   2) 在該佇列上建立分類;
   3) 為每一分類建立一個基於路由的過濾器;
   4) 最後與過濾器相配合,建立特定的路由表。
先假設一個簡單的環境,如下圖所示:
流量控制器上的乙太網卡(eth0) 的IP地址為192.168.1.66,在其上建立一個CBQ佇列。假設包的平均大小為1000位元組,包間隔傳送單元的大小為8位元組,可接收衝突的傳送最長包數目為20位元組。
   假如有三種型別的流量需要控制:
   1) 是發往主機1的,其IP地址為192.168.1.24。其流量頻寬控制在8Mbit,優先順序為2;
   2) 是發往主機2的,其IP地址為192.168.1.26。其流量頻寬控制在1Mbit,優先順序為1;
   3) 是發往子網1的,其子網號為192.168.1.0,子網掩碼為255.255.255.0。流量頻寬控制在1Mbit,優先順序為6。
1. 建立佇列
   一般情況下,針對一個網路卡只需建立一個佇列。
   將一個cbq佇列繫結到網路物理裝置eth0上,其編號為1:0;網路物理裝置eth0的實際頻寬為10 Mbit,包的平均大小為1000位元組;包間隔傳送單元的大小為8位元組,最小傳輸包大小為64位元組。
   ·tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64
2. 建立分類
   分類建立在佇列之上。一般情況下,針對一個佇列需建立一個根分類,然後再在其上建立子分類。
對於分類,按其分類的編號順序起作用,編號小的優先;一旦符合某個分類匹配規則,透過該分類傳送資料包,則其後的分類不再起作用。
1) 建立根分類1:1;分配頻寬為10Mbit,優先順序別為8。
·tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst20 allot 1514 prio 8 avpkt 1000 cell 8 weight 1Mbit
   該佇列的最大可用頻寬為10Mbit,實際分配的頻寬為10Mbit,可接收衝突的傳送最長包數目為20位元組;最大傳輸單元加MAC頭的大小為1514位元組,優先順序別為8,包的平均大小為1000位元組,包間隔傳送單元的大小為8位元組,相應於實際頻寬的加權速率為1Mbit。
2)建立分類1:2,其父分類為1:1,分配頻寬為8Mbit,優先順序別為2。
·tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 8Mbit maxburst20 allot 1514 prio 2 avpkt 1000 cell 8 weight 800Kbit split 1:0 bounded
   該佇列的最大可用頻寬為10Mbit,實際分配的頻寬為 8Mbit,可接收衝突的傳送最長包數目為20位元組;最大傳輸單元加MAC頭的大小1514位元組,優先順序別為1,包的平均大小為1000位元組,包間隔傳送單元的大小為8位元組,相應於實際頻寬的加權速率為800Kbit,分類的分離點為1:0,且
不可借用未使用頻寬。
3)建立分類1:3,其父分類為1:1,分配頻寬為1Mbit,優先順序別為1。
·tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 1Mbit maxburst 20
allot 1514 prio 1 avpkt 1000 cell 8 weight 100Kbit split 1:0
   該佇列的最大可用頻寬為10Mbit,實際分配的頻寬為 1Mbit,可接收衝突的傳送最長包數目為20位元組;最大傳輸單元加MAC頭的大小為1514位元組,優先順序別為2,包的平均大小為1000位元組,包間隔傳送單元的大小為8位元組,相應於實際頻寬的加權速率為100Kbit,分類的分離點為1:0。
4)建立分類1:4,其父分類為1:1,分配頻寬為1Mbit,優先順序別為6。
·tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 10Mbit rate 1Mbit maxburst
20 allot 1514 prio 6 avpkt 1000 cell 8 weight 100Kbit split 1:0
   該佇列的最大可用頻寬為10Mbit,實際分配的頻寬為 64Kbit,可接收衝突的傳送最長包數目為20位元組;最大傳輸單元加MAC頭的大小為1514位元組,優先順序別為1,包的平均大小為1000位元組,包間隔傳送單元的大小為8位元組,相應於實際頻寬的加權速率為100Kbit,分類的分離點為1:0。
3. 建立過濾器
過濾器主要服務於分類。一般只需針對根分類提供一個過濾器,然後為每個子分類提供路由對映。
1) 應用路由分類器到cbq佇列的根,父分類編號為1:0;過濾協議為ip,優先順序別為100,過濾器為基於路由表。
·tc filter add dev eth0 parent 1:0 protocol ip prio 100 route
2) 建立路由對映分類1:2, 1:3, 1:4
·tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2
·tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 3 flowid 1:3
·tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 4 flowid 1:4
4.建立路由
該路由是與前面所建立的路由對映一一對應。
1) 發往主機192.168.1.24的資料包透過分類2轉發(分類2的速率8Mbit)
·ip route add 192.168.1.24 dev eth0 via 192.168.1.66 realm 2
2) 發往主機192.168.1.30的資料包透過分類3轉發(分類3的速率1Mbit)
·ip route add 192.168.1.30 dev eth0 via 192.168.1.66 realm 3
3)發往子網192.168.1.0/24的資料包透過分類4轉發(分類4的速率1Mbit)
·ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4
   注:一般對於流量控制器所直接連線的網段建議使用IP主機地址流量控制限制,不要使用子網流量控制限制。
如一定需要對直連子網使用子網流量控制限制,則在建立該子網的路由對映前,需將原先由系統建立的路由刪除,才可完成相應步驟。
5. 監視
   主要包括對現有佇列、分類、過濾器和路由的狀況進行監視。
1)顯示佇列的狀況
簡單顯示指定裝置(這裡為eth0)的佇列狀況
·tc qdisc ls dev eth0
qdisc cbq 1: rate 10Mbit (bounded,isolated) prio no-transmit
詳細顯示指定裝置(這裡為eth0)的佇列狀況
·tc -s qdisc ls dev eth0
qdisc cbq 1: rate 10Mbit (bounded,isolated) prio no-transmit
Sent 7646731 bytes 13232 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 31 undertime 0
   這裡主要顯示了透過該佇列傳送了13232個資料包,資料流量為7646731個位元組,丟棄的包數目為0,超過速率限制的包數目為0。
2)顯示分類的狀況
簡單顯示指定裝置(這裡為eth0)的分類狀況
·tc class ls dev eth0
class cbq 1: root rate 10Mbit (bounded,isolated) prio no-transmit
class cbq 1:1 parent 1: rate 10Mbit prio no-transmit #no-transmit表示優先順序為8
class cbq 1:2 parent 1:1 rate 8Mbit prio 2
class cbq 1:3 parent 1:1 rate 1Mbit prio 1
class cbq 1:4 parent 1:1 rate 1Mbit prio 6
詳細顯示指定裝置(這裡為eth0)的分類狀況
·tc -s class ls dev eth0
class cbq 1: root rate 10Mbit (bounded,isolated) prio no-transmit
Sent 17725304 bytes 32088 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 31 undertime 0
class cbq 1:1 parent 1: rate 10Mbit prio no-transmit
Sent 16627774 bytes 28884 pkts (dropped 0, overlimits 0)
borrowed 16163 overactions 0 avgidle 587 undertime 0
class cbq 1:2 parent 1:1 rate 8Mbit prio 2
Sent 628829 bytes 3130 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 4137 undertime 0
class cbq 1:3 parent 1:1 rate 1Mbit prio 1
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
borrowed 0 overactions 0 avgidle 159654 undertime 0
class cbq 1:4 parent 1:1 rate 1Mbit prio 6
Sent 5552879 bytes 8076 pkts (dropped 0, overlimits 0)
borrowed 3797 overactions 0 avgidle 159557 undertime 0
   這裡主要顯示了透過不同分類傳送的資料包,資料流量,丟棄的包數目,超過速率限制的包數目等等。其中根分類(class cbq 1:0)的狀況應與佇列的狀況類似。
   例如,分類class cbq 1:4傳送了8076個資料包,資料流量為5552879個位元組,丟棄的包數目為0,超過速率限制的包數目為0。
顯示過濾器的狀況
·tc -s filter ls dev eth0
filter parent 1: protocol ip pref 100 route
filter parent 1: protocol ip pref 100 route fh 0xffff0002 flowid 1:2 to 2
filter parent 1: protocol ip pref 100 route fh 0xffff0003 flowid 1:3 to 3
filter parent 1: protocol ip pref 100 route fh 0xffff0004 flowid 1:4 to 4
這裡flowid 1:2代表分類class cbq 1:2,to 2代表透過路由2傳送。
顯示現有路由的狀況
·ip route
192.168.1.66 dev eth0 scope link
192.168.1.24 via 192.168.1.66 dev eth0 realm 2
02.102.24.216 dev ppp0 proto kernel scope link src 202.102.76.5
192.168.1.30 via 192.168.1.66 dev eth0 realm 3
192.168.1.0/24 via 192.168.1.66 dev eth0 realm 4
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.66
172.16.1.0/24 via 192.168.1.66 dev eth0 scope link
127.0.0.0/8 dev lo scope link
default via 202.102.24.216 dev ppp0
default via 192.168.1.254 dev eth0
   如上所示,結尾包含有realm的顯示行是起作用的路由過濾器。
6. 維護
   主要包括對佇列、分類、過濾器和路由的增添、修改和刪除。
   增添動作一般依照"佇列->分類->過濾器->路由"的順序進行;修改動作則沒有什麼要求;刪除
則依照"路由->過濾器->分類->佇列"的順序進行。
1)佇列的維護
一般對於一臺流量控制器來說,出廠時針對每個乙太網卡均已配置好一個佇列了,通常情況下對佇列無需進行增添、修改和刪除動作了。
2)分類的維護
增添
增添動作透過tc class add命令實現,如前面所示。
修改
修改動作透過tc class change命令實現,如下所示:
·tc class change dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 7Mbit maxburst 20 allot 1514 prio 2 avpkt 1000 cell 8 weight 700Kbit split 1:0 bounded
對於bounded命令應慎用,一旦新增後就進行修改,只可透過刪除後再新增來實現。
刪除
刪除動作只在該分類沒有工作前才可進行,一旦透過該分類傳送過資料,則無法刪除它了。因此,需要透過shell檔案方式來修改,透過重新啟動來完成刪除動作。
3)過濾器的維護
增添
增添動作透過tc filter add命令實現,如前面所示。
修改
修改動作透過tc filter change命令實現,如下所示:
·tc filter change dev eth0 parent 1:0 protocol ip prio 100 route to 10 flowid 1:8
刪除
刪除動作透過tc filter del命令實現,如下所示:
·tc filter del dev eth0 parent 1:0 protocol ip prio 100 route to 10
4)與過濾器一一對映路由的維護
增添
增添動作透過ip route add命令實現,如前面所示。
修改
修改動作透過ip route change命令實現,如下所示:
·ip route change 192.168.1.30 dev eth0 via 192.168.1.66 realm 8
刪除
刪除動作透過ip route del命令實現,如下所示:
·ip route del 192.168.1.30 dev eth0 via 192.168.1.66 realm 8
·ip route del 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-959899/,如需轉載,請註明出處,否則將追究法律責任。

相關文章