linux 下使用 tc 模擬網絡延遲和丟包

linux 下使用 tc 模擬網絡延遲和丟包


模擬延遲傳輸簡介

netem 與 tc: netem 是 Linux 2.6 及以上內核版本提供的一個網絡模擬功能模塊。該功能模塊可以用來在性能良好的局域網中,模擬出複雜的互聯網傳輸性能,諸如低帶寬、傳輸延遲、丟包等等情況。使用 linux 2.6 (或以上) 版本內核的很多發行版 Linux 都開啓了該內核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系統中的一個工具,全名爲 traffic control(流量控制)。tc 可以用來控制 netem 的工作模式,也就是說,如果想使用 netem ,需要至少兩個條件,一個是內核中的 netem 功能被包含,另一個是要有 tc 。

需要注意的是:本文介紹的流控只能控制發包動作,不能控制收包動作,同時,它直接對物理接口生效,如果控制了物理的 eth0,那麼邏輯網卡(比如 eth0:1)也會受到影響,反之,如果您在邏輯網卡上做控制,該控制可能是無效的。(注:虛擬機中的多個網卡可以在虛擬機中視爲多個物理網卡)。


# tc qdisc add dev eth0 root netem delay 100ms

該命令將 eth0 網卡的傳輸設置爲延遲 100 毫秒發送。易寶支付有限公司


更真實的情況下,延遲值不會這麼精確,會有一定的波動,我們可以用下面的情況來模擬出

帶有波動性的延遲值:

# tc qdisc add dev eth0 root netem delay 100ms 10ms

該命令將 eth0 網卡的傳輸設置爲延遲 100ms ± 10ms (90 ~ 110 ms 之間的任意值)發送。

還可以更進一步加強這種波動的隨機性:

# tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

該命令將 eth0 網卡的傳輸設置爲 100ms ,同時,大約有 30% 的包會延遲 ± 10ms 發送。示例:現在 ping 一下 216 機器:

易寶支付有限公司

可以看出數據明顯的波動性。

模擬網絡丟包:
# tc qdisc add dev eth0 root netem loss 1%

該命令將 eth0 網卡的傳輸設置爲隨機丟掉 1% 的數據包。示例:在 216 上執行

#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 測試環境中模擬一定的網絡延時和丟包的情況。下面是關tc 更多的用和介紹

模擬包重複:
# tc qdisc add dev eth0 root netem duplicate 1%

該命令將 eth0 網卡的傳輸設置爲隨機生 1% 複數據包 。模擬數據包損壞:

# tc qdisc add dev eth0 root netem corrupt 0.2%

該命令將 eth0 網卡的傳輸設置爲隨機生 0.2% 損壞的數據包 。 (內核版本需在 2.6.16 以上)

模擬數據包亂序:
# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

該命令將 eth0 網卡的傳輸設置爲:有 25% 的數據包(50%相關)會被即發送,其他的延遲10 秒。

新版本中,如下命令也會在一定程度打亂發包的次:# tc qdisc add dev eth0 root netem delay 100ms 10ms

查看已經配置的網絡條件:# tc qdisc show dev eth0

該命令將 顯示 eth0 網卡的相關傳輸配置附錄:TC 流量控制

TC 是一個流量控制的工具,下面了一於 TC 流量控制的文TC 介紹


在 linux 中,TC 種控制方法 CBQ 和 HTB.HTB 是設用來替換 CBQ 的。它是一個次式的過濾框架.

TC 括三本的成塊:

隊列規定 qdisc(queueing discipline )、(class)和分類器(Classifiers)

TC 中的隊列(queueing discipline):
用來實現控制網絡的收發速度.過隊列,linux 可以將網絡數據包緩存起,然後根據用

設置,量不中斷連(如 TCP)的前提下來平網絡流量.需要注意的是,linux 對接收隊列的控制不好,以我們一只用發送隊列,即控發不控收.封裝其他兩個要 TC 件(分類器)。內核如果需要通過某個網絡接口發送數據包,它都需要按照爲這個接口配置的 qdisc(排隊規則)數據包加入隊列然後,內核會 可能多地從 qdisc 出數據包,它們交給網絡配器動模塊。

最簡單的 QDisc 是 pfifo 它不對進的數據包做任理,數據包先入先出的式通過隊列。不,它會保存網絡接口一時無法處理的數據包。
隊列規則括 FIFO(出),RED(隨機早期探測),SFQ(隨機公平隊列)和令牌桶(Token Bucket),類基隊列(CBQ),CBQ 是一種超級隊列,即它能包含隊列(它 CBQ)。

TC 中的 Class 
class 用來示控制策略.很顯,很多時,我們很可能要對不同的 IP 實行不同的流量控制策略,這時我們就用不同的 class 示不同的控制策略.

TC 中的 Filter 規則
filter 用來將用戶劃入到具的控制策略(即不同的 class ).比如,現在,我們想對 xxa,xxb兩個 IP 實行不同的控制策略(A,B),這時,我們可用 filter 將 xxa 劃入到控制策略 A,將 xxb 劃入到控制策略 B,filter 劃分標誌位可用 u32 打標功能或 IPtables的 set-mark (大多使用iptables 來做標記)功能來實現。
前,TC 可以使用的過濾器有:fwmark 分類器,u32 分類器,基於路由分類器和 RSVP分類器(分別於 IPV6IPV4)等;其中,fwmark分類允許我們使用 Linux netfilter 代碼選擇流量,而 u32 分類允許我們選擇基於 ANY 的流量 .需要注意的是,filter (過濾)是在 QDisc 內部,它們不能作爲主體

TC 用流
數據包->iptables(在通過 iptables 時,iptables 據不同的 ip 來設置不同的 mark)->TC(class)-

>TC(queue)

設 eth0 服務器的網網絡接口。開之前,除 eth0 隊列規則

tc qdisc del dev eth0 root 2> /dev/null > /dev/null1) 義最頂層()隊列規則,並指定 default 類別編號

tc qdisc add dev eth0 root handle 1htb 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 越小,優先級越高,競爭力越.
ceil: ceil 
是一個類最大能到的帶寬值.

同時爲了不使一個會話永佔帶寬,加隨即公平隊列 sfq.
tc qdisc add dev eth0 parent 1:handle 2sfq perturb 10 tc qdisc

add dev eth0 parent 1:3 handle 3: sfq perturb 10

3) 設定過濾
過濾器可以使用本的 u32 也可以使用 iptables 標記
定在 root 類 1:0 中,對 192..168.0.2 過濾,使用 1:2 規則,來給他 98M 速度,寫法就如下

tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src
192.168.0.2 flowid 1:2 tc filter add dev eth0 protocol ip parent
1:0 u32 match ip src 192.168.0.1 flowid 1:3

如果是有 ip 寫法就如
tc filter add dev eth0 protocol ip parent 1prio 50 u32 match ip

dst 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 1
handle 2 fw flowid 1:3

iptables 只要記號就行了

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 20

TC 高速度的控制
Rate ceiling 率限
數 ceil 定了一個可以用的大帶寬用來限制可以用多少帶寬.缺省的 ceil 是和率一
這個性對於 ISP 是很有用的們一限制被服務的用量即使其他戶沒請求服務.(ISPS 很想用付更多的錢得到更好的服務) ,根類是不允許用的定 ceil

易寶支付有限公司

: ceil 的數值該至少和它在的率一樣高也就是說 ceil 該至少和它的任一個子類樣高

Burst 
網絡
件只能在一個時間發送一個包這僅僅取決於一個件的鏈路共享軟件可以用這個能態產生多個接運行在不同的速度率和 ceil 不是一個即時量只是一個在一個時間發送包的平均值的情況是怎樣使一個流量很個時間大的率提供給其他類. burst 和 cburst 數控制多少數據可以以大的速度費力的發送需要的其他類.
如果 cburst 小於一個理上的數據包他形成的發不會超過 ceil 方法 TBF 最高速率也是這.
可能會麼需要 bursts . 爲它可以很易的提高嚮應速度在一個很擁擠鏈路.比如 WWW 流量是發的你訪問主頁.發的獲得並閱讀空閒的時間 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 狀態
tc -s -d qdisc show dev eth0tc -s -d class show dev eth0

刪除tc規則
tc qdisc del dev eth0 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 30mbit ceil 60mbit tc  filter
add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst
192.168.1.2  flowid 1:1

就可以限制 192.168.1.2 的下載速度爲 30Mbit 最高可以 60Mbit ,中 r2q,指沒有 default root,使個網絡的帶寬有限制

使用 TC 整段 IP 進行速度控制
tc qdisc add dev eth0 root handle 1htb r2q 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(隨機公平隊列)

tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev
eth0 parent 1: classid 1:1 htb rate 3000kbit burst 10k tc qdisc
add dev eth0 parent 1:1 handle 10: sfq perturb 10 tc filter add
dev eth0 parent 1: protocol ip prio 16 u32 match ip dst
192.168.111.168 flowid 1:1

sfq,可以防止一個內的一個 ip 個帶寬。使用 TC 控制服務器對速度爲 10M

如下,我要理一臺服務器,只能向外發 10M 的數據

tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1:htb tc class add dev eth0 parent 1classid 1:htb rate 100mbitceil 100mbit tc class add dev eth0 parent 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 1prio 2u32 match ip dst 220.181.xxx.xx/32flowid 1:上面臺,220.181.xxx.xx/32 的,主要是讓這個 ip 進來不被控制 tcfilter add dev eth0 protocol ip parent 1prio 50 u32 match ip dst0.0.0.0/flowid 1:10 認讓所有的流量都從這個

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章