小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux 高級(jí)流控

 文檔集成 2016-03-16

在 IBM Bluemix 云平臺(tái)上開發(fā)并部署您的下一個(gè)應(yīng)用。

開始您的試用

Linux 高級(jí)流量控制

本篇主要講用 TC 對(duì) Linux 進(jìn)行高級(jí)流量控制

通過大量實(shí)踐結(jié)合 TC 流控 HOWTO 文檔整理而得

如果你對(duì) Linux 流控感興趣,如果你需要搭建高性能的 Linux 網(wǎng)關(guān) , 本文將會(huì)使你受益頗多。

注:至少具備 Linux OS 的中級(jí)水平知識(shí),熟悉 TCP/IP, Linux 網(wǎng)卡工作原理,以及配置 Linux 網(wǎng)關(guān)的經(jīng)驗(yàn),將有助于對(duì)本文的理解。

本文參考文檔:

Tc 流控 HOWTO 文檔 http://www./HOWTO/html_single/Traffic-Control-HOWTO/

Linux TC 流量控制工具 http://wenku.baidu.com/view/f02078db50e2524de5187e45.html

回頁首

一 . Linux 流控簡(jiǎn)介

Linux 流控的意義 :

有效的控制 Linux 網(wǎng)卡進(jìn)出流量 , 了解網(wǎng)卡工作原理 , 搭建高性能的 Linux 網(wǎng)關(guān) , 對(duì) Linux 高級(jí)系統(tǒng)流控有進(jìn)一步的認(rèn)識(shí)。

Linux 流量控制方法 :

控發(fā)不控收 , 所以只能對(duì)產(chǎn)生瓶頸網(wǎng)卡處的發(fā)包速率進(jìn)行控制 , 而網(wǎng)絡(luò)瓶頸分析亦為 Linux 網(wǎng)絡(luò)流控的第一步 .

Linux 流量控制過程分二種:

  1. 隊(duì)列控制 即 QOS, 瓶頸處的發(fā)送隊(duì)列的規(guī)則控制,常見的有 SFQ PRIO
  2. 流量控制 即帶寬控制 , 隊(duì)列的排隊(duì)整形, 一般為 TBF HTB

    Linux 流量控制算法分二種:

  3. 無類算法 用于樹葉級(jí)無分支的隊(duì)列,例如:SFQ
  4. 分類算法 用于多分支的隊(duì)列,例如:PRIO TBF HTB

Linux 流控實(shí)現(xiàn)工具 TC:

Linux 下流量控制工具 , 從 Linux2.2 版開始已并入內(nèi)核,功能非常強(qiáng)大, 詳見參考文檔。

回頁首

二 . 以下文章將以二種算法的不同流控分別介紹:

1. 無類算法 SFQ

a. 隊(duì)列控制的無類算法 SFQ

SFQ(Stochastic Fairness Queueing 隨機(jī)公平隊(duì)列 ) 是公平隊(duì)列算法家族中的一個(gè)簡(jiǎn)單實(shí)現(xiàn) . 它的精確性不如其它的方法 , 但實(shí)現(xiàn)了高度的公平 , 需要的計(jì)算量亦很少 .

SFQ 算法主要針對(duì)一個(gè) TCP 會(huì)話或者 UDP 流 . 流量被分成相當(dāng)多數(shù)量的 FIFO 隊(duì)列中 , 每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)會(huì)話 . 數(shù)據(jù)按照簡(jiǎn)單輪轉(zhuǎn)的方式發(fā)送 , 每個(gè)會(huì)話都按順序得到發(fā)送機(jī)會(huì) . 這種方式非常公平 , 保證了每一個(gè)會(huì)話都不會(huì)沒其它會(huì)話所淹沒 .

SFQ 之所以被稱為"隨機(jī)", 是因?yàn)樗⒉皇钦娴臑槊恳粋€(gè)會(huì)話創(chuàng)建一個(gè)隊(duì)列 , 而是使用一個(gè)散列算法 , 把所有的會(huì)話映射到有限的幾個(gè)隊(duì)列中去 . 因?yàn)槭褂昧松⒘?, 所以可能多個(gè)會(huì)話分配在同一個(gè)隊(duì)列里 , 從而需要共享發(fā)包的機(jī)會(huì) , 也就是共享帶寬 . 為了不讓這種效應(yīng)太明顯 ,SFQ 會(huì)頻繁地改變散列算法 , 以便把這種效應(yīng)控制在幾秒鐘之內(nèi) ( 時(shí)間由參數(shù)設(shè)定 ).

注 :SFQ 只會(huì)發(fā)生在數(shù)據(jù)發(fā)生擁堵 , 產(chǎn)生等待隊(duì)列的網(wǎng)卡上 .. 出口網(wǎng)卡若無等待隊(duì)列 ,SFQ 亦不起作用 ...

清單 1. 在網(wǎng)卡上建立 SFQ
#tc qdisc add dev eth0 root handle 1: sfq 
 SFQ 參數(shù)有 perturb( 重新調(diào)整算法間隔 ) quantum  基本上不需要手工調(diào)整 : 
 handle 1: 規(guī)定算法編號(hào) .. 可以不用設(shè)置由系統(tǒng)指定 .. 
#tc qdisc sh dev eth0 顯示算法
#tc qd del dev eth0 root 刪除  注 : 默認(rèn) eht0 支持 TOS

SFQ 隊(duì)列一般用在樹葉級(jí) , 配合其它流量整形算法一并使用……

b. 流量控制的無類算法 TBF

令牌桶過濾器 (TBF) 是一個(gè)簡(jiǎn)單的隊(duì)列規(guī)定 : 只允許以不超過事先設(shè)定的速率到來的數(shù)據(jù)包通過 , 但可能允許短暫突發(fā)流量朝過設(shè)定值 .

TBF 很精確 , 對(duì)于網(wǎng)絡(luò)和處理器的影響都很小 , 實(shí)現(xiàn)是針對(duì)數(shù)據(jù)的字節(jié)數(shù)進(jìn)行的 , 而不是針對(duì)數(shù)據(jù)包進(jìn)行 , 常用于網(wǎng)關(guān)限速 .

TBF 的實(shí)現(xiàn)在于一個(gè)緩沖器 ( 桶 ), 不斷地被一些叫做"令牌"的虛擬數(shù)據(jù)以特定速率填充著 . (token rate). 桶最重要的參數(shù)就是它的大小 , 也就是它能夠存儲(chǔ)令牌的數(shù)量 . 每個(gè)到來的令牌從數(shù)據(jù)隊(duì)列中收集一個(gè)數(shù)據(jù)包 , 然后從桶中被刪除 . 這個(gè)算法關(guān)聯(lián)到兩個(gè)流上——令牌流和數(shù)據(jù)流 , 于是我們得到 3 種情景 :

A. 數(shù)據(jù)流以等于令牌流的速率到達(dá) TBF. 這種情況下 , 每個(gè)到來的數(shù)據(jù)包都能對(duì)應(yīng)一個(gè)令牌 , 然后無延遲地通過隊(duì)列 .

B. 數(shù)據(jù)流以小于令牌流的速度到達(dá) TBF. 通過隊(duì)列的數(shù)據(jù)包只消耗了一部分令牌 , 剩下的令牌會(huì)在桶里積累下來 , 直到桶被裝滿 . 剩下的令牌可以在需要以高于令牌流速率發(fā)送數(shù)據(jù)流的時(shí)候消耗掉 , 這種情況下會(huì)發(fā)生突發(fā)傳輸 .

C. 數(shù)據(jù)流以大于令牌流的速率到達(dá) TBF. 這意味著桶里的令牌很快就會(huì)被耗盡 . 導(dǎo)致 TBF 中斷一段時(shí)間 , 稱為"越限". 如果數(shù)據(jù)包持續(xù)到來 , 將發(fā)生丟包 . 此種情況最重要 , 因?yàn)樗梢杂脕韺?duì)數(shù)據(jù)通過過濾器的速率進(jìn)行整形 . 令牌的積累可以導(dǎo)致越限的數(shù)據(jù)進(jìn)行短時(shí)間的突發(fā)傳輸而不必丟包 , 但是持續(xù)越限的話會(huì)導(dǎo)致傳輸延遲直至丟包 .

清單 2. 在網(wǎng)卡建立 TBF
#tc qd add dev eth1 root handle 1: tbf rate 256kbit burst 10000 latency 50ms 
         速率 256kbit  突發(fā)傳輸 10k  最大延遲 50ms 
#tc -s qd sh dev eth1 統(tǒng)計(jì)
#tc qd del dev eth1 root 刪除

rate 限制的傳輸速率 用位來計(jì)算

latency 確定了一個(gè)包在 TBF 中等待傳輸?shù)淖铋L(zhǎng)等待時(shí)間 .

burst 桶的大小 , 以字節(jié)計(jì) . 指定了最多可以有多少個(gè)令牌能夠即刻被使用 .

注 : 管理的帶寬越大 , 需要的緩沖器就越大 . 在 Intel 體系上 ,10 兆 bit/s 的速率需要至少 10k 字節(jié)的緩沖區(qū)

才能達(dá)到期望的速率 . 緩沖區(qū)太小導(dǎo)致潛在的丟包 .

c. 無類算法除這二種隊(duì)列以外 , 另有 pfifo_fast( 網(wǎng)卡出口默認(rèn)根隊(duì)列規(guī)定 )

經(jīng)常使用的也就是 SFQ/TBF ……

這二種用法如下:

單純地降低出口速率 , 使用令牌桶過濾器 . 調(diào)整桶的配置后可用于控制很高的帶寬 .

鏈路已經(jīng)塞滿 , 保證不會(huì)有某一個(gè)會(huì)話獨(dú)占出口帶寬 , 使用隨機(jī)公平隊(duì)列 .

當(dāng)然最要的還是工作中得來的經(jīng)驗(yàn) , 就其應(yīng)用方面只要能滿足需求即可 .. 要做到靈活應(yīng)用還得大量的實(shí)踐 ..

2. 分類算法 —— PRIO/CBQ/HTB

分類算法主要作用是可以對(duì)多種數(shù)據(jù)流區(qū)別對(duì)待 . 一旦數(shù)據(jù)包進(jìn)入一個(gè)分類的隊(duì)列規(guī)定 , 它就得被送到某一個(gè)類中分類 , 對(duì)數(shù)據(jù)包進(jìn)行分類的工具是過濾器 . 過濾器會(huì)返回一個(gè)決定 , 隊(duì)列規(guī)定就根據(jù)這個(gè)決定把數(shù)據(jù)包送入相應(yīng)的類進(jìn)行排隊(duì) . 每個(gè)子類都可以再次使用它們的過濾器進(jìn)行進(jìn)一步的分類 . 直到不需要進(jìn)一步分類時(shí) , 數(shù)據(jù)包才進(jìn)入該類包含的隊(duì)列規(guī)定排隊(duì) . 除了能夠包含其它隊(duì)列規(guī)定之外 , 絕大多數(shù)分類的隊(duì)列規(guī)定能夠流量整形

注 : 過濾器對(duì)數(shù)據(jù)包進(jìn)行分類的工具 , 是從隊(duì)列規(guī)定內(nèi)部調(diào)用的 , 而不是從別處 .( 用在分叉的分支上 )

列規(guī)定家族 : 根 , 句柄 , 兄弟和父輩

每塊網(wǎng)卡都有一個(gè)出口"根隊(duì)列規(guī)定", 缺省情況下是前面提到的 pfifo_fast 隊(duì)列規(guī)定 . 每個(gè)隊(duì)列規(guī)定都指定一個(gè)句柄 , 以便以后的配置語句能夠引用這個(gè)隊(duì)列規(guī)定 . 除了出口隊(duì)列規(guī)定之外 , 每塊網(wǎng)卡還有一個(gè)入口 , 以便 policies 進(jìn)入的數(shù)據(jù)流 .

隊(duì)列規(guī)定的句柄有兩個(gè)部分 : 一個(gè)主號(hào)碼和一個(gè)次號(hào)碼 . 習(xí)慣上把根隊(duì)列規(guī)定稱為"1:", 等價(jià)于"1:0". 隊(duì)列規(guī)定的次號(hào)碼永遠(yuǎn)是 0. 類的主號(hào)碼必須與它們父輩的主號(hào)碼一致 .

數(shù)據(jù)包如何出隊(duì)并交給硬件

當(dāng)內(nèi)核決定把一個(gè)數(shù)據(jù)包發(fā)給網(wǎng)卡的時(shí)候 , 根隊(duì)列規(guī)定 1: 會(huì)得到一個(gè)出隊(duì)請(qǐng)求 , 然后把它傳給 1:1, 然后依次傳給 10:,12: 和 13:( 子類自定義 ), 然后試圖從它們中進(jìn)行 dequeue() 操作 . 也就是說 , 內(nèi)核需要遍歷整顆樹 , 換句話說 , 類及其兄弟僅僅與其"父隊(duì)列規(guī)定"進(jìn)行交談 , 而不會(huì)與網(wǎng)卡進(jìn)行交談 . 只有根隊(duì)列規(guī)定才能由內(nèi)核進(jìn)行出隊(duì)操作 ! 更進(jìn)一步 , 任何類的出隊(duì)操作都不會(huì)比它們的父類更快 . 我們可以把 SFQ 作為一個(gè)子類 , 放到一個(gè)可以進(jìn)行流量整形的父類中 , 從而能夠同時(shí)得到 SFQ 的調(diào)度功能和其父類的流量整形功能 .

a. 隊(duì)列控制的分類算法 PRIO

PRIO 分類優(yōu)先算法 ( 從左至右優(yōu)先發(fā)包 ), 隊(duì)列規(guī)定并不進(jìn)行整形 , 它僅僅根據(jù)你配置的過濾器把流量進(jìn)一步細(xì)分 . 你可以認(rèn)為 PRIO 隊(duì)列規(guī)定是 pfifo_fast 的一種衍生物 , 區(qū)別在每個(gè)頻道都是一個(gè)單獨(dú)的類 , 而非簡(jiǎn)單的 FIFO.

當(dāng)數(shù)據(jù)包進(jìn)入 PRIO 隊(duì)列規(guī)定后 , 將根據(jù)你給定的過濾器設(shè)置選擇一個(gè)類 . 缺省情況下有三個(gè)類 , 這些類僅包含純 FIFO 隊(duì)列規(guī)定而沒有更多的內(nèi)部結(jié)構(gòu) . 你可以把它們替換成你需要的任何隊(duì)列規(guī)定 . 每當(dāng)有一個(gè)數(shù)據(jù)包需要出隊(duì)時(shí) , 首先處理 :1 類 . 只有當(dāng)標(biāo)號(hào)更小的類中沒有需要處理的包時(shí) , 才會(huì)標(biāo)號(hào)大的類 .

PRIO 配置范例示意圖:

大批量數(shù)據(jù)使用 30:, 交互數(shù)據(jù)使用 20: 或 10:.

清單 3. 在網(wǎng)卡建立 PRIO
 #tc qdisc add dev eth0 root handle 1: prio 
  # 此命令立即創(chuàng)建了類 : 1:1, 1:2, 1:3 ( 缺省三個(gè)子類 ) 
  #tc qdisc add dev eth0 parent 1:1 handle 10: sfq 
  #tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000 
    注 : 此為 TBF 限速的另一寫法 , 前文有講解 . 
  #tc qdisc add dev eth0 parent 1:3 handle 30: sfq

主要參數(shù)有 :( 后續(xù)有實(shí)例 )

bands 創(chuàng)建頻道的數(shù)目 . 每個(gè)頻道實(shí)際上就是一個(gè)類 跟 priomap 參數(shù)配合使用

注 : 頻道是類 , 缺省情況下命名為主標(biāo)號(hào) :1 到主標(biāo)號(hào) :3. 如果你的 PRIO 隊(duì)列規(guī)定是 12:, 把數(shù)據(jù)包過濾到

12:1 將得到最高優(yōu)先級(jí) . 0 頻道的次標(biāo)號(hào)是 1!1 頻道的次標(biāo)號(hào)是 2, 以此類推 .

priomap 給 tc 提供過濾器 , 如不提供 PRIO 隊(duì)列規(guī)定將參考 TC_PRIO 的優(yōu)先級(jí)來決定如何給數(shù)據(jù)包入隊(duì) .

b. 流量整形的分類算法 CBQ

CBQ 的工作機(jī)制是確認(rèn)鏈路的閑置時(shí)間足夠長(zhǎng) , 以達(dá)到降低鏈路實(shí)際帶寬的目的 . 為此 , 它要計(jì)算兩個(gè)數(shù)據(jù)包的平均發(fā)送間隔 . 操作期間 , 有效閑置時(shí)間的測(cè)量使用 EWMA(exponential weighted moving average, 指數(shù)加權(quán)移動(dòng)均值 ) 算法 , 也就是說最近處理的數(shù)據(jù)包的權(quán)值比以前的數(shù)據(jù)包按指數(shù)增加 .UNIX 的平均負(fù)載也是這樣算出來的 . 計(jì)算出來的平均時(shí)間值減去 EWMA 測(cè)量值 , 得出的結(jié)果叫做"avgidle". 最佳的鏈路負(fù)載情況下 , 這個(gè)值應(yīng)當(dāng)是 0: 數(shù)據(jù)包嚴(yán)格按照計(jì)算出來的時(shí)間間隔到來 . 在一個(gè)過載的鏈路上 ,avgidle 值應(yīng)當(dāng)是負(fù)的 . 如果這個(gè)負(fù)值太嚴(yán)重 ,CBQ 就會(huì)暫時(shí)禁止發(fā)包 , 稱為"overlimit"( 越限 ). 相反地 , 一個(gè)閑置的鏈路應(yīng)該有很大 avgidle 值 , 這樣閑置幾個(gè)小時(shí)后 , 會(huì)造成鏈路允許非常大的帶寬通過 . 為了避免這種局面 , 我們用 maxidle 來限 avgidle

的值不能太大 .

理論上講 , 如果發(fā)生越限 ,CBQ 就會(huì)禁止發(fā)包一段時(shí)間 ( 長(zhǎng)度就是事先計(jì)算出來的傳輸數(shù)據(jù)包之間的時(shí)間間隔 ), 然后通過一個(gè)數(shù)據(jù)包后再次禁止發(fā)包 .

清單 4. WEB 服務(wù)器的流量控制為 5Mbps,SMTP 流量控制在 3Mbps 上 . 而且二者一共不得超過 6Mbps, 互相之間允許借用帶寬
 #tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8 
  #tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 6Mbit weight  
    0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded 
    這部分按慣例設(shè)置了根為 1:0, 并且綁定了類 1:1. 也就是說整個(gè)帶寬不能超過 6Mbps. 
  #tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 5Mbit weight 
    0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 
  #tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 3Mbit weight 
    0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 
    建立了 2 個(gè)類 . 注意我們?nèi)绾胃鶕?jù)帶寬來調(diào)整 weight 參數(shù)的 . 兩個(gè)類都沒有配置成"bounded", 但它們都連
  接到了類 1:1 上 , 而 1:1 設(shè)置了"bounded". 所以兩個(gè)類的總帶寬不會(huì)超過 6Mbps. 別忘了 , 同一個(gè) CBQ 下面的子
  類的主號(hào)碼都必須與 CBQ 自己的號(hào)碼相一致 ! 
  #tc qdisc add dev eth0 parent 1:3 handle 30: sfq 
  #tc qdisc add dev eth0 parent 1:4 handle 40: sfq 
    缺省情況下 , 兩個(gè)類都有一個(gè) FIFO 隊(duì)列規(guī)定 . 但是我們把它換成 SFQ 隊(duì)列 , 以保證每個(gè)數(shù)據(jù)流都公平對(duì)待 . 
  #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid 
    1:3 
  #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid 
    1:4

CBQ 流量整形算法相對(duì)比較復(fù)雜 , 工作中還常用 ... 示例中的各參數(shù)請(qǐng)參閱 :HOWTO 中文文檔 ..Linux 流量控制 II--- 分類算法 PRIO/CBQ/HTB

c. 流量整形的分類算法 HTB

HTB(Hierarchical Token Bucket) 分層的令牌桶一個(gè)分類的令牌桶過濾器 , 工作原理和相關(guān)配置同于 TBF.. 擁有 TBF 的各項(xiàng)性能 , 可參閱 TBF 的工作細(xì)節(jié) ...

清單 5. 環(huán)境與要求同上述 CBQ 的例子
#tc qdisc add dev eth0 root handle 1: htb default 30 
  #tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k 
  #tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k 
  #tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k 
  #tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k 
  #tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10 
  #tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10 
  #tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10 
  # 添加過濾器 , 直接把流量導(dǎo)向相應(yīng)的類 : 
  #U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
  #$U32 match ip dport 80 0xffff flowid 1:10 
  #$U32 match ip sport 25 0xffff flowid 1:20

回頁首

三 . Linux 流量控制之 U32 過濾規(guī)則

過濾器是對(duì)數(shù)據(jù)包進(jìn)行分類工具 , 過濾器用與把數(shù)據(jù)包分類并放入相應(yīng)的子隊(duì)列 , 這些過濾器在分類的隊(duì)列規(guī)定內(nèi)部被調(diào)用 . 為了決定用哪個(gè)類處理數(shù)據(jù)包 , 必須調(diào)用所謂的"分類器鏈" 進(jìn)行選擇 . 這個(gè)鏈中包含了這個(gè)分類隊(duì)列規(guī)定所需的所有過濾器 . 常用到的為 U32 過濾器

分類的一示例圖:

當(dāng)一個(gè)數(shù)據(jù)包入隊(duì)的時(shí)候 , 每一個(gè)分支處都會(huì)咨詢過濾器鏈如何進(jìn)行下一步 . 典型的配置是在 1:1 處有一個(gè)過濾器把數(shù)據(jù)包交給 12:, 然后 12: 處的過濾器在把包交給 12:2. 你可以把后一個(gè)過濾器同時(shí)放在 1:1 處 , 而得到效率的提高 .

另外 , 你不能用過濾器把數(shù)據(jù)包向"上"送 . 而且 , 使用 HTB 的時(shí)候應(yīng)該把所有的規(guī)則放到根上 ..

注 : 數(shù)據(jù)包只能向"下"進(jìn)行入隊(duì)操作 ! 只有處隊(duì)的時(shí)候才會(huì)上到網(wǎng)卡所在的位置來 . 他們不會(huì)落到樹的最

底層后送到網(wǎng)卡 ...

清單 6. 過濾器過濾示例
 #tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip dport 22 0xffff flowid 10:1 
    在 10: 節(jié)點(diǎn)添加一個(gè)過濾規(guī)則 , 優(yōu)先權(quán) 1: 凡是去往 22 口 ( 精確匹配 ) 的 IP 數(shù)據(jù)包 , 發(fā)送到頻道 10:1.. 
  #tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip sport 80 0xffff flowid 10:1 
    在 10: 節(jié)點(diǎn)添加一個(gè)過濾規(guī)則 , 優(yōu)先權(quán) 1: 凡是來自 80 口 ( 精確匹配 ) 的 IP 數(shù)據(jù)包 , 發(fā)送到頻道 10:1.. 
  #tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2 
    在 eth0 上的 10: 節(jié)點(diǎn)添加一個(gè)過濾規(guī)則 , 它的優(yōu)先權(quán)是 2: 凡是上二句未匹配的 IP 數(shù)據(jù)包 , 發(fā)送到頻道 10:2.. 
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1 
    去往 4.3.2.1 的包發(fā)送到頻道 10:1 其它參數(shù)同上例
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1 
    來自 1.2.3.4 的包發(fā)到頻道 10:1 
  #tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2 
    凡上二句未匹配的包送往 10:2 
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match 
ip sport 80 0xffff flowid 10:1 
    可連續(xù)使用 match, 匹配來自 1.2.3.4 的 80 口的數(shù)據(jù)包

常用到的過濾命令一覽

 #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 -------

根據(jù)源 / 目的地址

源地址段 'match ip src 1.2.3.0/24'

目的地址段 'match ip dst 4.3.2.0/24'

單個(gè) IP 地址 'match ip 1.2.3.4/32'

根據(jù)源 / 目的端口 , 所有 IP 協(xié)議

源 'match ip sport 80 0xffff' 0xffff 表所有數(shù)據(jù)包

目的 'match ip dport 80 0xffff'

根據(jù) IP 協(xié)議 (tcp, udp, icmp, gre, ipsec)

icmp 是 1:'match ip protocol 1 0xff' 1 是根據(jù) /etc/protocols 協(xié)議號(hào)來定

根據(jù) fwmark

#iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6 
      #tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1

注 :handle 根據(jù)過濾器的不同 , 含義也不同

按 TOS 字段

#tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff

flowid 1:4 選擇交互和最小延遲的數(shù)據(jù)流 匹配大量傳輸 , 使用"0x08 0xff".

#tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 match u32 00100000 00ff0000

at 0 flowid 1:10 匹配那些 TOS 字段帶有'最小延遲'屬性的數(shù)據(jù)包

回頁首

四 . Linux 流量控制 --- 實(shí)例解析

以下實(shí)例由實(shí)際工作環(huán)境要求編寫而得:

1. PRIO 分類優(yōu)先算法 ( 從左至右優(yōu)先發(fā)包 )

網(wǎng)卡工作示例圖:
清單 7. PRIO 分類優(yōu)先算法示例 ( 從左至右優(yōu)先發(fā)包 )
 #tc ad add dev eth0 root handle 1: prio hands 3 priomap 1---1 16 個(gè) 1(tos 比特 ) 表示所有數(shù)據(jù)包
    注 : 此命令自動(dòng)在 1: 下創(chuàng)建三子類 1:1 1:2 1:3 此例中只用到 1:1 
  #tc qd add dev eth0 parent 1:1 handle 11:sfq 
  #tc qdisc add dev eth0 parent 1:1 handle 12: tbf rate 20kbit 
  buffer 1600 limit 3000 
  #tc qd add dev eth0 parent 1:1 handle 13:sfq 
  #tc filter add dev eth0 parent 1:1 prio 1003 protocol ip 
      u32 match ip src 192.168.1.0/24 flowid 1:13 
  #tc filter add dev eth0 parent 1:1 prio 1001 protocol ip 
       u32 match ip src 10.0.0.0/8 flowid 1:12 
  #tc filter add dev eth0 parent 1:1 protocol ip prio 1001 
   u32 match ip tos 0x10 0xff flowid 1:11  交互和最小延遲的數(shù)據(jù)流

2. HTB 分層令牌桶

網(wǎng)卡工作示例圖:
清單 8. HTB 分層令牌桶示例
 #tc qd del dev eth1 root 
  #tc qdisc add dev eth1 root handle 1: htb default 12 
  #tc class add dev eth1 parent 1: classid 1:1 htb rate 2Mbit burst 1500000 在 1: 下定義子類 1:1 
  #tc class add dev eth1 parent 1:1 classid 1:11 htb rate 512kbit burst 150000 ceil 1Mbit 
  #tc qd add dev eth1 parent 1:11 handle 111: sfq 
  #tc class add dev eth1 parent 1:1 classid 1:12 htb rate 1Mbit burst 150000 ceil 1Mbit 
  #tc qd add dev eth1 parent 1:12 handle 122: sfq 注 : 亦可不在 1:12 class 下定義 122: qd 
  #tc class add dev eth1 parent 1:1 classid 1:13 htb rate 2Mbit burst 150000 ceil 2Mbit 
  #tc qd add dev eth1 parent 1:13 handle 133: sfq 
  #tc filter add dev eth1 parent 1: prio 10001 protocol ip 
      u32 match ip src 192.168.1.0/24 flowid 1:12  其它二類亦如此 ..

3. ADSL 上網(wǎng)流量限控腳本

ADSL 帶寬是下行 3200Kbit, 上行只有 320Kbit

網(wǎng)卡工作示例圖:
清單 9. 上網(wǎng)流量限控腳本示例
 tc qdisc add dev eth0 root handle 1: htb default 24 
  tc class add dev eth0 parent 1: classid 1:1 htb rate 300kbit ceil 300kbit prio 0 
  tc class add dev eth0 parent 1: classid 1:2 htb rate 150kbit prio 3 
  tc class add dev eth0 parent 1:1 classid 1:11 htb rate 300kbit ceil 300kbit prio 1 
  tc class add dev eth0 parent 1:1 classid 1:12 htb rate 150kbit ceil 250kbit prio 2  
  tc class add dev eth0 parent 1:2 classid 1:21 htb rate 100kbit ceil 150kbit prio 4 
  tc class add dev eth0 parent 1:2 classid 1:22 htb rate 30kbit ceil 140kbit prio 5 
  tc class add dev eth0 parent 1:2 classid 1:23 htb rate 15kbit ceil 130kbit prio 6 
  tc class add dev eth0 parent 1:2 classid 1:24 htb rate 5kbit ceil 50kbit prio 7 
  tc qdisc add dev eth0 parent 1:11 handle 111: sfq perturb 5 
  tc qdisc add dev eth0 parent 1:12 handle 112: sfq perturb 5 
  tc qdisc add dev eth0 parent 1:21 handle 121: sfq perturb 10 
  tc qdisc add dev eth0 parent 1:22 handle 122: sfq perturb 10 
  tc qdisc add dev eth0 parent 1:23 handle 133: sfq perturb 10 
  tc qdisc add dev eth0 parent 1:24 handle 124: sfq perturb 10 
  tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11 
  tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12 
  tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21 
  tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22 
  tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23 
  tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24

1:11 最高優(yōu)先級(jí)的數(shù)據(jù)包通道優(yōu)先通過 , 主要為一些 ACK SYN 確認(rèn)包 .. 必要時(shí)全部占用 .. 全速

1:12 是很重要的數(shù)據(jù)道 , 給多點(diǎn) , 最少給一半 , 但需要時(shí)可以再多一點(diǎn) .

rate 規(guī)劃 1:2 = 1:21 + 1:22 + 1:23 + 1:24 一般總數(shù)在 50%-80% 左右

1:21 http,pop 最常用 , 人數(shù)較多 , 易導(dǎo)致堵塞 , 不能給得太多 , 但不益太少 .

1:22 smtp 通道 , 優(yōu)先低于 1:21 以防發(fā)大的附件大量占用帶寬

1:23 ftp-data 數(shù)據(jù)通道可能大量上傳文件 ,rate 不能給得太多 ,ceil 設(shè)置大些 ( 其它通道剩余帶寬應(yīng)用 )

1:24 無所謂通道 , 就是一般不是平時(shí)工作上需要的通道了 , 給小點(diǎn) , 防止這些人在妨礙有正常工作需要的人

其次的工作即在 iptables 端對(duì)相應(yīng)數(shù)據(jù)包打上標(biāo)記 ...

4. Linux+NAT+TC

腳本是 Linux NAT 網(wǎng)關(guān)實(shí)例 , 根據(jù)此腳本思路 , 可進(jìn)一步細(xì)致的進(jìn)行針對(duì)于數(shù)據(jù)包的限制 ..

清單 10. Linux Nat 網(wǎng)關(guān)實(shí)例
 echo 1 > /proc/sys/net/ipv4/ip_forward 
  iptables -F 
  iptables -t nat -F 
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT 
   --to-source 124.42.97.36 
  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT 
  --to-source 124.42.97.36 
  iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -j MARK 
   --set-mark 1 
  iptables -I PREROUTING -t mangle -p tcp -s 192.168.1.0/24 -j MARK 
  --set-mark 2 
    注 : 可分?jǐn)?shù)據(jù)包類型標(biāo)記
  tc qdisc del dev eth0 root 
    # 加一個(gè)根隊(duì)列 , 速率用網(wǎng)卡的速率 10Mbit,也可用上傳的速率
  tc qdisc add dev eth0 root handle 100: cbq bandwidth 10Mbit avpkt 1000 
    # 加一個(gè)根類
  tc class add dev eth0 parent 100:0 classid 100:1 cbq bandwidth 10Mbit 
                   rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 
                   8 avpkt 1000 bounded 
    # 加一個(gè)子類用于內(nèi)網(wǎng) 1 速率限制為 300Kbit 
  tc class add dev eth0 parent 100:1 classid 100:2 cbq bandwidth 10Mbit 
                   rate 300Kbit allot 1513 weight 30Kbit prio 5 maxburst 
                   8 avpkt 1000 bounded 
    # 加一個(gè)子類用于內(nèi)網(wǎng) 2 速率限制為 320Kbit 
  tc class add dev eth0 parent 100:1 classid 100:3 cbq bandwidth 10Mbit 
                   rate 320Kbit allot 1513 weight 32Kbit prio 6 maxburst 
                   8 avpkt 1000 bounded 
    # 設(shè)置隊(duì)列規(guī)則
  tc qdisc add dev eth0 parent 100:2 sfq quantum 1514b perturb 15 
  tc qdisc add dev eth0 parent 100:3 sfq quantum 1514b perturb 15 
    # 將隊(duì)列和 fw 過濾器映射起來 其中 hand 1 的 1 是開始用 iptables 做的標(biāo)記 hand 2 的 2 也是開始用
  iptables 做的標(biāo)記
  tc filter add dev eth0 parent 100:0 protocol ip prio 1 handle 
  1 fw classid 100:2 
  tc filter add dev eth0 parent 100:0 protocol ip prio 2 handle 
  2 fw classid 100:3 
  流量監(jiān)測(cè)相關(guān)命令 : 
     tc -s qdisc/class ls dev eth0 
     tc -s qdisc/class ls dev eth1

5. Linux 網(wǎng)關(guān) / 服務(wù)器限速 ---HTB

清單 11. Linux 網(wǎng)關(guān) / 服務(wù)器 HTB 限速
	#!/bin/sh 
    PWD=/home/huaying/net 
    TC=/sbin/tc 
    $TC class ls dev eth0 
    $TC qdisc del dev eth0 root 
    $TC qdisc add dev eth0 root handle 1: htb r2q 1 
    U32="$TC filter add dev eth0 parent 1: protocol ip prio 16 u32" 
    while read line 
    do 
     ip=`echo $line | awk '{print $1}'` 
     limit=`echo $line | awk '{print $2}'` 
     $TC class add dev eth0 parent 1: classid 1:$ip htb rate 
     "$limit"kbit burst 1k 
     $U32  match ip dst 192.168.1.$ip/32 flowid 1:$ip 
    done < $PWD/ip_limit 
      注 :ip_limit 分行記錄 , 第一列為 ip, 第二列為限制的帶寬 , 二列以 tables 分開 ..   
  服務(wù)器限速
    #!/bin/sh 
    /sbin/tc qdisc del dev eth0 root 
    /sbin/tc qdisc add dev eth0 root handle 1:0 htb r2q 1 
    /sbin/tc class add dev eth0 parent 1:0 classid 1:1 htb rate 
    75mbit burst 10k 
    /sbin/tc filter add dev eth0 parent 1: protocol ip prio 16 
     u32  match ip dst 0.0.0.0/0 flowid 1:1 
    /sbin/tc class ls dev eth0 
      最大限制服務(wù)器 eth0 流量在 75Mbit/s

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多