使用Kernel NetEm和tc模擬複雜網絡環境

關鍵詞:netem(Network Emulator)、tc(Traffic Control)linux

 

大部分局域網環境良好,可是產品實際網絡環境可能千差萬別,爲了對產品進行各類狀況測試就須要模擬網絡環境。網絡

Linux內核network模塊提供了NetworkEmulator功能,結合iproute2的tc功能能夠模擬各類網絡環境。工具

還有一點好處就是能夠固定特殊網絡環境,進行bug復現。性能

 

1. 環境準備

要模擬網絡環境,首先須要Kernel支持netem,而且須要tc工具。測試

使能netem功能,在make emnuconfig界面輸入"/",而後「netem」,便可找到配置netem的路徑。ui

稍微瞭解tc就知道它是iproue2的一部分,在buildroot中配置iproute2.spa

在配置好二者以後,編譯便可使用。blog

2. 原理

netem是內核提供的網絡模擬功能模塊,該功能模塊能夠用來在性能良好的局域網中,模擬出複雜網絡傳輸性能,好比不一樣時延、丟包、亂序、重複等問題。ip

netem的功能模擬經過tc進行配置。經過tc在用戶空間對網卡進行配置,能夠模擬出netem提供的各類網絡環境。get

netem相關源碼在net/sched/sch_netem.c中,tc在iproute2-4.14.1/tc中。

3. 使用

3.1 模擬延遲傳輸

將 eth0 網卡的傳輸設置爲延遲100毫秒發送。

tc  qdisc  add  dev  eth0  root  netem  delay  100ms  

真實的狀況下,延遲值不會這麼精確,會有必定的波動,下面命令模擬帶有波動性的延遲值:

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

該命令將 eth0 網卡的傳輸設置爲延遲 100ms ± 10ms (90 ~ 110 ms 之間的任意值)發送。
因爲各個包的延遲值不通,也會在必定程度上打亂髮包的次序。


還能夠更進一步增強這種波動的隨機性,將 eth0 網卡的傳輸設置爲 100ms ,同時,大約有30%的包會延遲 ± 10ms 發送:

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

 

3.2 模擬網絡丟包

將 eth0 網卡的傳輸設置爲隨機丟掉 1% 的數據包。

tc  qdisc  add  dev  eth0  root  netem  loss  1%  

也能夠設置丟包的成功率,將 eth0 網卡的傳輸設置爲隨機丟掉 1% 的數據包,成功率爲30% :

tc  qdisc  add  dev  eth0  root  netem  loss  1%  30%

 

3.3 模擬包重複

將 eth0 網卡的傳輸設置爲隨機產生 1% 的重複數據包。

tc  qdisc  add  dev  eth0  root  netem  duplicate 1%

 

3.4 模擬數據包損壞

將 eth0 網卡的傳輸設置爲隨機產生 0.2% 的損壞的數據包。

tc  qdisc  add  dev  eth0  root  netem  corrupt  0.2%

 

3.5 模擬數據包亂序

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

tc  qdisc  change  dev  eth0  root  netem  delay  10ms   reorder  25%  50%

 

詳細信息請參考:Linux Foundation的《netem》。

相關文章
相關標籤/搜索