Linux系統(tǒng)中tc命令的使用詳解
Linux系統(tǒng)中tc是一個流量控制工具,全稱叫traffic control。下面由學習啦小編為大家整理了linux系統(tǒng)中tc命令的使用詳解,希望對大家有幫助!
Linux系統(tǒng)中tc命令的使用詳解
名稱:tc - 顯示/維護流量控制設置
一、linux 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 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
二、linux tc命令原理介紹
Linux操作系統(tǒng)中的流量控制器TC(Traffic Control)用于linux內(nèi)核的流量控制,它利用隊列規(guī)定建立處理數(shù)據(jù)包的隊列,并定義隊列中的數(shù)據(jù)包被發(fā)送的方式, 從而實現(xiàn)對流量的控制。TC模塊實現(xiàn)流量控制功能使用的隊列規(guī)定分為兩類,一類是無類隊列規(guī)定, 另一類是分類隊列規(guī)定。 無類隊列規(guī)定相對簡單,而分類隊列規(guī)定則引出了分類和過濾器等概念,使其流量控制功能增強。
無類隊列規(guī)定是對進入網(wǎng)絡設備(網(wǎng)卡) 的數(shù)據(jù)流不加區(qū)分統(tǒng)一對待的隊列規(guī)定。使用無類隊列規(guī)定形成的隊列能夠 接受數(shù)據(jù)包以及重新編排、延遲或丟棄數(shù)據(jù)包。這類隊列規(guī) 定形成的隊列可以對整個網(wǎng)絡設備( 網(wǎng)卡) 的流量進行整形, 但 不能細分各種情況… 。常用的無類隊列規(guī)定主要有pfifo _fast (先進現(xiàn)出) 、TBF ( 令牌桶過濾器) 、SFQ(隨機公平隊列) 、ID (前 向隨機丟包)等等。這類隊列規(guī)定使用的流量整形手段主要 是排序、 限速和丟包。
分類隊列規(guī)定是對進入網(wǎng)絡設備的數(shù)據(jù)包根據(jù)不同的需求以分類的方式區(qū)分對待的隊列規(guī)定。 數(shù)據(jù)包進入一個分類的隊列后, 它就需要被送到某一個類中, 也就是說需要對數(shù)據(jù)包做分類處理。對數(shù)據(jù)包進行分類的工具是過濾器,過濾器會返回一個決定,隊列規(guī)定就根據(jù)這個決定把數(shù)據(jù)包送入相應的類進行排隊。每個子類都可 以再次使用它們的過濾器進行進一步的分類。直到不需要進一步分類時, 數(shù)據(jù)包才進入該類包含的隊列排隊。 除了能夠包含其它隊列規(guī)定之外, 絕大多數(shù)分類的隊列規(guī)定還能夠?qū)α髁窟M行整形。 這對于需要同時進行調(diào)度( 如使用 S F Q ) 和流量控制的場合非常有用。
接收包從輸入接口(Input Interface)進來后,經(jīng)過流量限制(Ingress Policing)丟棄不符合規(guī)定的數(shù)據(jù)包,由輸入多路分配器(Input De-Multiplexing)進行判斷選擇:如果接收包的目的是本主機,那么將該包送給上層處理;否則需要進行轉(zhuǎn)發(fā),將接收包交到轉(zhuǎn)發(fā)塊(Forwarding Block)處理。轉(zhuǎn)發(fā)塊同時也接收本主機上層(TCP、UDP等)產(chǎn)生的包。轉(zhuǎn)發(fā)塊通過查看路由表,決定所處理包的下一跳。然后,對包進行排列以便將它們傳送到輸出接口(Output Interface)。一般我們只能限制網(wǎng)卡發(fā)送的數(shù)據(jù)包,不能限制網(wǎng)卡接收的數(shù)據(jù)包,所以我們可以通過改變發(fā)送次序來控制傳輸速率。Linux流量控制主要是在輸出接口排列時進行處理和實現(xiàn)的。
三、linux tc命令使用規(guī)則
3.1、流量控制方式
流量控制包括以下幾種方式:
SHAPING(限制)
當流量被限制,它的傳輸速率就被控制在某個值以下。限制值可以大大小于有效帶寬,這樣可以平滑突發(fā)數(shù)據(jù)流量,使網(wǎng)絡更為穩(wěn)定。shaping(限制)只適用于向外的流量。
SCHEDULING(調(diào)度)
通過調(diào)度數(shù)據(jù)包的傳輸,可以在帶寬范圍內(nèi),按照優(yōu)先級分配帶寬。SCHEDULING(調(diào)度)也只適于向外的流量。
POLICING(策略)
SHAPING用于處理向外的流量,而POLICIING(策略)用于處理接收到的數(shù)據(jù)。
DROPPING(丟棄)
如果流量超過某個設定的帶寬,就丟棄數(shù)據(jù)包,不管是向內(nèi)還是向外。
3.2、流量控制處理對象
流量的處理由三種對象控制,它們是:qdisc(排隊規(guī)則)、class(類別)和filter(過濾器)。
QDisc(排隊規(guī)則)是queueing discipline的簡寫,它是理解流量控制(traffic control)的基礎。無論何時,內(nèi)核如果需要通過某個網(wǎng)絡接口發(fā)送數(shù)據(jù)包,它都需要按照為這個接口配置的qdisc(排隊規(guī)則)把數(shù)據(jù)包加入隊列。然后,內(nèi)核會盡可能多地從qdisc里面取出數(shù)據(jù)包,把它們交給網(wǎng)絡適配器驅(qū)動模塊。最簡單的QDisc是pfifo它不對進入的數(shù)據(jù)包做任何的處理,數(shù)據(jù)包采用先入先出的方式通過隊列。不過,它會保存網(wǎng)絡接口一時無法處理的數(shù)據(jù)包。
QDISC的分為CLASSLESS QDisc和CLASSFUL QDISC類別如下:
(1)、CLASSLESS QDisc(不可分類QDisc)
1>無類別QDISC包括:
[p|b]fifo,使用最簡單的qdisc,純粹的先進先出。只有一個參數(shù):limit,用來設置隊列的長度,pfifo是以數(shù)據(jù)包的個數(shù)為單位;bfifo是以字節(jié)數(shù)為單位。
pfifo_fast,在編譯內(nèi)核時,如果打開了高級路由器(Advanced Router)編譯選項,pfifo_fast就是系統(tǒng)的標準QDISC。它的隊列包括三個波段(band)。在每個波段里面,使用先進先出規(guī)則。而三個波段(band)的優(yōu)先級也不相同,band 0的優(yōu)先級最高,band 2的最低。如果band里面有數(shù)據(jù)包,系統(tǒng)就不會處理band 1里面的數(shù)據(jù)包,band 1和band 2之間也是一樣。數(shù)據(jù)包是按照服務類型(Type of Service,TOS)被分配多三個波段(band)里面的。
red,red是Random Early Detection(隨機早期探測)的簡寫。如果使用這種QDISC,當帶寬的占用接近于規(guī)定的帶寬時,系統(tǒng)會隨機地丟棄一些數(shù)據(jù)包。它非常適合高帶寬應用。
sfq,sfq是Stochastic Fairness Queueing的簡寫。它按照會話(session--對應于每個TCP連接或者UDP流)為流量進行排序,然后循環(huán)發(fā)送每個會話的數(shù)據(jù)包。
tbf,tbf是Token Bucket Filter的簡寫,適合于把流速降低到某個值。
2>無類別QDisc的配置
如果沒有可分類QDisc,不可分類QDisc只能附屬于設備的根。它們的用法如下:
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS
要刪除一個不可分類QDisc,需要使用如下命令:
tc qdisc del dev DEV root
一個網(wǎng)絡接口上如果沒有設置QDisc,pfifo_fast就作為缺省的QDisc。
(2)、CLASSFUL QDISC(分類QDisc)
可分類QDISC包括:
CBQ,CBQ是Class Based Queueing(基于類別排隊)的縮寫。它實現(xiàn)了一個豐富的連接共享類別結(jié)構(gòu),既有限制(shaping)帶寬的能力,也具有帶寬優(yōu)先級管理的能力。帶寬限制是通過計算連接的空閑時間完成的??臻e時間的計算標準是數(shù)據(jù)包離隊事件的頻率和下層連接(數(shù)據(jù)鏈路層)的帶寬。
HTB,HTB是Hierarchy Token Bucket的縮寫。通過在實踐基礎上的改進,它實現(xiàn)了一個豐富的連接共享類別體系。使用HTB可以很容易地保證每個類別的帶寬,雖然它也允許特定的類可以突破帶寬上限,占用別的類的帶寬。HTB可以通過TBF(Token Bucket Filter)實現(xiàn)帶寬限制,也能夠劃分類別的優(yōu)先級。
PRIO,PRIO QDisc不能限制帶寬,因為屬于不同類別的數(shù)據(jù)包是順序離隊的。使用PRIO QDisc可以很容易對流量進行優(yōu)先級管理,只有屬于高優(yōu)先級類別的數(shù)據(jù)包全部發(fā)送完畢,才會發(fā)送屬于低優(yōu)先級類別的數(shù)據(jù)包。為了方便管理,需要使用iptables或者ipchains處理數(shù)據(jù)包的服務類型(Type Of Service,ToS)。
3.3、操作原理
類(Class)組成一個樹,每個類都只有一個父類,而一個類可以有多個子類。某些QDisc(例如:CBQ和HTB)允許在運行時動態(tài)添加類,而其它的QDisc(例如:PRIO)不允許動態(tài)建立類。允許動態(tài)添加類的QDisc可以有零個或者多個子類,由它們?yōu)閿?shù)據(jù)包排隊。此外,每個類都有一個葉子QDisc,默認情況下,這個葉子QDisc使用pfifo的方式排隊,我們也可以使用其它類型的QDisc代替這個默認的QDisc。而且,這個葉子葉子QDisc有可以分類,不過每個子類只能有一個葉子QDisc。當一個數(shù)據(jù)包進入一個分類QDisc,它會被歸入某個子類。我們可以使用以下三種方式為數(shù)據(jù)包歸類,不過不是所有的QDisc都能夠使用這三種方式。
如果過濾器附屬于一個類,相關的指令就會對它們進行查詢。過濾器能夠匹配數(shù)據(jù)包頭所有的域,也可以匹配由ipchains或者iptables做的標記。
樹的每個節(jié)點都可以有自己的過濾器,但是高層的過濾器也可以直接用于其子類。如果數(shù)據(jù)包沒有被成功歸類,就會被排到這個類的葉子QDisc的隊中。相關細節(jié)在各個QDisc的手冊頁中。
3.4、命名規(guī)則
所有的QDisc、類和過濾器都有ID。ID可以手工設置,也可以有內(nèi)核自動分配。ID由一個主序列號和一個從序列號組成,兩個數(shù)字用一個冒號分開。
QDISC,一個QDisc會被分配一個主序列號,叫做句柄(handle),然后把從序列號作為類的命名空間。句柄采用象10:一樣的表達方式。習慣上,需要為有子類的QDisc顯式地分配一個句柄。
類(CLASS),在同一個QDisc里面的類分享這個QDisc的主序列號,但是每個類都有自己的從序列號,叫做類識別符(classid)。類識別符只與父QDisc有關,和父類無關。類的命名習慣和QDisc的相同。
過濾器(FILTER),過濾器的ID有三部分,只有在對過濾器進行散列組織才會用到。詳情請參考tc-filters手冊頁。
3.5、單位
tc命令的所有參數(shù)都可以使用浮點數(shù),可能會涉及到以下計數(shù)單位。
1)、帶寬或者流速單位:
2)、數(shù)據(jù)的數(shù)量單位:
3)、時間的計量單位:
四、linux tc常用命令參數(shù)
tc可以使用以下命令對QDisc、類和過濾器進行操作:
add,在一個節(jié)點里加入一個QDisc、類或者過濾器。添加時,需要傳遞一個祖先作為參數(shù),傳遞參數(shù)時既可以使用ID也可以直接傳遞設備的根。如果要建立一個QDisc或者過濾器,可以使用句柄(handle)來命名;如果要建立一個類,可以使用類識別符(classid)來命名。
remove,刪除有某個句柄(handle)指定的QDisc,根QDisc(root)也可以刪除。被刪除QDisc上的所有子類以及附屬于各個類的過濾器都會被自動刪除。
change,以替代的方式修改某些條目。除了句柄(handle)和祖先不能修改以外,change命令的語法和add命令相同。換句話說,change命令不能一定節(jié)點的位置。
replace,對一個現(xiàn)有節(jié)點進行近于原子操作的刪除/添加。如果節(jié)點不存在,這個命令就會建立節(jié)點。
link,只適用于DQisc,替代一個現(xiàn)有的節(jié)點。
補充:五、流浪控制具體操作
Linux流量控制主要分為建立隊列、建立分類和建立過濾器三個方面。
5.1、基本實現(xiàn)步驟
(1) 針對網(wǎng)絡物理設備(如以太網(wǎng)卡eth0)綁定一個隊列QDisc;
(2) 在該隊列上建立分類class;
(3) 為每一分類建立一個基于路由的過濾器filter;
(4) 最后與過濾器相配合,建立特定的路由表。
5.2、環(huán)境模擬實例
流量控制器上的以太網(wǎng)卡(eth0) 的IP地址為192.168.1.66,在其上建立一個CBQ隊列。假設包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),可接收沖突的發(fā)送最長包數(shù)目為20字節(jié)。
假如有三種類型的流量需要控制:
1) 是發(fā)往主機1的,其IP地址為192.168.1.24。其流量帶寬控制在8Mbit,優(yōu)先級為2;
2) 是發(fā)往主機2的,其IP地址為192.168.1.30。其流量帶寬控制在1Mbit,優(yōu)先級為1;
3) 是發(fā)往子網(wǎng)1的,其子網(wǎng)號為192.168.1.0,子網(wǎng)掩碼為255.255.255.0。流量帶寬控制在1Mbit,優(yōu)先級為6。
5.2.1. 建立隊列
一般情況下,針對一個網(wǎng)卡只需建立一個隊列。
將一個cbq隊列綁定到網(wǎng)絡物理設備eth0上,其編號為1:0;網(wǎng)絡物理設備eth0的實際帶寬為10 Mbit,包的平均大小為1000字節(jié);包間隔發(fā)送單元的大小為8字節(jié),最小傳輸包大小為64字節(jié)。
5.2.2. 建立分類
分類建立在隊列之上。
一般情況下,針對一個隊列需建立一個根分類,然后再在其上建立子分類。對于分類,按其分類的編號順序起作用,編號小的優(yōu)先;一旦符合某個分類匹配規(guī)則,通過該分類發(fā)送數(shù)據(jù)包,則其后的分類不再起作用。
1) 創(chuàng)建根分類1:1;分配帶寬為10Mbit,優(yōu)先級別為8。
該隊列的最大可用帶寬為10Mbit,實際分配的帶寬為10Mbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級別為8,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應于實際帶寬的加權(quán)速率為1Mbit。
2)創(chuàng)建分類1:2,其父分類為1:1,分配帶寬為8Mbit,優(yōu)先級別為2。
該隊列的最大可用帶寬為10Mbit,實際分配的帶寬為 8Mbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級別為1,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應于實際帶寬的加權(quán)速率為800Kbit,分類的分離點為1:0,且不可借用未使用帶寬。
3)創(chuàng)建分類1:3,其父分類為1:1,分配帶寬為1Mbit,優(yōu)先級別為1。
該隊列的最大可用帶寬為10Mbit,實際分配的帶寬為 1Mbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級別為2,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應于實際帶寬的加權(quán)速率為100Kbit,分類的分離點為1:0。
4)創(chuàng)建分類1:4,其父分類為1:1,分配帶寬為1Mbit,優(yōu)先級別為6。
該隊列的最大可用帶寬為10Mbit,實際分配的帶寬為1Mbit,可接收沖突的發(fā)送最長包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級別為6,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應于實際帶寬的加權(quán)速率為100Kbit,分類的分離點為1:0。
5.2.3. 建立過濾器
過濾器主要服務于分類。
一般只需針對根分類提供一個過濾器,然后為每個子分類提供路由映射。
1) 應用路由分類器到cbq隊列的根,父分類編號為1:0;過濾協(xié)議為ip,優(yōu)先級別為100,過濾器為基于路由表。
2) 建立路由映射分類1:2, 1:3, 1:4
5.2.4.建立路由
該路由是與前面所建立的路由映射一一對應。
1) 發(fā)往主機192.168.1.24的數(shù)據(jù)包通過分類2轉(zhuǎn)發(fā)(分類2的速率8Mbit)
2) 發(fā)往主機192.168.1.30的數(shù)據(jù)包通過分類3轉(zhuǎn)發(fā)(分類3的速率1Mbit)
3)發(fā)往子網(wǎng)192.168.1.0/24的數(shù)據(jù)包通過分類4轉(zhuǎn)發(fā)(分類4的速率1Mbit)
注:一般對于流量控制器所直接連接的網(wǎng)段建議使用IP主機地址流量控制限制,不要使用子網(wǎng)流量控制限制。如一定需要對直連子網(wǎng)使用子網(wǎng)流量控制限制,則在建立該子網(wǎng)的路由映射前,需將原先由系統(tǒng)建立的路由刪除,才可完成相應步驟。
5.2.5. 監(jiān)視
主要包括對現(xiàn)有隊列、分類、過濾器和路由的狀況進行監(jiān)視。
1)顯示隊列的狀況
簡單顯示指定設備(這里為eth0)的隊列狀況
·tc qdisc ls dev eth0
詳細顯示指定設備(這里為eth0)的隊列狀況
·tc -s qdisc ls dev eth0
這里主要顯示了通過該隊列發(fā)送了13232個數(shù)據(jù)包,數(shù)據(jù)流量為7646731個字節(jié),丟棄的包數(shù)目為0,超過速率限制的包數(shù)目為0。
2)顯示分類的狀況
簡單顯示指定設備(這里為eth0)的分類狀況
·tc class ls dev eth0
詳細顯示指定設備(這里為eth0)的分類狀況
·tc -s class ls dev eth0
這里主要顯示了通過不同分類發(fā)送的數(shù)據(jù)包,數(shù)據(jù)流量,丟棄的包數(shù)目,超過速率限制的包數(shù)目等等。其中根分類(class cbq 1:0)的狀況應與隊列的狀況類似。
例如,分類class cbq 1:4發(fā)送了8076個數(shù)據(jù)包,數(shù)據(jù)流量為5552879個字節(jié),丟棄的包數(shù)目為0,超過速率限制的包數(shù)目為0。
顯示過濾器的狀況
·tc -s filter ls dev eth0
這里flowid 1:2代表分類class cbq 1:2,to 2代表通過路由2發(fā)送。
顯示現(xiàn)有路由的狀況
·ip route
如上所示,結(jié)尾包含有realm的顯示行是起作用的路由過濾器。
5.2.6. 維護
主要包括對隊列、分類、過濾器和路由的增添、修改和刪除。
增添動作一般依照"隊列->分類->過濾器->路由"的順序進行;修改動作則沒有什么要求;刪除則依照"路由->過濾器->分類->隊列"的順序進行。