關鍵詞: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》。