廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 2816 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
pigpig5442
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x13
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
文章表情[Linux] [轉帖]在 LINUX 中實現流量控制器
本文出自:http://www.chi...b.com 作者: 陳文衛

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 maxburst 20 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 maxburst 20 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
202.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


[ 此文章被andyz在2005-05-18 20:03重新編輯 ]



獻花 x0 回到頂端 [樓 主] From:台灣數位聯合 | Posted:2005-03-21 02:40 |
oiolong 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x1 鮮花 x7
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我之前有用linux設過路由過..

但一直無法成功...

後來就放棄了..

想要重新來過 ..

努力中 ~


獻花 x0 回到頂端 [1 樓] From:台灣 | Posted:2005-03-31 18:16 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.051957 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言