class="21772">
Linux;包含復雜的帶寬管理系統;TC;(流量控制,Traffic;Control)。該系統支持分類、優先、共享和輸入、輸出流量限制等。這套系統可以與專用的帶寬管理系統相媲美。
1.;基本的構成塊
tc;包括三個基本的構成塊:;隊列規定(queueing;discipline;)、類(class)和分類器(Classifiers);。
隊列規定可以看作設備的流量/數據包管理器。;隊列規定內封裝了其他兩個主要TC組件(類和分類器),控制數據的流動。
目前,有一些設備隊列規定可以用來管理設備,包括類基隊列(CBQ),優先級和CSZ;(Clark-Shenker-Zhang)等。CBQ;是一種超級隊列,即它能夠包含其它隊列(甚至其它CBQ)。
類由設備隊列規定來管理。類由若干規則(rule)構成,這些規則用以管理那個類所擁有的數據。例如,某類裡的全部數據包都受到;1;Mbps的速率限度,而在午夜和早上6點的一段時間段內允許最高達;3;Mbps。
一些隊列規定可以綁定到類上,包括FIFO(先進先出),RED(隨機早期探測),SFQ(隨機公平隊列)和令牌桶(Token;Bucket)。
如果設備上未綁定隊列規定,則使用基本的FIFO。另外,;CBQ,CSZ和優先級也能用於類,以及類的子類。這表明使用TC,可以輕松地建造非常復雜的流量控制。管理類的隊列規定可以稱為類隊列規定(class;queueing;disciplines)。
一般地,類隊列規定管理該類的數據和隊列,能決定延遲、丟掉或者重新分類它管理的包。分類器或過濾器描述包,並且把他們映射到隊列規定所管理的類。
這些過濾器通常都提供簡單的描述語言,指定選擇包、把包映射到類的方法。
目前,TC可以使用的過濾器有:fwmark分類器,u32分類器,基於路由的分類器和RSVP分類器(分別用於IPV6、IPV4)等;其中,fwmark分類器允許我們使用;Linux;netfilter;代碼選擇流量,而u32分類器允許我們選擇基於;ANY;頭的流量;。所有的防火牆過濾器,;例如,ipchains,都能用來分類包。
TC代碼位於內核,不同的功能塊既能編譯為模塊,也能直接編進內核。;與內核代碼或模塊的通信和配置由用戶級程序tc完成。
2.;示例
2.1;編譯內核
首先要確保選中;Kernel/User;netlink;socket,因為只有這樣;tc;才能通過;netlink;與內核通訊。
然後,把隊列規定和分類器都編進內核。這其中包括:
QoS;or;fair;queueing,;CBQ;packet;scheduler,;CSZ;packet;scheduler,;the;simplest;PRIO;pseudoscheduler,;RED;queue,;SFQ;queue,;TBF;queue,;QoS;support,;rate;estimator,;packet;classifier;API,;routing-tables-based;classifier,;U32;classifier,;special;RSVP;classifier;和;special;RSVP;classifier;for;IPv6。
然後就是大家熟知的編譯和安裝過程了。
2.2;建立
[因特網];---〈E3、T3;等〉---;[Linux;路由器];---;[Office+ISP]
eth1;eth0
上圖中的;Linux;路由器有兩個接口,不妨稱之為;eth0;和;eth1。eth1;連接到路由器,;eth0;連接到包括公司防火牆在內的子網上。
由於我們只能限制發送的內容,所以我們需要兩套獨立的、但可能非常相似的規則集。我們可以通過改變發送次序來控制傳輸速率。通過修改;eth0;上的隊列,我們可以確定客戶;的下載(download)速率;通過修改;eth1;上的隊列,我們可以確定我們公司自己的用;戶的上載(upload)速率。
比如說,公司連接到因特網的線路帶寬為;10;兆,同時滿足外部客戶和公司自己用戶的需要;此時,我們就需要一種策略,來進行管理和協調。CBQ;就可以滿足我們的要求。
我們有兩個主類:'ISP';和;'Office'。我們可以決定,客戶有;8;兆的帶寬,Office用戶有;2;兆的帶寬。
我們首先發布如下的命令:
#;tc;qdisc;add;dev;eth0;root;handle;10:;cbq;bandwidth;10Mbit;avpkt;1000
其含義是:我們配置了;eth0;的隊列規定,root;表示這是根(root)規定,其句柄;(handle)設定為;10:'。;其類型為;CBQ。帶寬為;10;M,平均包大小為;1000;字節。
下面生成根類(root;class):
#;tc;class;add;dev;eth0;parent;10:0;classid;10:1;cbq;bandwidth;10Mbit;rate;
10Mbit;allot;1514;weight;1Mbit;prio;8;maxburst;20;avpkt;1000
這條命令其實不比前一條命令有更多的含義。其中,1514;是;MTU;的值。;
下面生成;ISP;類:;
#;tc;class;add;dev;eth0;parent;10:1;classid;10:100;cbq;bandwidth;10Mbit;rate;
8Mbit;allot;1514;weight;800Kbit;prio;5;maxburst;20;avpkt;1000;bounded
我們分配了;8;兆的帶寬給它,其中;bounded;表示該類不能超過該閥值。
下面生成;Office;類:
#;tc;class;add;dev;eth0;parent;10:1;classid;10:200;cbq;bandwidth;10Mbit;rate;
2Mbit;allot;1514;weight;200Kbit;prio;5;maxburst;20;avpkt;1000;bounded
為了更清晰起見,我們的類可以用下圖表示:
我們已經向內核通知了我們的類,我們還需要告訴內核如何管理隊列,如下所示:
#;tc;qdisc;add;dev;eth0;parent;10:100;sfq;quantum;1514b;perturb;15
#;tc;qdisc;add;dev;eth0;parent;10:200;sfq;quantum;1514b;perturb;15
這裡,我們使用了隨機公平隊列(sfq),在消耗;CPU;周期較少的情況下,其性能還是可以接受的。其它一些隊列規定可能更好,但要占用較多的;CPU;資源。令牌桶過濾器也經常使用。
下面還有一件事要作:告訴內核網絡包和類的映射關系。
#;tc;filter;add;dev;eth0;parent;10:0;protocol;ip;prio;100;u32;match;ip;dst;
150.151.23.24;flowid;10:200
#;tc;filter;add;dev;eth0;parent;10:0;protocol;ip;prio;25;u32;match;ip;dst;
150.151.0.0/16;flowid;10:100
這裡,我們假定;Office;位於防火牆;150.151.23.24;的後面,其它;IP;地址都屬於;ISP。;u32;匹配是一種比較簡單的匹配,我們可以使用;netfilter;生成更加復雜的匹配規則。
我們已經分配了下載帶寬,下面是上載帶寬的分配:
#;tc;qdisc;add;dev;eth1;root;handle;20:;cbq;bandwidth;10Mbit;avpkt;1000
#;tc;class;add;dev;eth1;parent;20:0;classid;20:1;cbq;bandwidth;10Mbit;rate;
10Mbit;allot;1514;weight;1Mbit;prio;8;maxburst;20;avpkt;1000
#;tc;class;add;dev;eth1;parent;20:1;classid;20:100;cbq;bandwidth;10Mbit;rate;
8Mbit;allot;1514;weight;800Kbit;prio;5;maxburst;20;avpkt;1000;
bounded
#;tc;class;add;dev;eth1;parent;20:1;classid;20:200;cbq;bandwidth;10Mbit;rate;
2Mbit;allot;1514;weight;200Kbit;prio;5;maxburst;20;avpkt;1000;
bounded
#;tc;qdisc;add;dev;eth1;parent;20:100;sfq;quantum;1514b;perturb;15
#;tc;qdisc;add;dev;eth1;parent;20:200;sfq;quantum;1514b;perturb;15
#;tc;filter;add;dev;eth1;parent;20:0;protocol;ip;prio;100;u32;match;ip;src;
150.151.23.24;flowid;20:200
#;tc;filter;add;dev;eth1;parent;20:0;protocol;ip;prio;25;u32;match;ip;src;
150.151.0.0/16;flowid;20:100
這與前面的描述基本一致,所以就不做更多的解釋了。
注:;
在前面的例子中,我們注意到:即使;ISP;客戶多數離線,我們的;Office;用戶也仍然只;有;2;M;的帶寬,這是相當浪費的。我們可以刪掉;'bounded';參數,這樣,各類之間就可以相互借用帶寬了。
但是,某些類也許不希望向其它類借用帶寬;比如,一條線路上的兩個互為競爭對手的;ISP;的情況。在這種情況下,我們可以加上關鍵字;'isolated'。
3.;結束語
目前,Linux;所提供的;QoS(服務質量)是所有操作系統中最復雜、最完善的。另外,;BSD;的;ALTQ;應該說也相當不錯;但是,在復雜性、靈活性和可擴展性等方面要落後;Linux;一大截。我不太清楚微軟的產品是否提供了這方面的功能。Sun;的;Solaris;提供;了;CBQ;和;RSVP;的功能。
Linux;也支持;IETF;diffserv;特征。Linux;在;QoS;方面眾多的特征,將極大提升;Linux;的市場占有率。