Traffic Controll
生活随笔
收集整理的這篇文章主要介紹了
Traffic Controll
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
TC--Traffic Control
?
?
TC流量控制方式 ?
SHAPING 限制--流量被限制時,它的傳輸速率就被控制在某個值以下,限制閾值可以大大的小于有效帶寬,這樣可以平滑網絡的突發流量,是網絡更穩定,shaping適用于限制外出的流量。 ?
SCHEDULING 調度--通過調度數據包的傳輸,可以在帶寬范圍內按照優先級分配,也只適用于限制外出流量。 ?
POLICING 策略--用于處理接收到的數據 ?
DROPPING 丟棄--如果流量超過設置的帶寬就丟棄數據包,向內向外皆管用。 ?
?
TC流量控制處理對象 ?
流量的處理由三種對象控制,分別是:qdisc-排隊規則、class-類別、filter-過濾器。 ?
QDISC ?
? ? qdisc是流量控制的基礎,無論何時,內核如果需要通過某個網絡接口發送數據包,它都需要按照該接口配置的qdisc把數據包加入隊列中。內核會盡可能多的從qdisc中取出數據包,然后交給網絡適配器進行處理。而qdisc又分為CLASSLESS QDisc--不可分類隊列規則、CLASSFUL QDISC--分類隊列規則。 ?
CLASSLESS QDisc--不可分類隊列規則 ?
無類qdisc包括以下隊列: [p|b]fifo ?最簡單的qdsic,先進先出策略,只有一個limit參數用來設置隊列長度,pfifo是以數據包個數為單位,bfifo是以字節數為單位。pfifo_fast包含三個波段,band0~band2,每個波段也使用先進先出策略,band0優先級最高,band2最低,如果band0中有數據包,系統就不會去處理band1的數據包,直到band0的數據包處理完。同理band1和band2。 ?
red ?是Random Early Detection的簡寫--隨機早起檢測。當帶寬的占用接近指定帶寬時隨機的丟棄一些數據包。 ?
sfq ?是Stochastic Fairness Queueing的簡寫--隨機公平隊列,它會按照會話為流量進行排序,一般對應于每個tcp或者udp數據流,然后循環發送每個會話的數據包。 ?
tbf ?是Token Bucket Filter的簡寫--xx 適合把速率降到某個值。 ?
如果沒有設置可分類隊列規則,則無分類隊列規則只能屬于設備的根。如下設置:tc qdisc add dev DEV root QDISC QDISC-PARAMETERS,如果一個接口沒有設置qdisc,則pfifo_fast是默認的缺省qdisc。 ?
?
CLASSFUL QDISC--分類隊列規則 ?
分類隊列規則包括以下隊列: CBQ ?是Class Based Queueing的簡寫,它實現了一個豐富的連接共享類別結構,既有限制帶寬能力又有帶寬優先級管理能力。帶寬限制是通過計算連接的空閑時間完成的,空閑時間的計算標準是數據包離隊事件的頻率和下層連接的帶寬。 ?
HTB ?是?Hierarchy Token Bucket的簡寫,它實現了一個豐富的連接共享類別結構,使用HTB可以很容易的保證每個類的帶寬,同時也允許特定類可以突破上限,占用其他類等寬等。HTB通過TFB實現帶寬限制,也可以為類劃分優先級。 ?
PRIO 不能限制帶寬,因為屬于不同類別的數據包是順序離隊的。使用PRIO qdisc可以很容易對流量進行優先級管理,只有屬于高優先級類別的數據包全部發送完畢,才會發送屬于低優先級類別的數據包。為了方便管理,需要使用 iptables或者ipchains處理數據包的服務類型(Type Of Service,ToS)。 ?
?
CLASS ?
? ? 一些qdisc可以包含一些類,不同的類中又可以包含更深入的qdisc,通過這些細分的qdisc可以為進入隊列的數據包排隊,通過設置各種類數據包的離隊次序,可以設置網絡數據流量的優先級。例如,我們要對不同的IP實施不同的流量控制策略,這時就需要用不同的類來控制。 ?
?
FILTER ?
? ? filter用于為數據包分類,決定數據包進入何種qdisc隊列,分類的方法有多種filter是一種方法,使用filter時內核會調用屬于這個類的所有過濾器,直到返回一個決定,如果么有返回決定,就做進一步處理,處理方式和qdisc有關。filter是在qdisc內部的。目前可用的過濾器有:u32、rsvp、fwmark等。 ?
?
?
?
操作原理 ?
? ? 類組成一個樹,每個類都只有一個父類,卻可以有多個子類,某些qdisc允許在運行時動態添加類,如cbq、htb,而有些qdisc在運行時不許動態添加類,如prio。允許動態添加類的qdisc可以有多個子類,由他們為數據包排隊。每個類都有一個葉子qdisc,默認這個葉子qdisc使用pfifo的隊列,當然也可以用其他隊列替換,而且,這個qdisc可以再次包含其他類,但是每個類只能有一個葉子qdisc。當一個數據包進入一個qdisc時,可以使用三種方式為其分類:tc filters、Type of Service、skb->priority。但是并不是所有的qdisc都可以使用這三種方式。 ?
?
命名規則 ?
? ? 所有的qdiscs, classes and filters都有自己的ID,可以手動指定也可以自動獲取,ID包含一個主號碼和一個從號碼,用冒號分開。 ?
QDISC ? ? 一個qdisc會被分配一個主號碼,叫做handle,把從號碼作為類的命名空間,習慣上需要為有子類的qdisc分配一個handle。一個qdisc如果是根節點,則parent的值就是root,如果qdisc下面有劃分類,這時就需要指定handle,handle的值是major:minor格式的,對于root來說,格式是1:,后面不需要指定minor,要指定的話,qdisc的minor必須為0。非根的qdisc的handle的major可以自己設置,minor不用設置,非根的parent的值也是major:minor格式,值是一個已存在的類。 ?
CLASS ? ? 在同一個qdisc里面的類共享這個qdisc的主號碼,每個類都有自己的從號碼,叫做classid,classid只和父qdisc有關,和父class無關,parent值的格式也是major:minor的,major這個指定該類的父節點的handle的major值,父節點可以是class也可以是qdisc,如果是qdisc,則minor可以不用設置或者設置為0,如果是class,則parent的值是其父類的classid值,classid的值格式也是major:minor的,major是父qdisc的handle的major的值,minor值是自己設置。 ?
FILTER ? ? 過濾器的ID有三部分,只有在對過濾器進行散列組織才會用到。 ?
?
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 ?spe‐cific parameters ] ? ? tc ?filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio pri‐ority filtertype [ filtertype specific parameters ] flowid flow-id ? tc ?[ FORMAT ] qdisc show [ dev DEV ] tc ?[ FORMAT ] class show dev DEV tc ?filter show dev DEV ?
?
使用tc命令可以對qdisc、class、filter進行如下操作: add ?在一個節點上添加qdisc、class、filter,添加時,需要傳遞一個parent,傳遞參數時既可以用ID也可以使用設備的根,在建立qdisc和filter時,可以使用handle來命名,在建立class時可以使用classid來命名 ?
remove ?刪除某個handle指定的qdisc,也可刪除根qdisc。被刪除的qdisc上的所有子類以及過濾器都會被自動刪除。 ?
change ?以替代的方式修改某些條目,除了handle和parent不能被修改外,其余語法同add,change命令不能移除一個節點 ?
replace ?添加或者刪除一個節點,是一個原子操作,如果節點不存在,則建立節點。 ?
link ?只適用于qdisc,替代一個存在的節點。 ?
?
實施 主要是建立隊列、分類、過濾器三步。 1 給物理設備建立一個隊列qdisc 2 在相關隊列上建立分類,一般是在該qdisc上建立一個根分類,然后在此根分類上建立子類。 3 為每一個分類建立基于路由的過濾器,并把過濾規則與特定的路由結合。一般只需要針對根分類提供一個過濾器,然后為每個子類提供路由映射。 ?
?
關于各個策略的參數可以man ?tc-cbq ?tc-htb ?tc-sfq ?tc-red tc-tbf ?tc-pfifo ?tc-bfifo tc-pfifo_fast查看。
? ? TC是linux中的流量控制模塊,利用隊列規定建立起數據包隊列,并定義了隊列中數據包的發送方式,從而實現對流量的控制。
? ? TC在流量控制中使用的隊列分為兩類:1 無類隊列 ?2 有類隊列。無類隊列比較簡單,分類隊列則有分類和過濾器等概念,比較復雜。
? ? 無類隊列對進入網卡的數據流統一對待,不進行區分,無類隊列形成的隊列能夠接受數據包以及重新編排、延遲、丟包,它可以對網卡流量進行整形,但是不能細分各種情況,無類隊列規定主要有pfifo_fast、tbf、sfq等,無類隊列的流量整形手段主要是排序、限速、丟包。
? ? 有類隊列規定則是對進入網卡的數據包根據不同的需求以分類的方式區分對待的分類規定,數據包進入分類隊列后,通過過濾器對數據包進行分類,過濾器返回一個決定,隊列就根據這個返回的決定把數據包發送到相應的某一類隊列中進行排隊。每個子類可以再次使用他們的過濾器進行進一步的分類,直到不需要分類為止,數據包才會進入相關類的隊列中進行排隊。 ??
TC流量控制方式 ?
SHAPING 限制--流量被限制時,它的傳輸速率就被控制在某個值以下,限制閾值可以大大的小于有效帶寬,這樣可以平滑網絡的突發流量,是網絡更穩定,shaping適用于限制外出的流量。 ?
SCHEDULING 調度--通過調度數據包的傳輸,可以在帶寬范圍內按照優先級分配,也只適用于限制外出流量。 ?
POLICING 策略--用于處理接收到的數據 ?
DROPPING 丟棄--如果流量超過設置的帶寬就丟棄數據包,向內向外皆管用。 ?
?
TC流量控制處理對象 ?
流量的處理由三種對象控制,分別是:qdisc-排隊規則、class-類別、filter-過濾器。 ?
QDISC ?
? ? qdisc是流量控制的基礎,無論何時,內核如果需要通過某個網絡接口發送數據包,它都需要按照該接口配置的qdisc把數據包加入隊列中。內核會盡可能多的從qdisc中取出數據包,然后交給網絡適配器進行處理。而qdisc又分為CLASSLESS QDisc--不可分類隊列規則、CLASSFUL QDISC--分類隊列規則。 ?
CLASSLESS QDisc--不可分類隊列規則 ?
無類qdisc包括以下隊列: [p|b]fifo ?最簡單的qdsic,先進先出策略,只有一個limit參數用來設置隊列長度,pfifo是以數據包個數為單位,bfifo是以字節數為單位。pfifo_fast包含三個波段,band0~band2,每個波段也使用先進先出策略,band0優先級最高,band2最低,如果band0中有數據包,系統就不會去處理band1的數據包,直到band0的數據包處理完。同理band1和band2。 ?
red ?是Random Early Detection的簡寫--隨機早起檢測。當帶寬的占用接近指定帶寬時隨機的丟棄一些數據包。 ?
sfq ?是Stochastic Fairness Queueing的簡寫--隨機公平隊列,它會按照會話為流量進行排序,一般對應于每個tcp或者udp數據流,然后循環發送每個會話的數據包。 ?
tbf ?是Token Bucket Filter的簡寫--xx 適合把速率降到某個值。 ?
如果沒有設置可分類隊列規則,則無分類隊列規則只能屬于設備的根。如下設置:tc qdisc add dev DEV root QDISC QDISC-PARAMETERS,如果一個接口沒有設置qdisc,則pfifo_fast是默認的缺省qdisc。 ?
?
CLASSFUL QDISC--分類隊列規則 ?
分類隊列規則包括以下隊列: CBQ ?是Class Based Queueing的簡寫,它實現了一個豐富的連接共享類別結構,既有限制帶寬能力又有帶寬優先級管理能力。帶寬限制是通過計算連接的空閑時間完成的,空閑時間的計算標準是數據包離隊事件的頻率和下層連接的帶寬。 ?
HTB ?是?Hierarchy Token Bucket的簡寫,它實現了一個豐富的連接共享類別結構,使用HTB可以很容易的保證每個類的帶寬,同時也允許特定類可以突破上限,占用其他類等寬等。HTB通過TFB實現帶寬限制,也可以為類劃分優先級。 ?
PRIO 不能限制帶寬,因為屬于不同類別的數據包是順序離隊的。使用PRIO qdisc可以很容易對流量進行優先級管理,只有屬于高優先級類別的數據包全部發送完畢,才會發送屬于低優先級類別的數據包。為了方便管理,需要使用 iptables或者ipchains處理數據包的服務類型(Type Of Service,ToS)。 ?
?
CLASS ?
? ? 一些qdisc可以包含一些類,不同的類中又可以包含更深入的qdisc,通過這些細分的qdisc可以為進入隊列的數據包排隊,通過設置各種類數據包的離隊次序,可以設置網絡數據流量的優先級。例如,我們要對不同的IP實施不同的流量控制策略,這時就需要用不同的類來控制。 ?
?
FILTER ?
? ? filter用于為數據包分類,決定數據包進入何種qdisc隊列,分類的方法有多種filter是一種方法,使用filter時內核會調用屬于這個類的所有過濾器,直到返回一個決定,如果么有返回決定,就做進一步處理,處理方式和qdisc有關。filter是在qdisc內部的。目前可用的過濾器有:u32、rsvp、fwmark等。 ?
?
?
?
操作原理 ?
? ? 類組成一個樹,每個類都只有一個父類,卻可以有多個子類,某些qdisc允許在運行時動態添加類,如cbq、htb,而有些qdisc在運行時不許動態添加類,如prio。允許動態添加類的qdisc可以有多個子類,由他們為數據包排隊。每個類都有一個葉子qdisc,默認這個葉子qdisc使用pfifo的隊列,當然也可以用其他隊列替換,而且,這個qdisc可以再次包含其他類,但是每個類只能有一個葉子qdisc。當一個數據包進入一個qdisc時,可以使用三種方式為其分類:tc filters、Type of Service、skb->priority。但是并不是所有的qdisc都可以使用這三種方式。 ?
?
命名規則 ?
? ? 所有的qdiscs, classes and filters都有自己的ID,可以手動指定也可以自動獲取,ID包含一個主號碼和一個從號碼,用冒號分開。 ?
QDISC ? ? 一個qdisc會被分配一個主號碼,叫做handle,把從號碼作為類的命名空間,習慣上需要為有子類的qdisc分配一個handle。一個qdisc如果是根節點,則parent的值就是root,如果qdisc下面有劃分類,這時就需要指定handle,handle的值是major:minor格式的,對于root來說,格式是1:,后面不需要指定minor,要指定的話,qdisc的minor必須為0。非根的qdisc的handle的major可以自己設置,minor不用設置,非根的parent的值也是major:minor格式,值是一個已存在的類。 ?
CLASS ? ? 在同一個qdisc里面的類共享這個qdisc的主號碼,每個類都有自己的從號碼,叫做classid,classid只和父qdisc有關,和父class無關,parent值的格式也是major:minor的,major這個指定該類的父節點的handle的major值,父節點可以是class也可以是qdisc,如果是qdisc,則minor可以不用設置或者設置為0,如果是class,則parent的值是其父類的classid值,classid的值格式也是major:minor的,major是父qdisc的handle的major的值,minor值是自己設置。 ?
FILTER ? ? 過濾器的ID有三部分,只有在對過濾器進行散列組織才會用到。 ?
?
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 ?spe‐cific parameters ] ? ? tc ?filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio pri‐ority filtertype [ filtertype specific parameters ] flowid flow-id ? tc ?[ FORMAT ] qdisc show [ dev DEV ] tc ?[ FORMAT ] class show dev DEV tc ?filter show dev DEV ?
?
使用tc命令可以對qdisc、class、filter進行如下操作: add ?在一個節點上添加qdisc、class、filter,添加時,需要傳遞一個parent,傳遞參數時既可以用ID也可以使用設備的根,在建立qdisc和filter時,可以使用handle來命名,在建立class時可以使用classid來命名 ?
remove ?刪除某個handle指定的qdisc,也可刪除根qdisc。被刪除的qdisc上的所有子類以及過濾器都會被自動刪除。 ?
change ?以替代的方式修改某些條目,除了handle和parent不能被修改外,其余語法同add,change命令不能移除一個節點 ?
replace ?添加或者刪除一個節點,是一個原子操作,如果節點不存在,則建立節點。 ?
link ?只適用于qdisc,替代一個存在的節點。 ?
?
實施 主要是建立隊列、分類、過濾器三步。 1 給物理設備建立一個隊列qdisc 2 在相關隊列上建立分類,一般是在該qdisc上建立一個根分類,然后在此根分類上建立子類。 3 為每一個分類建立基于路由的過濾器,并把過濾規則與特定的路由結合。一般只需要針對根分類提供一個過濾器,然后為每個子類提供路由映射。 ?
?
關于各個策略的參數可以man ?tc-cbq ?tc-htb ?tc-sfq ?tc-red tc-tbf ?tc-pfifo ?tc-bfifo tc-pfifo_fast查看。
總結
以上是生活随笔為你收集整理的Traffic Controll的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ch8 电路噪声学习笔记(一)baker
- 下一篇: js数据类型: