只需要修改iproute2應(yīng)用層的makefile就可以了,編譯tc并把tc拷貝到執(zhí)行目錄里
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到七星網(wǎng)站設(shè)計(jì)與七星網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋七星地區(qū)。
給你個(gè)TC中文MAN,參考參考,也可以去我的BLOG看看,最近我也在學(xué),
名字
tc - 顯示/維護(hù)流量控制設(shè)置
摘要
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
簡(jiǎn)介
Tc用于Linux內(nèi)核的流量控制。流量控制包括以下幾種方式:
SHAPING(限制)
當(dāng)流量被限制,它的傳輸速率就被控制在某個(gè)值以下。限制值可以大大小于有效帶寬,這樣可以平滑突發(fā)數(shù)據(jù)流量,使網(wǎng)絡(luò)更為穩(wěn)定。shaping(限制)只適用于向外的流量。
SCHEDULING(調(diào)度)
通過(guò)調(diào)度數(shù)據(jù)包的傳輸,可以在帶寬范圍內(nèi),按照優(yōu)先級(jí)分配帶寬。SCHEDULING(調(diào)度)也只適于向外的流量。
POLICING(策略)
SHAPING用于處理向外的流量,而POLICIING(策略)用于處理接收到的數(shù)據(jù)。
DROPPING(丟棄)
如果流量超過(guò)某個(gè)設(shè)定的帶寬,就丟棄數(shù)據(jù)包,不管是向內(nèi)還是向外。
流量的處理由三種對(duì)象控制,它們是:qdisc(排隊(duì)規(guī)則)、class(類(lèi)別)和filter(過(guò)濾器)。
QDISC(排隊(duì)嬖?
QDisc(排隊(duì)規(guī)則)是queueing discipline的簡(jiǎn)寫(xiě),它是理解流量控制(traffic control)的基礎(chǔ)。無(wú)論何時(shí),內(nèi)核如果需要通過(guò)某個(gè)網(wǎng)絡(luò)接口發(fā)送數(shù)據(jù)包,它都需要按照為這個(gè)接口配置的qdisc(排隊(duì)規(guī)則)把數(shù)據(jù)包加入隊(duì)列。然后,內(nèi)核會(huì)盡可能多地從qdisc里面取出數(shù)據(jù)包,把它們交給網(wǎng)絡(luò)適配器驅(qū)動(dòng)模塊。
最簡(jiǎn)單的QDisc是pfifo它不對(duì)進(jìn)入的數(shù)據(jù)包做任何的處理,數(shù)據(jù)包采用先入先出的方式通過(guò)隊(duì)列。不過(guò),它會(huì)保存網(wǎng)絡(luò)接口一時(shí)無(wú)法處理的數(shù)據(jù)包。
CLASS(類(lèi))
某些QDisc(排隊(duì)規(guī)則)可以包含一些類(lèi)別,不同的類(lèi)別中可以包含更深入的QDisc(排隊(duì)規(guī)則),通過(guò)這些細(xì)分的QDisc還可以為進(jìn)入的隊(duì)列的數(shù)據(jù)包排隊(duì)。通過(guò)設(shè)置各種類(lèi)別數(shù)據(jù)包的離隊(duì)次序,QDisc可以為設(shè)置網(wǎng)絡(luò)數(shù)據(jù)流量的優(yōu)先級(jí)。
FILTER(過(guò)濾器)
filter(過(guò)濾器)用于為數(shù)據(jù)包分類(lèi),決定它們按照何種QDisc進(jìn)入隊(duì)列。無(wú)論何時(shí)數(shù)據(jù)包進(jìn)入一個(gè)劃分子類(lèi)的類(lèi)別中,都需要進(jìn)行分類(lèi)。分類(lèi)的方法可以有多種,使用fileter(過(guò)濾器)就是其中之一。使用filter(過(guò)濾器)分類(lèi)時(shí),內(nèi)核會(huì)調(diào)用附屬于這個(gè)類(lèi)(class)的所有過(guò)濾器,直到返回一個(gè)判決。如果沒(méi)有判決返回,就作進(jìn)一步的處理,而處理方式和QDISC有關(guān)。
需要注意的是,filter(過(guò)濾器)是在QDisc內(nèi)部,它們不能作為主體。
CLASSLESS QDisc(不可分類(lèi)QDisc)
無(wú)類(lèi)別QDISC包括:
[p|b]fifo
使用最簡(jiǎn)單的qdisc,純粹的先進(jìn)先出。只有一個(gè)參數(shù):limit,用來(lái)設(shè)置隊(duì)列的長(zhǎng)度,pfifo是以數(shù)據(jù)包的個(gè)數(shù)為單位;bfifo是以字節(jié)數(shù)為單位。
pfifo_fast
在編譯內(nèi)核時(shí),如果打開(kāi)了高級(jí)路由器(Advanced Router)編譯選項(xiàng),pfifo_fast就是系統(tǒng)的標(biāo)準(zhǔn)QDISC。它的隊(duì)列包括三個(gè)波段(band)。在每個(gè)波段里面,使用先進(jìn)先出規(guī)則。而三個(gè)波段(band)的優(yōu)先級(jí)也不相同,band 0的優(yōu)先級(jí)最高,band 2的最低。如果band里面有數(shù)據(jù)包,系統(tǒng)就不會(huì)處理band 1里面的數(shù)據(jù)包,band 1和band 2之間也是一樣。數(shù)據(jù)包是按照服務(wù)類(lèi)型(Type of Service,TOS)被分配多三個(gè)波段(band)里面的。
red
red是Random Early Detection(隨機(jī)早期探測(cè))的簡(jiǎn)寫(xiě)。如果使用這種QDISC,當(dāng)帶寬的占用接近于規(guī)定的帶寬時(shí),系統(tǒng)會(huì)隨機(jī)地丟棄一些數(shù)據(jù)包。它非常適合高帶寬應(yīng)用。
sfq
sfq是Stochastic Fairness Queueing的簡(jiǎn)寫(xiě)。它按照會(huì)話(huà)(session--對(duì)應(yīng)于每個(gè)TCP連接或者UDP流)為流量進(jìn)行排序,然后循環(huán)發(fā)送每個(gè)會(huì)話(huà)的數(shù)據(jù)包。
tbf
tbf是Token Bucket Filter的簡(jiǎn)寫(xiě),適合于把流速降低到某個(gè)值。
不可分類(lèi)QDisc的配置
如果沒(méi)有可分類(lèi)QDisc,不可分類(lèi)QDisc只能附屬于設(shè)備的根。它們的用法如下:
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS
要?jiǎng)h除一個(gè)不可分類(lèi)QDisc,需要使用如下命令:
tc qdisc del dev DEV root
一個(gè)網(wǎng)絡(luò)接口上如果沒(méi)有設(shè)置QDisc,pfifo_fast就作為缺省的QDisc。
CLASSFUL QDISC(分類(lèi)QDisc)
可分類(lèi)的QDisc包括:
CBQ
CBQ是Class Based Queueing(基于類(lèi)別排隊(duì))的縮寫(xiě)。它實(shí)現(xiàn)了一個(gè)豐富的連接共享類(lèi)別結(jié)構(gòu),既有限制(shaping)帶寬的能力,也具有帶寬優(yōu)先級(jí)管理的能力。帶寬限制是通過(guò)計(jì)算連接的空閑時(shí)間完成的??臻e時(shí)間的計(jì)算標(biāo)準(zhǔn)是數(shù)據(jù)包離隊(duì)事件的頻率和下層連接(數(shù)據(jù)鏈路層)的帶寬。
HTB
HTB是Hierarchy Token Bucket的縮寫(xiě)。通過(guò)在實(shí)踐基礎(chǔ)上的改進(jìn),它實(shí)現(xiàn)了一個(gè)豐富的連接共享類(lèi)別體系。使用HTB可以很容易地保證每個(gè)類(lèi)別的帶寬,雖然它也允許特定的類(lèi)可以突破帶寬上限,占用別的類(lèi)的帶寬。HTB可以通過(guò)TBF(Token Bucket Filter)實(shí)現(xiàn)帶寬限制,也能夠劃分類(lèi)別的優(yōu)先級(jí)。
PRIO
PRIO QDisc不能限制帶寬,因?yàn)閷儆诓煌?lèi)別的數(shù)據(jù)包是順序離隊(duì)的。使用PRIO QDisc可以很容易對(duì)流量進(jìn)行優(yōu)先級(jí)管理,只有屬于高優(yōu)先級(jí)類(lèi)別的數(shù)據(jù)包全部發(fā)送完畢,才會(huì)發(fā)送屬于低優(yōu)先級(jí)類(lèi)別的數(shù)據(jù)包。為了方便管理,需要使用iptables或者ipchains處理數(shù)據(jù)包的服務(wù)類(lèi)型(Type Of Service,ToS)。
操作原理
類(lèi)(Class)組成一個(gè)樹(shù),每個(gè)類(lèi)都只有一個(gè)父類(lèi),而一個(gè)類(lèi)可以有多個(gè)子類(lèi)。某些QDisc(例如:CBQ和HTB)允許在運(yùn)行時(shí)動(dòng)態(tài)添加類(lèi),而其它的QDisc(例如:PRIO)不允許動(dòng)態(tài)建立類(lèi)。
允許動(dòng)態(tài)添加類(lèi)的QDisc可以有零個(gè)或者多個(gè)子類(lèi),由它們?yōu)閿?shù)據(jù)包排隊(duì)。
此外,每個(gè)類(lèi)都有一個(gè)葉子QDisc,默認(rèn)情況下,這個(gè)葉子QDisc使用pfifo的方式排隊(duì),我們也可以使用其它類(lèi)型的QDisc代替這個(gè)默認(rèn)的QDisc。而且,這個(gè)葉子葉子QDisc有可以分類(lèi),不過(guò)每個(gè)子類(lèi)只能有一個(gè)葉子QDisc。
當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入一個(gè)分類(lèi)QDisc,它會(huì)被歸入某個(gè)子類(lèi)。我們可以使用以下三種方式為數(shù)據(jù)包歸類(lèi),不過(guò)不是所有的QDisc都能夠使用這三種方式。
tc過(guò)濾器(tc filter)
如果過(guò)濾器附屬于一個(gè)類(lèi),相關(guān)的指令就會(huì)對(duì)它們進(jìn)行查詢(xún)。過(guò)濾器能夠匹配數(shù)據(jù)包頭所有的域,也可以匹配由ipchains或者iptables做的標(biāo)記。
服務(wù)類(lèi)型(Type of Service)
某些QDisc有基于服務(wù)類(lèi)型(Type of Service,ToS)的內(nèi)置的規(guī)則為數(shù)據(jù)包分類(lèi)。
skb-priority
用戶(hù)空間的應(yīng)用程序可以使用SO_PRIORITY選項(xiàng)在skb-priority域設(shè)置一個(gè)類(lèi)的ID。
樹(shù)的每個(gè)節(jié)點(diǎn)都可以有自己的過(guò)濾器,但是高層的過(guò)濾器也可以直接用于其子類(lèi)。
如果數(shù)據(jù)包沒(méi)有被成功歸類(lèi),就會(huì)被排到這個(gè)類(lèi)的葉子QDisc的隊(duì)中。相關(guān)細(xì)節(jié)在各個(gè)QDisc的手冊(cè)頁(yè)中。
命名規(guī)則
所有的QDisc、類(lèi)和過(guò)濾器都有ID。ID可以手工設(shè)置,也可以有內(nèi)核自動(dòng)分配。
ID由一個(gè)主序列號(hào)和一個(gè)從序列號(hào)組成,兩個(gè)數(shù)字用一個(gè)冒號(hào)分開(kāi)。
QDISC
一個(gè)QDisc會(huì)被分配一個(gè)主序列號(hào),叫做句柄(handle),然后把從序列號(hào)作為類(lèi)的命名空間。句柄采用象10:一樣的表達(dá)方式。習(xí)慣上,需要為有子類(lèi)的QDisc顯式地分配一個(gè)句柄。
類(lèi)(CLASS)
在同一個(gè)QDisc里面的類(lèi)分享這個(gè)QDisc的主序列號(hào),但是每個(gè)類(lèi)都有自己的從序列號(hào),叫做類(lèi)識(shí)別符(classid)。類(lèi)識(shí)別符只與父QDisc有關(guān),和父類(lèi)無(wú)關(guān)。類(lèi)的命名習(xí)慣和QDisc的相同。
過(guò)濾器(FILTER)
過(guò)濾器的ID有三部分,只有在對(duì)過(guò)濾器進(jìn)行散列組織才會(huì)用到。詳情請(qǐng)參考tc-filters手冊(cè)頁(yè)。
單位
tc命令的所有參數(shù)都可以使用浮點(diǎn)數(shù),可能會(huì)涉及到以下計(jì)數(shù)單位。
帶寬或者流速單位:
kbps
千字節(jié)/秒
mbps
兆字節(jié)/秒
kbit
KBits/秒
mbit
MBits/秒
bps或者一個(gè)無(wú)單位數(shù)字
字節(jié)數(shù)/秒
數(shù)據(jù)的數(shù)量單位:
kb或者k
千字節(jié)
mb或者m
兆字節(jié)
mbit
兆bit
kbit
千bit
b或者一個(gè)無(wú)單位數(shù)字
字節(jié)數(shù)
時(shí)間的計(jì)量單位:
s、sec或者secs
秒
ms、msec或者msecs
分鐘
us、usec、usecs或者一個(gè)無(wú)單位數(shù)字
微秒
TC命令
tc可以使用以下命令對(duì)QDisc、類(lèi)和過(guò)濾器進(jìn)行操作:
add
在一個(gè)節(jié)點(diǎn)里加入一個(gè)QDisc、類(lèi)或者過(guò)濾器。添加時(shí),需要傳遞一個(gè)祖先作為參數(shù),傳遞參數(shù)時(shí)既可以使用ID也可以直接傳遞設(shè)備的根。如果要建立一個(gè)QDisc或者過(guò)濾器,可以使用句柄(handle)來(lái)命名;如果要建立一個(gè)類(lèi),可以使用類(lèi)識(shí)別符(classid)來(lái)命名。
remove
刪除有某個(gè)句柄(handle)指定的QDisc,根QDisc(root)也可以刪除。被刪除QDisc上的所有子類(lèi)以及附屬于各個(gè)類(lèi)的過(guò)濾器都會(huì)被自動(dòng)刪除。
change
以替代的方式修改某些條目。除了句柄(handle)和祖先不能修改以外,change命令的語(yǔ)法和add命令相同。換句話(huà)說(shuō),change命令不能一定節(jié)點(diǎn)的位置。
replace
對(duì)一個(gè)現(xiàn)有節(jié)點(diǎn)進(jìn)行近于原子操作的刪除/添加。如果節(jié)點(diǎn)不存在,這個(gè)命令就會(huì)建立節(jié)點(diǎn)。
link
只適用于DQisc,替代一個(gè)現(xiàn)有的節(jié)點(diǎn)。
歷史
tc由Alexey N. Kuznetsov編寫(xiě),從Linux 2.2版開(kāi)始并入Linux內(nèi)核。
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)
Linux從kernel 2.1.105開(kāi)始支持QOS,不過(guò),需要重新編譯內(nèi)核。運(yùn)行make config時(shí)將EXPERIMENTAL _OPTIONS設(shè)置成y,并且將Class Based Queueing (CBQ), Token Bucket Flow, Traffic Shapers 設(shè)置為 y ,運(yùn)行 make dep; make clean; make bzilo,生成新的內(nèi)核。
在Linux操作系統(tǒng)中流量控制器(TC)主要是在輸出端口處建立一個(gè)隊(duì)列進(jìn)行流量控制,控制的方式是基于路由,亦即基于目的IP地址或目的子網(wǎng)的網(wǎng)絡(luò)號(hào)的流量控制。流量控制器TC,其基本的功能模塊為隊(duì)列、分類(lèi)和過(guò)濾器。Linux內(nèi)核中支持的隊(duì)列有,Class Based Queue ,Token Bucket Flow ,CSZ ,F(xiàn)irst In First Out ,Priority ,TEQL ,SFQ ,ATM ,RED。這里我們討論的隊(duì)列與分類(lèi)都是基于CBQ(Class Based Queue)的,而過(guò)濾器是基于路由(Route)的。
配置和使用流量控制器TC,主要分以下幾個(gè)方面:分別為建立隊(duì)列、建立分類(lèi)、建立過(guò)濾器和建立路由,另外還需要對(duì)現(xiàn)有的隊(duì)列、分類(lèi)、過(guò)濾器和路由進(jìn)行監(jiān)視。
其基本使用步驟為:
1) 針對(duì)網(wǎng)絡(luò)物理設(shè)備(如以太網(wǎng)卡eth0)綁定一個(gè)CBQ隊(duì)列;
2) 在該隊(duì)列上建立分類(lèi);
3) 為每一分類(lèi)建立一個(gè)基于路由的過(guò)濾器;
4) 最后與過(guò)濾器相配合,建立特定的路由表。
先假設(shè)一個(gè)簡(jiǎn)單的環(huán)境
流量控制器上的以太網(wǎng)卡(eth0) 的IP地址為192.168.1.66,在其上建立一個(gè)CBQ隊(duì)列。假設(shè)包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié)。
假如有三種類(lèi)型的流量需要控制:
1) 是發(fā)往主機(jī)1的,其IP地址為192.168.1.24。其流量帶寬控制在8Mbit,優(yōu)先級(jí)為2;
2) 是發(fā)往主機(jī)2的,其IP地址為192.168.1.26。其流量帶寬控制在1Mbit,優(yōu)先級(jí)為1;
3) 是發(fā)往子網(wǎng)1的,其子網(wǎng)號(hào)為192.168.1.0,子網(wǎng)掩碼為255.255.255.0。流量帶寬控制在1Mbit,優(yōu)先級(jí)為6。
1. 建立隊(duì)列
一般情況下,針對(duì)一個(gè)網(wǎng)卡只需建立一個(gè)隊(duì)列。
將一個(gè)cbq隊(duì)列綁定到網(wǎng)絡(luò)物理設(shè)備eth0上,其編號(hào)為1:0;網(wǎng)絡(luò)物理設(shè)備eth0的實(shí)際帶寬為10 Mbit,包的平均大小為1000字節(jié);包間隔發(fā)送單元的大小為8字節(jié),最小傳輸包大小為64字節(jié)。
?tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64
2. 建立分類(lèi)
分類(lèi)建立在隊(duì)列之上。一般情況下,針對(duì)一個(gè)隊(duì)列需建立一個(gè)根分類(lèi),然后再在其上建立子分類(lèi)。對(duì)于分類(lèi),按其分類(lèi)的編號(hào)順序起作用,編號(hào)小的優(yōu)先;一旦符合某個(gè)分類(lèi)匹配規(guī)則,通過(guò)該分類(lèi)發(fā)送數(shù)據(jù)包,則其后的分類(lèi)不再起作用。
1) 創(chuàng)建根分類(lèi)1:1;分配帶寬為10Mbit,優(yōu)先級(jí)別為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
該隊(duì)列的最大可用帶寬為10Mbit,實(shí)際分配的帶寬為10Mbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為8,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為1Mbit。
2)創(chuàng)建分類(lèi)1:2,其父分類(lèi)為1:1,分配帶寬為8Mbit,優(yōu)先級(jí)別為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
該隊(duì)列的最大可用帶寬為10Mbit,實(shí)際分配的帶寬為 8Mbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為1,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為800Kbit,分類(lèi)的分離點(diǎn)為1:0,且不可借用未使用帶寬。
3)創(chuàng)建分類(lèi)1:3,其父分類(lèi)為1:1,分配帶寬為1Mbit,優(yōu)先級(jí)別為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
該隊(duì)列的最大可用帶寬為10Mbit,實(shí)際分配的帶寬為 1Mbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為2,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為100Kbit,分類(lèi)的分離點(diǎn)為1:0。
4)創(chuàng)建分類(lèi)1:4,其父分類(lèi)為1:1,分配帶寬為1Mbit,優(yōu)先級(jí)別為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
該隊(duì)列的最大可用帶寬為10Mbit,實(shí)際分配的帶寬為 64Kbit,可接收沖突的發(fā)送最長(zhǎng)包數(shù)目為20字節(jié);最大傳輸單元加MAC頭的大小為1514字節(jié),優(yōu)先級(jí)別為1,包的平均大小為1000字節(jié),包間隔發(fā)送單元的大小為8字節(jié),相應(yīng)于實(shí)際帶寬的加權(quán)速率為100Kbit,分類(lèi)的分離點(diǎn)為1:0。
3. 建立過(guò)濾器
過(guò)濾器主要服務(wù)于分類(lèi)。一般只需針對(duì)根分類(lèi)提供一個(gè)過(guò)濾器,然后為每個(gè)子分類(lèi)提供路由映射。
1) 應(yīng)用路由分類(lèi)器到cbq隊(duì)列的根,父分類(lèi)編號(hào)為1:0;過(guò)濾協(xié)議為ip,優(yōu)先級(jí)別為100,過(guò)濾器為基于路由表。
?tc filter add dev eth0 parent 1:0 protocol ip prio 100 route
2) 建立路由映射分類(lèi)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.建立路由
該路由是與前面所建立的路由映射一一對(duì)應(yīng)。
1) 發(fā)往主機(jī)192.168.1.24的數(shù)據(jù)包通過(guò)分類(lèi)2轉(zhuǎn)發(fā)(分類(lèi)2的速率8Mbit)
?ip route add 192.168.1.24 dev eth0 via 192.168.1.66 realm 2
2) 發(fā)往主機(jī)192.168.1.30的數(shù)據(jù)包通過(guò)分類(lèi)3轉(zhuǎn)發(fā)(分類(lèi)3的速率1Mbit)
?ip route add 192.168.1.30 dev eth0 via 192.168.1.66 realm 3
3)發(fā)往子網(wǎng)192.168.1.0/24的數(shù)據(jù)包通過(guò)分類(lèi)4轉(zhuǎn)發(fā)(分類(lèi)4的速率1Mbit)
?ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4
注:一般對(duì)于流量控制器所直接連接的網(wǎng)段建議使用IP主機(jī)地址流量控制限制,不要使用子網(wǎng)流量控制限制。如一定需要對(duì)直連子網(wǎng)使用子網(wǎng)流量控制限制,則在建立該子網(wǎng)的路由映射前,需將原先由系統(tǒng)建立的路由刪除,才可完成相應(yīng)步驟。
5. 監(jiān)視
主要包括對(duì)現(xiàn)有隊(duì)列、分類(lèi)、過(guò)濾器和路由的狀況進(jìn)行監(jiān)視。
1)顯示隊(duì)列的狀況
簡(jiǎn)單顯示指定設(shè)備(這里為eth0)的隊(duì)列狀況
?tc qdisc ls dev eth0
qdisc cbq 1: rate 10Mbit (bounded,isolated) prio no-transmit
詳細(xì)顯示指定設(shè)備(這里為eth0)的隊(duì)列狀況
?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
這里主要顯示了通過(guò)該隊(duì)列發(fā)送了13232個(gè)數(shù)據(jù)包,數(shù)據(jù)流量為7646731個(gè)字節(jié),丟棄的包數(shù)目為0,超過(guò)速率限制的包數(shù)目為0。
2)顯示分類(lèi)的狀況
簡(jiǎn)單顯示指定設(shè)備(這里為eth0)的分類(lèi)狀況
?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表示優(yōu)先級(jí)為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
詳細(xì)顯示指定設(shè)備(這里為eth0)的分類(lèi)狀況
?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
這里主要顯示了通過(guò)不同分類(lèi)發(fā)送的數(shù)據(jù)包,數(shù)據(jù)流量,丟棄的包數(shù)目,超過(guò)速率限制的包數(shù)目等等。其中根分類(lèi)(class cbq 1:0)的狀況應(yīng)與隊(duì)列的狀況類(lèi)似。
例如,分類(lèi)class cbq 1:4發(fā)送了8076個(gè)數(shù)據(jù)包,數(shù)據(jù)流量為5552879個(gè)字節(jié),丟棄的包數(shù)目為0,超過(guò)速率限制的包數(shù)目為0。
顯示過(guò)濾器的狀況
?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代表分類(lèi)class cbq 1:2,to 2代表通過(guò)路由2發(fā)送。
顯示現(xiàn)有路由的狀況
?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
如上所示,結(jié)尾包含有realm的顯示行是起作用的路由過(guò)濾器。
6. 維護(hù)
主要包括對(duì)隊(duì)列、分類(lèi)、過(guò)濾器和路由的增添、修改和刪除。
增添動(dòng)作一般依照"隊(duì)列-分類(lèi)-過(guò)濾器-路由"的順序進(jìn)行;修改動(dòng)作則沒(méi)有什么要求;刪除則依照"路由-過(guò)濾器-分類(lèi)-隊(duì)列"的順序進(jìn)行。
1)隊(duì)列的維護(hù)
一般對(duì)于一臺(tái)流量控制器來(lái)說(shuō),出廠(chǎng)時(shí)針對(duì)每個(gè)以太網(wǎng)卡均已配置好一個(gè)隊(duì)列了,通常情況下對(duì)隊(duì)列無(wú)需進(jìn)行增添、修改和刪除動(dòng)作了。
2)分類(lèi)的維護(hù)
增添
增添動(dòng)作通過(guò)tc class add命令實(shí)現(xiàn),如前面所示。
修改
修改動(dòng)作通過(guò)tc class change命令實(shí)現(xiàn),如下所示:
?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
對(duì)于bounded命令應(yīng)慎用,一旦添加后就進(jìn)行修改,只可通過(guò)刪除后再添加來(lái)實(shí)現(xiàn)。
刪除
刪除動(dòng)作只在該分類(lèi)沒(méi)有工作前才可進(jìn)行,一旦通過(guò)該分類(lèi)發(fā)送過(guò)數(shù)據(jù),則無(wú)法刪除它了。因此,需要通過(guò)shell文件方式來(lái)修改,通過(guò)重新啟動(dòng)來(lái)完成刪除動(dòng)作。
3)過(guò)濾器的維護(hù)
增添
增添動(dòng)作通過(guò)tc filter add命令實(shí)現(xiàn),如前面所示。
修改
修改動(dòng)作通過(guò)tc filter change命令實(shí)現(xiàn),如下所示:
?tc filter change dev eth0 parent 1:0 protocol ip prio 100 route to
10 flowid 1:8
刪除
刪除動(dòng)作通過(guò)tc filter del命令實(shí)現(xiàn),如下所示:
?tc filter del dev eth0 parent 1:0 protocol ip prio 100 route to 10
4)與過(guò)濾器一一映射路由的維護(hù)
增添
增添動(dòng)作通過(guò)ip route add命令實(shí)現(xiàn),如前面所示。
修改
修改動(dòng)作通過(guò)ip route change命令實(shí)現(xiàn),如下所示:
?ip route change 192.168.1.30 dev eth0 via 192.168.1.66 realm 8
刪除
刪除動(dòng)作通過(guò)ip route del命令實(shí)現(xiàn),如下所示:
?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
參考: TC - Linux 流量控制工具 | Life is magic. Coding is art. (int64.me)
TC(Linux下流量控制工具)詳細(xì)說(shuō)明及應(yīng)用_Gino的專(zhuān)欄-CSDN博客
本來(lái)打算直接列一波用法,但是總覺(jué)得,不記錄一下原理,操作起來(lái)也是一臉懵逼。 TC 通過(guò)建立處理數(shù)據(jù)包隊(duì)列,并定義隊(duì)列中數(shù)據(jù)包被發(fā)送的方式,從而實(shí)現(xiàn)進(jìn)行流量控制。TC 模擬實(shí)現(xiàn)流量控制功能使用的隊(duì)列分為兩類(lèi):
classful 隊(duì)列規(guī)定(qdisc), 類(lèi)(class)和過(guò)濾器(filter)這 3 個(gè)組件組成,繪圖中一般用圓形表示隊(duì)列規(guī)定,用矩形表示類(lèi),圖 copy 自 Linux 下 TC 以及 netem 隊(duì)列的使用
都是以一個(gè)根 qdisc 開(kāi)始的,若根 qdisc 是不分類(lèi)的隊(duì)列規(guī)定,那它就沒(méi)有子類(lèi),因此不可能包含其他的子對(duì)象,也不會(huì)有過(guò)濾器與之關(guān)聯(lián),發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)包進(jìn)入這個(gè)隊(duì)列里面排隊(duì),然后根據(jù)該隊(duì)列規(guī)定的處理方式將數(shù)據(jù)包發(fā)送出去。
分類(lèi)的 qdisc 內(nèi)部包含一個(gè)或多個(gè)類(lèi),而每個(gè)類(lèi)可以包含一個(gè)隊(duì)列規(guī)定或者包含若干個(gè)子類(lèi),這些子類(lèi)友可以包含分類(lèi)或者不分類(lèi)的隊(duì)列規(guī)定,如此遞歸,形成了一個(gè)樹(shù)。
句柄號(hào):qdisc 和類(lèi)都使用一個(gè)句柄進(jìn)行標(biāo)識(shí),且在一棵樹(shù)中必須是唯一的,每個(gè)句柄由主號(hào)碼和次號(hào)碼組成 qdisc 的次號(hào)碼必須為 0(0 通??梢允÷圆粚?xiě))
根 qdisc 的句柄為 1:,也就是 1:0。類(lèi)的句柄的主號(hào)碼與它的父輩相同(父類(lèi)或者父 qdisc),如類(lèi) 1:1 的主號(hào)碼與包含他的隊(duì)列規(guī)定 1:的主號(hào)碼相同,1:10 和 1:11 與他們的父類(lèi) 1:1 的主號(hào)碼相同,也為 1。
新建一個(gè)類(lèi)時(shí),默認(rèn)帶有一個(gè) pfifo_fast 類(lèi)型的不分類(lèi)隊(duì)列規(guī)定,當(dāng)添加一個(gè)子類(lèi)時(shí),這個(gè)類(lèi)型的 qdisc 就會(huì)被刪除,所以,非葉子類(lèi)是沒(méi)有隊(duì)列規(guī)定的,數(shù)據(jù)包最后只能到葉子類(lèi)的隊(duì)列規(guī)定里面排隊(duì)。
若一個(gè)類(lèi)有子類(lèi),那么允許這些子類(lèi)競(jìng)爭(zhēng)父類(lèi)的帶寬,但是,以隊(duì)列規(guī)定為父輩的類(lèi)之間是不允許相互競(jìng)爭(zhēng)帶寬的。
默認(rèn) TC 的 qdisc 控制就是出口流量,要使用 TC 控制入口,需要把流量重定向到 ifb 網(wǎng)卡,其實(shí)就是加了一層,原理上還是控制出口 。
為何要先說(shuō) classless 隊(duì)列,畢竟這個(gè)簡(jiǎn)單嘛,要快速使用,那么這個(gè)就是首選了?;?classless 隊(duì)列,我們可以進(jìn)行故障模擬,也可以用來(lái)限制帶寬。
TC 使用 linux network netem 模塊進(jìn)行網(wǎng)絡(luò)故障模擬
網(wǎng)絡(luò)傳輸并不能保證順序,傳輸層 TCP 會(huì)對(duì)報(bào)文進(jìn)行重組保證順序,所以報(bào)文亂序?qū)?yīng)用的影響比上面的幾種問(wèn)題要小。
報(bào)文亂序可前面的參數(shù)不太一樣,因?yàn)樯厦娴膱?bào)文問(wèn)題都是獨(dú)立的,針對(duì)單個(gè)報(bào)文做操作就行,而亂序則牽涉到多個(gè)報(bào)文的重組。模擬報(bào)亂序一定會(huì)用到延遲(因?yàn)槟M亂序的本質(zhì)就是把一些包延遲發(fā)送),netem 有兩種方法可以做。
以 tbf (Token Bucket Filter) 為例,
參數(shù)說(shuō)明:
限制 100mbit
限制延遲 100ms, 流量 100mbit
這個(gè)就復(fù)雜一些,同樣也特別靈活,可以限制特定的 ip 或者服務(wù)類(lèi)型以及端口
以使用 htb 為例
使用 TC 進(jìn)行入口限流,需要把流量重定向到 ifb 虛擬網(wǎng)卡,然后在控制 ifb 的輸出流量