IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉貼|軟件發(fā)布

您當前所在位置: 首頁操作系統(tǒng)LINUX → Linux下利用TC工具控制網(wǎng)絡流量

Linux下利用TC工具控制網(wǎng)絡流量

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

  眾所周知,在互聯(lián)網(wǎng)誕生之初都是各個高校和科研機構相互通訊,并沒有網(wǎng)絡流量控制方面的考慮和設計,IP協(xié)議的原則是盡可能好地為所有數(shù)據(jù)流服務,不同的數(shù)據(jù)流之間是平等的。然而多年的實踐表明,這種原則并不是最理想的,有些數(shù)據(jù)流應該得到特別的照顧, 比如,遠程登錄的交互數(shù)據(jù)流應該比數(shù)據(jù)下載有更高的優(yōu)先級。

  針對不同的數(shù)據(jù)流采取不同的策略,這種可能性是存在的。并且,隨著研究的發(fā)展和深入, 人們已經(jīng)提出了各種不同的管理模式。IETF已經(jīng)發(fā)布了幾個標準, 如綜合服務(Integrated Services)、區(qū)分服務(Diferentiated Services)等。其實,Linux內核從2 2開始,就已經(jīng)實現(xiàn)了相關的流量控制功能。本文將介紹Linux中有關流量控制的相關概念, 用于流量控制的工具TC的使用方法,并給出幾個有代表性實例。

  一、相關概念

  由此可以看出, 報文分組從輸入網(wǎng)卡(入口)接收進來,經(jīng)過路由的查找, 以確定是發(fā)給本機的,還是需要轉發(fā)的。如果是發(fā)給本機的,就直接向上遞交給上層的協(xié)議,比如TCP,如果是轉發(fā)的, 則會從輸出網(wǎng)卡(出口)發(fā)出。網(wǎng)絡流量的控制通常發(fā)生在輸出網(wǎng)卡處。雖然在路由器的入口處也可以進行流量控制,Linux也具有相關的功能, 但一般說來, 由于我們無法控制自己網(wǎng)絡之外的設備, 入口處的流量控制相對較難。本文將集中介紹出口處的流量控制。流量控制的一個基本概念是隊列(Qdisc),每個網(wǎng)卡都與一個隊列(Qdisc)相聯(lián)系, 每當內核需要將報文分組從網(wǎng)卡發(fā)送出去, 都會首先將該報文分組添加到該網(wǎng)卡所配置的隊列中, 由該隊列決定報文分組的發(fā)送順序。因此可以說,所有的流量控制都發(fā)生在隊列中,詳細流程圖見圖1。
?

  圖1報文在Linux內部流程圖

  有些隊列的功能是非常簡單的, 它們對報文分組實行先來先走的策略。有些隊列則功能復雜,會將不同的報文分組進行排隊、分類,并根據(jù)不同的原則, 以不同的順序發(fā)送隊列中的報文分組。為實現(xiàn)這樣的功能,這些復雜的隊列需要使用不同的過濾器(Filter)來把報文分組分成不同的類別(Class)。這里把這些復雜的隊列稱為可分類(ClassfuI)的隊列。通常, 要實現(xiàn)功能強大的流量控制, 可分類的隊列是必不可少的。因此,類別(class)和過濾器(Filter)也是流量控制的另外兩個重要的基本概念。圖2所示的是一個可分類隊列的例子。
?

  圖2多類別隊列

  由圖2可以看出,類別(CIass)和過濾器(Filter)都是隊列的內部結構, 并且可分類的隊列可以包含多個類別,同時,一個類別又可以進一步包含有子隊列,或者子類別。所有進入該類別的報文分組可以依據(jù)不同的原則放入不同的子隊列或子類別中,以此類推。而過濾器(Filter)是隊列用來對數(shù)據(jù)報文進行分類的工具, 它決定一個數(shù)據(jù)報文將被分配到哪個類別中。
?

  二、使用TC

  在Linux中,流量控制都是通過TC這個工具來完成的。通常, 要對網(wǎng)卡進行流量控制的配置,需要進行如下的步驟:

  ◆ 為網(wǎng)卡配置一個隊列;

  ◆ 在該隊列上建立分類;

  ◆ 根據(jù)需要建立子隊列和子分類;

  ◆ 為每個分類建立過濾器。

  在Linux中,可以配置很多類型的隊列,比如CBQ、HTB等,其中CBQ 比較復雜,不容易理解。HTB(HierarchicaIToken Bucket)是一個可分類的隊列, 與其他復雜的隊列類型相比,HTB具有功能強大、配置簡單及容易上手等優(yōu)點。在TC 中, 使用"major:minor"這樣的句柄來標識隊列和類別,其中major和minor都是數(shù)字。

  對于隊列來說,minor總是為0,即"major:0"這樣的形式,也可以簡寫為"major: 比如,隊列1:0可以簡寫為1:。需要注意的是,major在一個網(wǎng)卡的所有隊列中必須是惟一的。對于類別來說,其major必須和它的父類別或父隊列的major相同,而minor在一個隊列內部則必須是惟一的(因為類別肯定是包含在某個隊列中的)。舉個例子,如果隊列2:包含兩個類別,則這兩個類別的句柄必須是2:x這樣的形式,并且它們的x不能相同, 比如2:1和2:2。

  下面,將以HTB隊列為主,結合需求來講述TC的使用。假設eth0出口有100mbit/s的帶寬, 分配給WWW 、E-mail和Telnet三種數(shù)據(jù)流量, 其中分配給WWW的帶寬為40Mbit/s,分配給Email的帶寬為40Mbit/s, 分配給Telnet的帶寬為20Mbit/S。如圖3所示。

  需要注意的是, 在TC 中使用下列的縮寫表示相應的帶寬:

  ◆ Kbps kiIobytes per second, 即"千字節(jié)每秒 ;

  ◆ Mbps megabytes per second, 即"兆字節(jié)每秒 ,

  ◆ Kbit kilobits per second,即"千比特每秒 ;

  ◆ Mbit megabits per second, 即"兆比特每秒 。
?

  三、創(chuàng)建HTB隊列

  有關隊列的TC命令的一般形式為:

  #tc qdisc [add|change|replace|link] dev DEV [parent qdisk-id|root][handle qdisc-id] qdisc[qdisc specific parameters]

  首先,需要為網(wǎng)卡eth0配置一個HTB隊列,使用下列命令:

  #tc qdisc add dev eth0 root handle 1:htb default 11

  這里,命令中的"add 表示要添加,"dev eth0 表示要操作的網(wǎng)卡為eth0。"root 表示為網(wǎng)卡eth0添加的是一個根隊列。"handle 1: 表示隊列的句柄為1:。"htb 表示要添加的隊列為HTB隊列。命令最后的"default 11 是htb特有的隊列參數(shù),意思是所有未分類的流量都將分配給類別1:11。

#p#副標題#e#

  四、為根隊列創(chuàng)建相應的類別

  有關類別的TC 命令的一般形式為:

  #tc class [add|change|replace] dev DEV parent qdisc-id [classid class-id] qdisc [qdisc specific parameters]

  可以利用下面這三個命令為根隊列1創(chuàng)建三個類別,分別是1:1 1、1:12和1:13,它們分別占用40、40和20mb[t的帶寬。

  #tc class add dev eth0 parent 1: classid 1:1 htb rate 40mbit ceil 40mbit

  #tc class add dev eth0 parent 1: classid 1:12 htb rate 40mbit ceil 40mbit

  #tc class add dev eth0 parent 1: cllassid 1:13 htb rate 20mbit ceil 20mbit

  命令中,"parent 1:"表示類別的父親為根隊列1:。"classid1:11"表示創(chuàng)建一個標識為1:11的類別,"rate 40mbit"表示系統(tǒng)

  將為該類別確保帶寬40mbit,"ceil 40mbit",表示該類別的最高可占用帶寬為40mbit。

  五、為各個類別設置過濾器

  有關過濾器的TC 命令的一般形式為:

  #tc filter [add|change|replace] dev DEV [parent qdisc-id|root] protocol protocol prio priority filtertype [filtertype specific parameters] flowid flow-id

  由于需要將WWW、E-mail、Telnet三種流量分配到三個類別,即上述1:11、1:12和1:13,因此,需要創(chuàng)建三個過濾器,如下面的三個命令:

  #tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:11

  #tc filter add dev eth0 prtocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:12

  #tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 23 oxffff flowid 1:13

  這里,"protocol ip"表示該過濾器應該檢查報文分組的協(xié)議字段。"pr[o 1" 表示它們對報文處理的優(yōu)先級是相同的,對于不同優(yōu)先級的過濾器, 系統(tǒng)將按照從小到大的優(yōu)先級。

  順序來執(zhí)行過濾器, 對于相同的優(yōu)先級,系統(tǒng)將按照命令的先后順序執(zhí)行。這幾個過濾器還用到了u32選擇器(命令中u32后面的部分)來匹配不同的數(shù)據(jù)流。以第一個命令為例,判斷的是dport字段,如果該字段與Oxffff進行與操作的結果是8O,則"flowid 1:11" 表示將把該數(shù)據(jù)流分配給類別1:1 1。更加詳細的有關TC的用法可以參考TC 的手冊頁。
?

  六、復雜的實例

  在上面的例子中, 三種數(shù)據(jù)流(www、Email、Telnet)之間是互相排斥的。當某個數(shù)據(jù)流的流量沒有達到配額時,其剩余的帶寬并不能被其他兩個數(shù)據(jù)流所借用。在這里將涉及如何使不同的數(shù)據(jù)流可以共享一定的帶寬。

  首先需要用到HTB的一個特性, 即對于一個類別中的所有子類別,它們將共享該父類別所擁有的帶寬,同時,又可以使得各個子類別申請的各自帶寬得到保證。這也就是說,當某個數(shù)據(jù)流的實際使用帶寬沒有達到其配額時, 其剩余的帶寬可以借給其他的數(shù)據(jù)流。而在借出的過程中,如果本數(shù)據(jù)流的數(shù)據(jù)量增大,則借出的帶寬部分將收回, 以保證本數(shù)據(jù)流的帶寬配額。

  下面考慮這樣的需求, 同樣是三個數(shù)據(jù)流WWW、E-mail和Telnet, 其中的Telnet獨立分配20Mbit/s的帶寬。另一方面,VWVW 和SMTP各自分配40Mbit/s。同時,它們又是共享的關系, 即它們可以互相借用帶寬。如圖3所示。
?

  需要的TC命令如下:

  #tc qdisc add dev eth0 root handle 1: htb default 21

  #tc class add dev eth0 p

關鍵詞標簽:Linux,TC工具控制網(wǎng)絡

相關閱讀

文章評論
發(fā)表評論

熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP Linux操作系統(tǒng)修改IP

相關下載

    人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關機、重啟、注銷 命令 查看linux服務器硬盤IO讀寫負載