LIUNX下tc流量控制命令詳解
LIUNX下tc流量控制命令詳解
tc - 顯示/維護流量控制設定
1. 摘要
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
2.
Tc用於Linux核心的流量控制。流量控制包括以下幾種方式:
SHAPING(限制)當流量被限制,它的傳輸速率就被控制在某個值以下。限制值可以大大小於有效頻寬,這樣可以平滑突發資料流量,使網路更為穩定。shaping(限制)只適用於向外的流量。
SCHEDULING(排程)通過排程資料包的傳輸,可以在頻寬範圍內,按照優先順序分配頻寬。SCHEDULING(排程)也只適於向外的流量。
POLICING(策略)
SHAPING用於處理向外的流量,而POLICIING(策略)用於處理接收到的資料。
DROPPING(丟棄)如果流量超過某個設定的頻寬,就丟棄資料包,不管是向內還是向外。
3.流量的處理由三種物件控制,它們是:
QDISC(排隊規則)
QDisc(排隊規則)是queueing discipline的簡寫,它是理解流量控制(traffic
control)的基礎。無論何時,核心如果需要通過某個網路介面傳送資料包,它都需要按照為這個介面配置的qdisc(排隊規則)把資料包加入佇列。然後,核心會盡可能多地從qdisc裡面取出資料包,把它們交給網路介面卡驅動模組。最簡單的QDisc是pfifo它不對進入的資料包做任何的處理,資料包採用先入先出的方式通過佇列。不過,它會儲存網路介面一時無法處理的資料包。
CLASS(類)某些QDisc(排隊規則
FILTER(過濾器)
filter(過濾器)用於為資料包分類,決定它們按照何種QDisc進入佇列。無論何時資料包進入一個劃分子類的類別中,都需要進行分類。分類的方法可以有多種,使用fileter(過濾器)就是其中之一。使用filter(過濾器)分類時,核心會呼叫附屬於這個類(class)的所有過濾器,直到返回一個判決。如果沒有判決返回,就作進一步的處理,而處理方式和QDISC有關。需要注意的是,filter(過濾器)是在QDisc內部,它們不能作為主體。
4. CLASSLESS QDisc(不可分類QDisc)無類別QDISC包括:
4.1 [p|b]fifo
使用最簡單的qdisc,純粹的先進先出。只有一個引數:limit,用來設定佇列的長度,pfifo是以資料包的個數為單位;bfifo是以位元組數為單位。
4.2 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)裡面的。
4.3 red
red是Random Early Detection(隨機早期探測)的簡寫。如果使用這種QDISC,當頻寬的佔用接近於規定的頻寬時,系統會隨機地丟棄一些資料包。它非常適合高頻寬應用。
4.4 sfq
sfq是Stochastic Fairness Queueing的簡寫。它按照會話(session--對應於每個TCP連線或者UDP流)為流量進行排序,然後迴圈傳送每個會話的資料包。
4.5 tbf
tbf是Token Bucket Filter的簡寫,適合於把流速降低到某個值。不可分類QDisc的配置如果沒有可分類QDisc,不可分類QDisc只能附屬於裝置的根。它們的用法如下:
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS
要刪除一個不可分類QDisc,需要使用如下命令:
tc qdisc del dev DEV root
一個網路介面上如果沒有設定QDisc,pfifo_fast就作為預設的QDisc。
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可以很容易對流量進行優先順序管理,只有屬於高優先順序類別的資料包全部發送完畢,才會傳送屬於低優先順序類別的資料包。為了方便管理,需要使用iptables或者ipchains處理資料包的服務型別(Type Of Service,ToS)。操作原理類(Class)組成一個樹,每個類都只有一個父類,而一個類可以有多個子類。某些QDisc(例如:CBQ和HTB)允許在執行時動態新增類,而其它的QDisc(例如:PRIO)不允許動態建立類。允許動態新增類的QDisc可以有零個或者多個子類,由它們為資料包排隊。此外,每個類都有一個葉子QDisc,預設情況下,這個葉子QDisc使用pfifo的方式排隊,我們也可以使用其它型別的QDisc代替這個預設的QDisc。而且,這個葉子葉子QDisc有可以分類,不過每個子類只能有一個葉子QDisc。當一個數據包進入一個分類QDisc,它會被歸入某個子類。我們可以使用以下三種方式為資料包歸類,不過不是所有的QDisc都能夠使用這三種方式。
tc過濾器(tc filter)如果過濾器附屬於一個類,相關的指令就會對它們進行查詢。過濾器能夠匹配資料包頭所有的域,也可以匹配由ipchains或者iptables做的標記。服務型別(Type of Service)某些QDisc有基於服務型別(Type of Service,ToS)的內建的規則為資料包分類。
skb->priority
使用者空間的應用程式可以使用SO_PRIORITY選項在skb->priority域設定一個類的ID。樹的每個節點都可以有自己的過濾器,但是高層的過濾器也可以直接用於其子類。如果資料包沒有被成功歸類,就會被排到這個類的葉子QDisc的隊中。相關細節在各個QDisc的手冊頁中。命名規則所有的QDisc、類和過濾器都有ID。ID可以手工設定,也可以有核心自動分配。
ID由一個主序列號和一個從序列號組成,兩個數字用一個冒號分開。
QDISC
一個QDisc會被分配一個主序列號,叫做控制代碼(handle),然後把從序列號作為類的名稱空間。控制代碼採用象10:一樣的表達方式。習慣上,需要為有子類的QDisc顯式地分配一個控制代碼。類(CLASS)在同一個QDisc裡面的類分享這個QDisc的主序列號,但是每個類都有自己的從序列號,叫做類識別符(classid)。類識別符只與父QDisc有關,和父類無關。類的命名習慣和QDisc的相同。過濾器(FILTER)過濾器的ID有三部分,只有在對過濾器進行雜湊組織才會用到。詳情請參考tc-filters手冊頁。單位
tc命令的所有引數都可以使用浮點數,可能會涉及到以下計數單位。頻寬或者流速單位:
kbps
千位元組/秒
mbps
兆位元組/秒
kbit
KBits/秒
mbit
MBits/秒
bps或者一個無單位數字位元組數/秒資料的數量單位:
kb或者k千位元組
mb或者m兆位元組
mbit
兆bit
kbit
千bit
b或者一個無單位數字位元組數時間的計量單位:
s、sec或者secs秒
ms、msec或者msecs分鐘
us、usec、usecs或者一個無單位數字微秒
TC命令
tc可以使用以下命令對QDisc、類和過濾器進行操作:
add
在一個節點裡加入一個QDisc、類或者過濾器。新增時,需要傳遞一個祖先作為引數,傳遞引數時既可以使用ID也可以直接傳遞裝置的根。如果要建立一個QDisc或者過濾器,可以使用控制代碼(handle)來命名;如果要建立一個類,可以使用類識別符(classid)來命名。
remove
刪除有某個控制代碼(handle)指定的QDisc,根QDisc(root)也可以刪除。被刪除QDisc上的所有子類以及附屬於各個類的過濾器都會被自動刪除。
change
以替代的方式修改某些條目。除了控制代碼(handle)和祖先不能修改以外,change命令的語法和add命令相同。換句話說,change命令不能一定節點的位置。
replace
對一個現有節點進行近於原子操作的刪除/新增。如果節點不存在,這個命令就會建立節點。
link
只適用於DQisc,替代一個現有的節點。歷史
tc由Alexey N. Kuznetsov編寫,從Linux 2.2版開始併入Linux核心。
SEE ALSO
tc-cbq(8)、tc-htb(8)、tc-sfq(8)、tc-red(8)、tc-tbf(8)、tc-pfifo(8)、tc-bfifo(8)、tc-pfifo_fast(8)、tc-filters(8)