流量的處理由三種對象控制,它們是:qdisc(排隊規則)、class(類別)和filter(過濾器)。
qdisc 分類:
# todo 1.CLASSLESS QDisc(不可分類QDisc)
[p|b]fifo
使用最簡單的qdisc,純粹的先進先出。只有一個參數:limit,用來設置隊列的長度,pfifo是以數據包的個數為單位;bfifo是以字節數為單位。
pfifo_fast
在編譯內核時,如果打開了高級路由器(Advanced Router)編譯選項,pfifo_fast就是系統的標准QDISC。它的隊列包括三個波段(band)。在每個波段里面,使用先進先出規則。而三個波段(band)的優先級也不相同,band 0的優先級最高,band 2的最低。如果band里面有數據包,系統就不會處理band 1里面的數據包,band 1和band 2之間也是一樣。數據包是按照服務類型(Type of Service,TOS)被分配多三個波段(band)里面的。
red:
red是Random Early Detection(隨機早期探測)的簡寫。如果使用這種QDISC,當帶寬的占用接近於規定的帶寬時,系統會隨機地丟棄一些數據包。它非常適合高帶寬應用。
sfq:
sfq是Stochastic Fairness Queueing(隨機公平排隊)的簡寫。它按照會話(session--對應於每個TCP連接或者UDP流)為流量進行排序,然后循環發送每個會話的數據包。
tbf
tbf是Token Bucket Filter的簡寫,適合於把流速降低到某個值。
# todo 2.Classful QDisc(分類QDisc)
可分類的qdisc:
CBQ
CBQ是Class Based Queueing(基於類別排隊)的縮寫。它實現了一個豐富的連接共享類別結構,既有限制(shaping)帶寬的能力,
也具有帶寬優先級管理的能力。帶寬限制是通過計算連接的空閑時間完成的。空閑時間的計算標准是數據包離隊事件的頻率和下層連接
(數據鏈路層)的帶寬。
HTB等級令牌桶
HTB是Hierarchy Token Bucket的縮寫。通過在實踐基礎上的改進,它實現了一個豐富的連接共享類別體系。使用HTB可以很容易
地保證每個類別的帶寬,雖然它也允許特定的類可以突破帶寬上限,占用別的類的帶寬。HTB可以通過TBF(Token Bucket Filter)
實現帶寬限制,也能夠划分類別的優先級
PRIO
PRIO QDisc不能限制帶寬,因為屬於不同類別的數據包是順序離隊的。使用PRIO QDisc可以很容易對流量進行優先級管理,
只有屬於高優先級類別的數據包全部發送完畢,才會發送屬於低優先級類別的數據包
FILTER(過濾器)
Filter(過濾器)用於為數據包分類,決定它們按照何種QDisc進入隊列
TC 中的 Filter 規則
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 內部,它們不能作為主體。
4、命名規則
所有的QDisc、類和過濾器都有ID。ID可以手工設置,也可以有內核自動分配。
ID由一個主序列號和一個從序列號組成,兩個數字用一個冒號分開。
==================
Linux流量控制主要分為建立隊列、建立分類和建立過濾器三個方面。
1、基本實現步驟為:
(1) 針對網絡物理設備(如以太網卡eth0)綁定一個隊列QDisc;
(2) 在該隊列上建立分類class;
(3) 為每一分類建立一個基於路由的過濾器filter;
(4) 最后與過濾器相配合,建立特定的路由表。
#
要建立一個QDisc或者過濾器,可以使用句柄(handle)來命名;如果要建立一個類,可以使用類識別符(classid)來命名
# todo 示范案例:
第一步為網卡創建disc隊列:為eth0網卡創建一個qdisc根隊列:root表示根隊列,handle 表示隊列的句柄為1:,htb 表示要添加的隊列為HTB隊列,r2q 1表示
,是指沒有 default 的root
tc disc add dev eth0 root handle 1: htb r2q 1
第二步驟為隊列創建分類class:
prio:用來指示借用帶寬優先級,值越小優先越高
創建分類1:1,其父分類為1:,rate 20mbit"表示系統將為該類別確保帶寬20mbit,"ceil 20mbit"
表示該類別的最高可占用帶寬為40mbit
tc class add dev eth0 parent 1: classid 1:1 htb rate 20mbit ceil 20mbit
第三步創建過濾器:
父分類編號為1:;過濾協議為ip,優先級別為16,過濾器為基於$ip。
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst $ip flowid 1:1
#環境還原:
清除 eth0 所有隊列規則
tc qdisc del dev eth0 root
#qdisc 查看隊列規則使用類型以及設置參數
sudo tc -s -d qdisc show dev eth0
#詳細顯示指定設備(這里為eth0)的分類狀況
sudo tc -s -d class show dev eth0
顯示過濾器的狀況
tc -s filter ls dev eth0
詳細顯示指定設備(這里為eth0)的分類狀況
tc -s class ls dev eth0
簡單顯示指定設備(這里為eth0)的隊列狀況
tc qdisc ls dev eth0
>>>>>>>語法例:
tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]
tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-id
tc [-s | -d ] qdisc show [ dev DEV ]
tc [-s | -d ] class show dev DEV tc filter show dev DEV
4.單位
tc命令的所有參數都可以使用浮點數,可能會涉及到以下計數單位。
##4.1 帶寬或者流速單位:
kbps 千字節/秒
mbps 兆字節/秒
kbit KBits/秒
mbit MBits/秒
bps或者一個無單位數字 字節數/秒
## 4.2數據的數量單位:
kb或者k 千字節
mb或者m 兆字節
mbit 兆bit
kbit 千bit
b或者一個無單位數字 字節數
## 4.3時間的計量單位:
s、sec或者secs 秒
ms、msec或者msecs 分鍾
us、usec、usecs或者一個無單位數字 微秒
4.單位
tc命令的所有參數都可以使用浮點數,可能會涉及到以下計數單位。
##4.1 帶寬或者流速單位:
kbps 千字節/秒
mbps 兆字節/秒
kbit KBits/秒
mbit MBits/秒
bps或者一個無單位數字 字節數/秒
## 4.2數據的數量單位:
kb或者k 千字節
mb或者m 兆字節
mbit 兆bit
kbit 千bit
b或者一個無單位數字 字節數
## 4.3時間的計量單位:
s、sec或者secs 秒
ms、msec或者msecs 分鍾
us、usec、usecs或者一個無單位數字 微秒
技術群: