关键词: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》。

使用Kernel NetEm和tc模拟复杂网络环境的更多相关文章

  1. Fiddler13模拟弱网络环境测试

    前言现在的Android软件,基本上都会有网络请求,有些APP需要频繁的传输数据时对于网络请求的稳定性和在特殊网络条件下的兼容性有要求,但是我们在测试的时候又很难模拟那种弱网络差网络的情况,今天就给大 ...

  2. Network-Emulator-Toolkit 模拟各种网络环境 windows

    背景.目标.目的 (1) 背景: 我们在使用网络时,时常遇到在正常网络环境下的代码运行一切正常,可以复杂的网络环境下的各种问题无法复现,必须搭建模拟各种网络环境,去复现问题,定位问题.不管是移动平台, ...

  3. 用Fiddler模拟低速网络环境

    有时候宽频网路用习惯了… 在开发的过程就比较少去考虑最佳化的问题… 但当有人反应说「你的网页好慢」甚至当网路速度慢,会造成你的网页跳出什么啊哩不哒的bug时要如何重现呢? 我们可以用Fiddler 这 ...

  4. Network Link Conditioner模拟不同网络环境

    在Xcode4.1中有一个工具叫Network Link Conditioner,可以让用户模拟不同的网络连接和带宽,可供Mac和iOS开发者测试自己的程序在不同网络环境下的表现. 在Xcode4.3 ...

  5. Android使用Fiddler模拟弱网络环境测试

    原文:https://blog.csdn.net/u010618194/article/details/76652513 1.设置fiddler 顶部Tools-->Connections,把p ...

  6. fiddler扩展模拟弱网络环境设置

    今天在qq群中有人问到怎么模拟app弱网络环境,我查了下资料,记得之前做测试的时候是设置fiddler断点,app请求后止于fiddler断点,app一直拿不到响应结果就应该要给出网络请求失败的提示, ...

  7. 用Fiddler模拟低速网络环境(弱网)

    原文链接:http://caibaojian.com/fiddler.html 有时候宽频网路用习惯了… 在开发的过程就比较少去考虑最佳化的问题… 但当有人反应说「你的网页好慢」 甚至当网路速度慢,会 ...

  8. 用Fiddler模拟低速网络环境【转】

    原文链接:http://caibaojian.com/fiddler.html 我们为什么要限速 限速对于web前端研发是非常重要的,由于开发者的机器一般配置都很高,并且是在localhost下来调试 ...

  9. Network Emulator for Windows Toolkit(模拟弱网络环境的软件)

    前言和下载地址 用户会在各种网络环境下使用我们的app,pc应用,我们决不能祈求用户的网络环境都是稳定的,因此我们需要模拟出弱网络的情况,用来测试我们的APP在弱网络环境下的表现如何. Network ...

随机推荐

  1. VisualStudio,用C#写的一个开源移动APP,资产管理类项目SmoSec

    继SmoOne之后,Smobiler团队又推出一款用C#开发的APP开源项目. 这款开源项目名为SmoSec,目前包含资产管理.耗材管理两大类. 并且,未来会不断迭代,持续增加盘点.标签打印和仓库管理 ...

  2. mybatis基础(中)

    数据模型分析思路 每张表记录的数据内容 分模块对每张表记录对内容进行熟悉,相当于学习系统需求(功能)的过程 每张表重要的字段设置 非空字段.外键字段 数据库级别表与表之间的关系 外键关系 表与表之间的 ...

  3. java-初识Properties

    1.通过代码了解一哈: package com.etc; import java.io.File; import java.io.FileInputStream; import java.io.Fil ...

  4. C++玄学预编译优化

    #pragma GCC diagnostic error "-std=c++11" #pragma GCC optimize("-fdelete-null-pointer ...

  5. Hacking Box Droopy: v0.2

    概述: 目标:get flag 下载链接: https://www.vulnhub.com/entry/droopy-v02,143/ 工具: kail linux 开工 1)扫描开道: # netd ...

  6. pthread_exit在main线程中的用处

    在main线程中调用pthread_exit会起到只让main线程退出,但是保留进程资源,供其他由main创建的线程使用,直至所有线程都结束,但在其他线程中不会有这种效果 https://stacko ...

  7. textarea 输入长度限制

    <textarea " placeholder="请输入详细地址(100字以内)"></textarea>

  8. [翻译]:MySQL Error: Too many connections

    翻译:MySQL Error: Too many connections   前言: 本文是对Muhammad Irfan的这篇博客MySQL Error: Too many connections的 ...

  9. leaflet动态路径

    在leaflet中使用动态路径需要结合插件使用,对比了好几个插件,最终找到leaflet.motion比较合适: leaflet地址:https://leafletjs.com/ leaflet.mo ...

  10. c/c++ 基本线程管理 join detach

    基本线程管理 join detach join:主线程等待被join线程结束后,主线程才结束. detach:主线程不等待被detach线程. 问题1:子线程什么时点开始执行? std::thread ...