linux 下使用 tc 模拟网络延迟和丢包
1?模擬延遲傳輸簡介
netem 與 tc: netem 是 Linux 2.6 及以上內核版本提供的一個網絡模擬功能模塊。該功能模塊可以用來在性能良好的局域網中,模擬出復雜的互聯網傳輸性能,諸如低帶寬、傳輸延遲、丟包等等情況。使用 Linux 2.6 (或以上) 版本內核的很多發(fā)行版 Linux 都開啟了該內核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系統中的一個工具,全名為 traffic control(流量控制)。tc 可以用來控制 netem 的工作模式,也就是說,如果想使用 netem ,需要至少兩個條件,一個是內核中的 netem 功能被包含,另一個是要有 tc 。
需要注意的是:本文介紹的流控只能控制發(fā)包動作,不能控制收包動作,同時,它直接對物理接口生效,如果控制了物理的 eth0,那么邏輯網卡(比如 eth0:1)也會受到影響,反之,如果您在邏輯網卡上做控制,該控制可能是無效的。(注:虛擬機中的多個網卡可以在虛擬機中視為多個物理網卡)。
# tc qdisc add dev eth0 root netem delay 100ms
該命令將?eth0?網卡的傳輸設置為延遲?100?毫秒發(fā)送。易寶支付有限公司
更真實的情況下,延遲值不會這么精確,會有一定的波動,我們可以用下面的情況來模擬出
帶有波動性的延遲值:
# tc qdisc add dev eth0 root netem delay 100ms 10ms
該命令將?eth0?網卡的傳輸設置為延遲?100ms ± 10ms?(90 ~ 110 ms?之間的任意值)發(fā)送。
還可以更進一步加強這種波動的隨機性:# tc qdisc add dev eth0 root netem delay 100ms 10ms 30%
該命令將?eth0?網卡的傳輸設置為?100ms?,同時,大約有?30%?的包會延遲?± 10ms?發(fā)送。示例:現在?ping?一下?216?機器:
易寶支付有限公司
可以看出數據明顯的波動性。3?模擬網絡丟包:
# tc qdisc add dev eth0 root netem loss 1%
該命令將?eth0?網卡的傳輸設置為隨機丟掉?1%?的數據包。示例:在?216?上執(zhí)行
#tc qdisc add dev eth0 root netem loss 10%
顯示?16?個包只有?13?個收到了。也可以設置丟包的成功率:
# tc qdisc add dev eth0 root netem loss 1% 30%
該命令將?eth0?網卡的傳輸設置為隨機丟掉?1%?的數據包,成功率為?30%?。
4.刪除網卡上面的相關配置:將之前命令中的?add?改為?del?即可刪除配置:
# tc qdisc del dev eth0 XXXXXXXXXXX(自己加的配置)該命令將 刪除?eth0?網卡的相關傳輸配置
至此,我們已經可以通過?TC?在測試環(huán)境中模擬一定的網絡延時和丟包的情況。下面是關于tc?更多的應用和介紹
5?模擬包重復:
# tc qdisc add dev eth0 root netem duplicate 1%
該命令將?eth0?網卡的傳輸設置為隨機產生?1%?的重復數據包 。6?模擬數據包損壞:
# tc qdisc add dev eth0 root netem corrupt 0.2%
該命令將?eth0?網卡的傳輸設置為隨機產生?0.2%?的損壞的數據包 。?(內核版本需在?2.6.16?以上)
7?模擬數據包亂序:
# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
該命令將?eth0?網卡的傳輸設置為:有?25%?的數據包(50%相關)會被立即發(fā)送,其他的延遲10?秒。
新版本中,如下命令也會在一定程度上打亂發(fā)包的次序:# tc qdisc add dev eth0 root netem delay 100ms 10ms
8?查看已經配置的網絡條件:# tc qdisc show dev eth0
該命令將?查看并顯示?eth0?網卡的相關傳輸配置9?附錄:TC?流量控制
TC?是一個流量控制的工具,下面轉了一篇關于?TC?流量控制的文章。TC?介紹
在?linux?中,TC?有二種控制方法?CBQ?和?HTB.HTB?是設計用來替換?CBQ?的。它是一個層次式的過濾框架.
TC?包括三個基本的構成塊:
隊列規(guī)定?qdisc(queueing discipline?)、類(class)和分類器(Classifiers)
TC?中的隊列(queueing discipline):
用來實現控制網絡的收發(fā)速度.通過隊列,linux?可以將網絡數據包緩存起來,然后根據用戶的
設置,在盡量不中斷連接(如?TCP)的前提下來平滑網絡流量.需要注意的是,linux?對接收隊列的控制不夠好,所以我們一般只用發(fā)送隊列,即“控發(fā)不控收”.它封裝了其他兩個主要?TC?組件(類和分類器)。內核如果需要通過某個網絡接口發(fā)送數據包,它都需要按照為這個接口配置的?qdisc(排隊規(guī)則)把數據包加入隊列。然后,內核會?盡可能多地從?qdisc?里面取出數據包,把它們交給網絡適配器驅動模塊。
最簡單的?QDisc?是?pfifo?它不對進入的數據包做任何的處理,數據包采用先入先出的方式通過隊列。不過,它會保存網絡接口一時無法處理的數據包。
隊列規(guī)則包括?FIFO(先進先出),RED(隨機早期探測),SFQ(隨機公平隊列)和令牌桶(Token Bucket),類基隊列(CBQ),CBQ?是一種超級隊列,即它能夠包含其它隊列(甚至其它?CBQ)。
TC?中的?Class?類
class?用來表示控制策略.很顯然,很多時候,我們很可能要對不同的?IP?實行不同的流量控制策略,這時候我們就得用不同的?class?來表示不同的控制策略了.
TC?中的?Filter?規(guī)則
filter?用來將用戶劃入到具體的控制策略中(即不同的?class?中).比如,現在,我們想對?xxa,xxb兩個?IP?實行不同的控制策略(A,B),這時,我們可用?filter?將?xxa?劃入到控制策略?A,將?xxb?劃入到控制策略?B,filter?劃分的標志位可用?u32?打標功能或?IPtables的?set-mark (大多使用iptables?來做標記)功能來實現。
目前,TC?可以使用的過濾器有:fwmark?分類器,u32?分類器,基于路由的分類器和?RSVP分類器(分別用于?IPV6、IPV4)等;其中,fwmark分類器允許我們使用?Linux netfilter?代碼選擇流量,而?u32?分類器允許我們選擇基于?ANY?頭的流量?.需要注意的是,filter (過濾器)是在?QDisc?內部,它們不能作為主體。
TC?的應用流程
數據包->iptables(在通過?iptables?時,iptables?根據不同的?ip?來設置不同的?mark)->TC(class)-
>TC(queue)
應用
假設?eth0?位是服務器的外網網絡接口。開始之前,先要清除?eth0?所有隊列規(guī)則
tc qdisc del dev eth0 root?2> /dev/null?> /dev/null1)?定義最頂層(根)隊列規(guī)則,并指定?default?類別編號
tc qdisc add dev eth0 root handle?1:?htb default?2易寶支付有限公司
2)?定義第一層的?1:1?類別?(速度)本來是要多定義第二層葉類別,但目前來看,這個應用中就可以了.
tc?class?add?dev?eth0?parent?1:1?classid?1:2?htb?rate?98mbit?ceil 100mbit?prio?2?tc?class?add?dev?eth0?parent?1:1?classid?1:3?htb rate?1mbit?ceil?2mbit?prio?2注:以上就是我們控制輸出服務器的速度,一個為?98M,一個為?2M.
rate:?是一個類保證得到的帶寬值.如果有不只一個類,請保證所有子類總和是小于或等于父類.prio:用來指示借用帶寬時的競爭力,prio?越小,優(yōu)先級越高,競爭力越強.
ceil: ceil?是一個類最大能得到的帶寬值.
同時為了不使一個會話永占帶寬,添加隨即公平隊列?sfq.
tc qdisc add dev eth0 parent?1:2?handle?2:?sfq perturb?10?tc qdisc
3)?設定過濾器
過濾器可以使用本身的?u32?也可以使用?iptables?來打上標記
指定在?root?類?1:0?中,對?192..168.0.2?的過濾,使用?1:2?的規(guī)則,來給他?98M?的速度,寫法就如下
如果是所有?ip?寫法就如
tc filter add dev eth0 protocol ip parent?1:?prio?50?u32 match ip
dst 0.0.0.0/0?flowid?1:10使用?Iptables?來配合過濾器
還可以使用這個方法,但需要借助下面的?iptables?的命令來做標記了
tc?filter?add?dev?eth0?parent?1:?protocol?ip?prio?1?handle?2?fw flowid?1:2?tc?filter?add?dev?eth0?parent?1:?protocol?ip?prio?1handle?2?fw?flowid?1:3iptables?只要打上記號就行了
iptables?-t?mangle?-A?POSTROUTING?-d?192.168.0.2?-j?MARK?--set-mark?10?iptables?-t?mangle?-A?POSTROUTING?-d?192.168.0.3?-j?MARK--set-mark?20TC?對最對高速度的控制
Rate ceiling?速率限度
參數?ceil?指定了一個類可以用的最大帶寬,?用來限制類可以借用多少帶寬.缺省的?ceil?是和速率一樣
這個特性對于?ISP?是很有用的,?因為他們一般限制被服務的用戶的總量即使其他用戶沒有請求服務.(ISPS?很想用戶付更多的錢得到更好的服務) ,注根類是不允許被借用的,?所以沒有指定?ceil
易寶支付有限公司
注: ceil?的數值應該至少和它所在的類的速率一樣高,?也就是說?ceil?應該至少和它的任何一個子類一樣高
Burst?突發(fā)
網絡硬件只能在一個時間發(fā)送一個包這僅僅取決于一個硬件的速率.?鏈路共享軟件可以利用這個能力動態(tài)產生多個連接運行在不同的速度.?所以速率和?ceil?不是一個即時度量只是一個在一個時間里發(fā)送包的平均值.?實際的情況是怎樣使一個流量很小的類在某個時間類以最大的速率提供給其他類. burst?和?cburst?參數控制多少數據可以以硬件最大的速度不費力的發(fā)送給需要的其他類.
如果?cburst?小于一個理論上的數據包他形成的突發(fā)不會超過?ceil?速率,?同樣的方法?TBF?的最高速率也是這樣.
你可能會問,?為什么需要?bursts .?因為它可以很容易的提高向應速度在一個很擁擠的鏈路上.比如?WWW?流量是突發(fā)的.?你訪問主頁.突發(fā)的獲得并閱讀.?在空閑的時間?burst?將再"charge"一次.
注: burst?和?cburst?至少要和其子類的值一樣大.
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 specificparameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priorityfiltertype [ filtertype specific parameters ] flowid flow-id
顯示
tc [-s | -d ] qdisc show [ dev DEV ]
tc [-s | -d ] class show dev DEV tc filter show dev DEV
查看?TC?的狀態(tài)
tc -s -d qdisc show dev eth0tc -s -d class show dev eth0
刪除tc規(guī)則
tc qdisc del dev eth0 root
實例
使用?TC?下載限制單個?IP?進行速度控制
就可以限制?192.168.1.2?的下載速度為?30Mbit?最高可以?60Mbit ,其中?r2q,是指沒有?default?的root,使整個網絡的帶寬沒有限制
使用?TC?對整段?IP?進行速度控制
tc qdisc add dev eth0 root handle?1:?htb r2q?1?tc class add dev
易寶支付有限公司
eth0?parent?1:?classid?1:1?htb?rate?50mbit?ceil?1000mbit?tc?filter add?dev?eth0?parent?1:?protocol?ip?prio?16?u32?match?ip?dst 192.168.111.0/24?flowid?1:1就可以限制?192.168.111.0?到?255?的帶寬為?3000k?了,實際下載速度為?200k?左右。這種情況下,這個網段所有機器共享這?200k?的帶寬。
還可以加入一個?sfq(隨機公平隊列)
sfq,他可以防止一個段內的一個?ip?占用整個帶寬。使用?TC?控制服務器對外的速度為?10M
如下,我要管理一臺服務器,只能向外發(fā)?10M?的數據
tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle?1:htb tc class add dev eth0 parent?1:?classid?1:1?htb rate 100mbitceil 100mbit tc class add dev eth0 parent?1:1?classid?1:10?htbrate 10mbit ceil 10mbit tc qdisc add dev eth0 parent?1:10?sfqperturb?10?tc filter add dev eth0 protocol ip parent?1:?prio?2u32 match ip dst?220.181.xxx.xx/32flowid?1:1?#?上面這臺,讓220.181.xxx.xx/32?這臺跑默認的,主要是為了讓這個?ip?連接進來不被控制?tcfilter add dev eth0 protocol ip parent?1:?prio?50?u32 match ip dst0.0.0.0/0?flowid?1:10?#?默認讓所有的流量都從這個通過
? ? ? 本文轉自灬落魄灬 ?51CTO博客,原文鏈接:http://blog.51cto.com/smoke520/1844034,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的linux 下使用 tc 模拟网络延迟和丢包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于活动目录中DNS没有SRV记录的解决
- 下一篇: Linux下C如何调用PCI Lib函