您好,登錄后才能下訂單哦!
這篇文章主要為大家分享TC限速的實現步驟。文中還介紹了TC限速原理和TC限速的隊列規則分類器等,希望大家通過這篇文章能有所收獲。
一.TC限速相關介紹
1.TC限速原理介紹
Linux操作系統中的流量控制器TC(Traffic Control)用于Linux內核的流量控制,主要是通過在輸出端口處建立一個隊列來實現流量控制。
接收包從輸入接口進來后,經過流量限制丟棄不符合規定的數據包,由輸入多路分配器進行判斷選擇,如果接收包的目的主機是本主機,那么將該包送給上層處理,否則需要進行轉發,將接收包交到轉發塊(Forwarding Block)處理。轉發塊同時也接收本主機上層(TCP、UDP等)產生的包,通過查看路由表,決定所處理包的下一跳。然后,對包進行排列以便將它們送到輸出接口。
從以上介紹可以看出,TC只能對網卡發出的數據包做分類限制,不能對網卡接收的數據包做分類限制,但是可以對網卡接收的數據包流量做一個整體限制。因為我們項目中只需要對網卡接收的流量做整體限制,所以TC剛好可以滿足我們對網卡流量雙向限制的要求。
2.TC限速基本概念介紹
TC對流量的處理由三種對象控制,它們是:
隊列規則 qdisc(queueing discipline)
類(class)
分類器(Classifiers).
qdisc隊列規則(queueing discipline)
qdisc(隊列規則)是queueing discipline的簡寫,它是理解流量控制(traffic control)的基礎。無論何時,內核如果需要通過某個網絡接口發送數據包,它都需要按照為這個接口配置的qdisc把數據包加入隊列。然后,內核會盡可能多地從qdisc里面取出數據包,把它們交給網絡適配器驅動模塊。最簡單的qdisc是pfifo,它不對進入的數據包做任何的處理,數據包采用先入先出的方式通過隊列。不過,它會保存網絡接口一時無法處理的數據包。
可分類的qdisc包括:
(1)CBQ
CBQ是Class Based Queueing(基于類別排隊)的縮寫。它實現了一個豐富的連接共享類別結構,既有限制(shaping)帶寬的能力,也具有帶寬優先級管理的能力。帶寬限制是通過計算連接的空閑時間完成的。空閑時間的計算標準是數據包離隊事件的頻率和下層連接(數據鏈路層)的帶寬。
(2)HTB
HTB是Hierarchy Token Bucket的縮寫。通過在實踐基礎上的改進,它實現了一個豐富的連接共享類別體系。使用HTB可以很容易地保證每個類別的帶寬,雖然它也允許特定的類可以突破帶寬上限,占用別的類的帶寬。HTB可以通過TBF(Token Bucket Filter)實現帶寬限制,也能夠劃分類別的優先級。
(3)PRIO
PRIO qdisc不能限制帶寬,因為屬于不同類別的數據包是順序離隊的。使用PRIO qdisc可以很容易對流量進行優先級管理,只有屬于高優先級類別的數據包全部發送完畢,才會發送屬于低優先級類別的數據包。為了方便管理,需要使用iptables或者ipchains處理數據包的服務類型(Type Of Service,ToS)。
Class 類
某些qdisc可以包含一些類別,不同的類別中可以包含更深入的qdisc,通過這些細分的qdisc還可以為進入隊列的數據包排隊。通過設置各種類別數據包的離隊次序,qdisc可以設置網絡數據流量的優先級。
Filter 規則
Filter(過濾器)用于為數據包分類,決定它們按照何種qdisc進入隊列。無論何時數據包進入一個劃分子類的類別中,都需要進行分類。分類的方法可以有多種,使用fileter(過濾器)就是其中之一。使用filter(過濾器)分類時,內核會調用附屬于這個類(class)的所有過濾器,直到返回一個判決。如果沒有判決返回,就作進一步的處理,而處理方式和qdisc有關。需要注意的是,filter(過濾器)是在qdisc內部,它們不能作為主體。
二.TC限速操作
1.虛擬機流入流量限制
(1)清除tap01網卡設備上所有的流入規則,防止與新添加的規則沖突。
# tc qdisc del dev tap01 root
(2)在網絡設備tap01上綁定一個htb類型的qdisc根隊列
# tc qdisc add dev tap01 root handle 1: htb default 9999
(3)在qdisc根隊列1:下創建一個子類1:5,并設置子類的流量速率為50Mb/s
# tc class add dev tap01 parent 1: classid 1:5 htb rate 50Mbit burst 1Mbit
(4)為子類1:5添加隨機公平隊列sfq,防止該類被某一會話連接獨占
# tc qdisc add dev tap01 parent 1:5 handle 5: sfq perturb 10
(5)為子類1:5添加過濾器,用來將目標地址為0.0.0.0/0(指所有網絡)的數據包發往類1:5,使用其中的規則出隊
# tc filter add dev tap01 parent 1: protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:5
注: tap01為虛擬機連接到網橋的網卡,與虛擬機內部的網卡一一對應。因tap01口的出方向的流量就是進入虛擬機內部網卡的流量,所以限制tap01口的出方向的流量,就可以限制流入虛擬機的網絡流量。
2.虛擬機流出流量限制
(1)清除tap01網卡設備上所有的流入規則,防止與新添加的規則沖突。
# tc qdisc del dev tap01 ingress
(2)在網絡設備tap01上綁定一個處理ingress流量的qdisc根隊列
# tc qdisc add dev tap01 ingress handle ffff:
(3)為類ffff:添加過濾器,并限制流量為50Mb/s
# tc filter add dev tap01 parent ffff: protocol all prio 1 basic police rate 50Mbit burst 10Mbit mtu 65535 drop
注: tap01為虛擬機連接到網橋的網卡,與虛擬機內部的網卡一一對應。因tap01口的入方向的流量就是虛擬機內部網卡發出的流量,所以限制tap01口的入方向的流量,即可限制流出虛擬機的網絡流量。
命令中的數字10和65535存在關聯性,需要一起修改,否則會導致限速不準確。
看完上述內容,你們對TC限速原理和TC限速的實現大概了解了嗎?如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。