TC--Traffic Control
TC是linux中的流量控制模塊,利用隊列規定創建起數據包隊列,並定義了隊列中數據包的發送方式,從而實現對流量的控制。linux
TC在流量控制中使用的隊列分爲兩類:1 無類隊列 2 有類隊列。無類隊列比較簡單,分類隊列則有分類和過濾器等概念,比較複雜。api
無類隊列對進入網卡的數據流統一對待,不進行區分,無類隊列造成的隊列可以接受數據包以及從新編排、延遲、丟包,它能夠對網卡流量進行整形,可是不能細分各類狀況,無類隊列規定主要有pfifo_fast、tbf、sfq等,無類隊列的流量整形手段主要是排序、限速、丟包。網絡
有類隊列規定則是對進入網卡的數據包根據不一樣的需求以分類的方式區分對待的分類規定,數據包進入分類隊列後,經過過濾器對數據包進行分類,過濾器返回一個決定,隊列就根據這個返回的決定把數據包發送到相應的某一類隊列中進行排隊。每一個子類能夠再次使用他們的過濾器進行進一步的分類,直到不須要分類爲止,數據包纔會進入相關類的隊列中進行排隊。
TC流量控制方式
SHAPING 限制--流量被限制時,它的傳輸速率就被控制在某個值如下,限制閾值能夠大大的小於有效帶寬,這樣能夠平滑網絡的突發流量,是網絡更穩定,shaping適用於限制外出的流量。
SCHEDULING 調度--經過調度數據包的傳輸,能夠在帶寬範圍內按照優先級分配,也只適用於限制外出流量。
POLICING 策略--用於處理接收到的數據
DROPPING 丟棄--若是流量超過設置的帶寬就丟棄數據包,向內向外皆管用。
TC流量控制處理對象
流量的處理由三種對象控制,分別是:qdisc-排隊規則、class-類別、filter-過濾器。
QDISC
qdisc是流量控制的基礎,不管什麼時候,內核若是須要經過某個網絡接口發送數據包,它都須要按照該接口配置的qdisc把數據包加入隊列中。內核會盡量多的從qdisc中取出數據包,而後交給網絡適配器進行處理。而qdisc又分爲CLASSLESS QDisc--不可分類隊列規則、CLASSFUL QDISC--分類隊列規則。
CLASSLESS QDisc--不可分類隊列規則
無類qdisc包括如下隊列:
[p|b]fifo 最簡單的qdsic,先進先出策略,只有一個limit參數用來設置隊列長度,pfifo是以數據包個數爲單位,bfifo是以字節數爲單位。pfifo_fast包含三個波段,band0~band2,每一個波段也使用先進先出策略,band0優先級最高,band2最低,若是band0中有數據包,系統就不會去處理band1的數據包,直到band0的數據包處理完。同理band1和band2。
red 是Random Early Detection的簡寫--隨機早起檢測。當帶寬的佔用接近指定帶寬時隨機的丟棄一些數據包。
sfq 是Stochastic Fairness Queueing的簡寫--隨機公平隊列,它會按照會話爲流量進行排序,通常對應於每一個tcp或者udp數據流,而後循環發送每一個會話的數據包。
tbf 是Token Bucket Filter的簡寫--xx 適合把速率降到某個值。
若是沒有設置可分類隊列規則,則無分類隊列規則只能屬於設備的根。以下設置:tc qdisc add dev DEV root QDISC QDISC-PARAMETERS,若是一個接口沒有設置qdisc,則pfifo_fast是默認的缺省qdisc。
CLASSFUL QDISC--分類隊列規則
分類隊列規則包括如下隊列:
CBQ 是Class Based Queueing的簡寫,它實現了一個豐富的鏈接共享類別結構,既有限制帶寬能力又有帶寬優先級管理能力。帶寬限制是經過計算鏈接的空閒時間完成的,空閒時間的計算標準是數據包離隊事件的頻率和下層鏈接的帶寬。
HTB 是 Hierarchy Token Bucket的簡寫,它實現了一個豐富的鏈接共享類別結構,使用HTB能夠很容易的保證每一個類的帶寬,同時也容許特定類能夠突破上限,佔用其餘類等寬等。HTB經過TFB實現帶寬限制,也能夠爲類劃分優先級。
PRIO 不能限制帶寬,由於屬於不一樣類別的數據包是順序離隊的。使用PRIO qdisc能夠很容易對流量進行優先級管理,只有屬於高優先級類別的數據包所有發送完畢,纔會發送屬於低優先級類別的數據包。爲了方便管理,須要使用 iptables或者ipchains處理數據包的服務類型(Type Of Service,ToS)。
CLASS
一些qdisc能夠包含一些類,不一樣的類中又能夠包含更深刻的qdisc,經過這些細分的qdisc能夠爲進入隊列的數據包排隊,經過設置各類類數據包的離隊次序,能夠設置網絡數據流量的優先級。例如,咱們要對不一樣的IP實施不一樣的流量控制策略,這時就須要用不一樣的類來控制。
FILTER
filter用於爲數據包分類,決定數據包進入何種qdisc隊列,分類的方法有多種filter是一種方法,使用filter時內核會調用屬於這個類的全部過濾器,直到返回一個決定,若是麼有返回決定,就作進一步處理,處理方式和qdisc有關。filter是在qdisc內部的。目前可用的過濾器有:u3二、rsvp、fwmark等。
操做原理
類組成一個樹,每一個類都只有一個父類,卻能夠有多個子類,某些qdisc容許在運行時動態添加類,如cbq、htb,而有些qdisc在運行時不準動態添加類,如prio。容許動態添加類的qdisc能夠有多個子類,由他們爲數據包排隊。每一個類都有一個葉子qdisc,默認這個葉子qdisc使用pfifo的隊列,固然也能夠用其餘隊列替換,並且,這個qdisc能夠再次包含其餘類,可是每一個類只能有一個葉子qdisc。當一個數據包進入一個qdisc時,可使用三種方式爲其分類:tc filters、Type of Service、skb->priority。可是並非全部的qdisc均可以使用這三種方式。
命名規則
全部的qdiscs, classes and filters都有本身的ID,能夠手動指定也能夠自動獲取,ID包含一個主號碼和一個從號碼,用冒號分開。
QDISC
一個qdisc會被分配一個主號碼,叫作handle,把從號碼做爲類的命名空間,習慣上須要爲有子類的qdisc分配一個handle。一個qdisc若是是根節點,則parent的值就是root,若是qdisc下面有劃分類,這時就須要指定handle,handle的值是major:minor格式的,對於root來講,格式是1:,後面不須要指定minor,要指定的話,qdisc的minor必須爲0。非根的qdisc的handle的major能夠本身設置,minor不用設置,非根的parent的值也是major:minor格式,值是一個已存在的類。
CLASS
在同一個qdisc裏面的類共享這個qdisc的主號碼,每一個類都有本身的從號碼,叫作classid,classid只和父qdisc有關,和父class無關,parent值的格式也是major:minor的,major這個指定該類的父節點的handle的major值,父節點能夠是class也能夠是qdisc,若是是qdisc,則minor能夠不用設置或者設置爲0,若是是class,則parent的值是其父類的classid值,classid的值格式也是major:minor的,major是父qdisc的handle的major的值,minor值是本身設置。
FILTER
過濾器的ID有三部分,只有在對過濾器進行散列組織纔會用到。
tc命令的語法以下
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 spe‐cific parameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio pri‐ority filtertype [ filtertype specific parameters ] flowid flow-id
tc [ FORMAT ] qdisc show [ dev DEV ]
tc [ FORMAT ] class show dev DEV
tc filter show dev DEV
使用tc命令能夠對qdisc、class、filter進行以下操做:
add 在一個節點上添加qdisc、class、filter,添加時,須要傳遞一個parent,傳遞參數時既能夠用ID也可使用設備的根,在創建qdisc和filter時,可使用handle來命名,在創建class時可使用classid來命名
remove 刪除某個handle指定的qdisc,也可刪除根qdisc。被刪除的qdisc上的全部子類以及過濾器都會被自動刪除。
change 以替代的方式修改某些條目,除了handle和parent不能被修改外,其他語法同add,change命令不能移除一個節點
replace 添加或者刪除一個節點,是一個原子操做,若是節點不存在,則創建節點。
link 只適用於qdisc,替代一個存在的節點。
實施
主要是創建隊列、分類、過濾器三步。
1 給物理設備創建一個隊列qdisc
2 在相關隊列上創建分類,通常是在該qdisc上創建一個根分類,而後在此根分類上創建子類。
3 爲每個分類創建基於路由的過濾器,並把過濾規則與特定的路由結合。通常只須要針對根分類提供一個過濾器,而後爲每一個子類提供路由映射。
關於各個策略的參數能夠man tc-cbq tc-htb tc-sfq tc-red tc-tbf tc-pfifo tc-bfifo tc-pfifo_fast查看。