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