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


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

 

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

Linux內核network模塊提供了NetworkEmulator功能,結合iproute2的tc功能可以模擬各種網絡環境。

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

 

1. 環境准備

要模擬網絡環境,首先需要Kernel支持netem,並且需要tc工具。

使能netem功能,在make emnuconfig界面輸入"/",然后“netem”,即可找到配置netem的路徑。

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

在配置好兩者之后,編譯即可使用。

2. 原理

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

netem的功能模擬通過tc進行配置。通過tc在用戶空間對網卡進行配置,可以模擬出netem提供的各種網絡環境。

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》。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM