使用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》。
使用Kernel NetEm和tc模拟复杂网络环境的更多相关文章
- Fiddler13模拟弱网络环境测试
前言现在的Android软件,基本上都会有网络请求,有些APP需要频繁的传输数据时对于网络请求的稳定性和在特殊网络条件下的兼容性有要求,但是我们在测试的时候又很难模拟那种弱网络差网络的情况,今天就给大 ...
- Network-Emulator-Toolkit 模拟各种网络环境 windows
背景.目标.目的 (1) 背景: 我们在使用网络时,时常遇到在正常网络环境下的代码运行一切正常,可以复杂的网络环境下的各种问题无法复现,必须搭建模拟各种网络环境,去复现问题,定位问题.不管是移动平台, ...
- 用Fiddler模拟低速网络环境
有时候宽频网路用习惯了… 在开发的过程就比较少去考虑最佳化的问题… 但当有人反应说「你的网页好慢」甚至当网路速度慢,会造成你的网页跳出什么啊哩不哒的bug时要如何重现呢? 我们可以用Fiddler 这 ...
- Network Link Conditioner模拟不同网络环境
在Xcode4.1中有一个工具叫Network Link Conditioner,可以让用户模拟不同的网络连接和带宽,可供Mac和iOS开发者测试自己的程序在不同网络环境下的表现. 在Xcode4.3 ...
- Android使用Fiddler模拟弱网络环境测试
原文:https://blog.csdn.net/u010618194/article/details/76652513 1.设置fiddler 顶部Tools-->Connections,把p ...
- fiddler扩展模拟弱网络环境设置
今天在qq群中有人问到怎么模拟app弱网络环境,我查了下资料,记得之前做测试的时候是设置fiddler断点,app请求后止于fiddler断点,app一直拿不到响应结果就应该要给出网络请求失败的提示, ...
- 用Fiddler模拟低速网络环境(弱网)
原文链接:http://caibaojian.com/fiddler.html 有时候宽频网路用习惯了… 在开发的过程就比较少去考虑最佳化的问题… 但当有人反应说「你的网页好慢」 甚至当网路速度慢,会 ...
- 用Fiddler模拟低速网络环境【转】
原文链接:http://caibaojian.com/fiddler.html 我们为什么要限速 限速对于web前端研发是非常重要的,由于开发者的机器一般配置都很高,并且是在localhost下来调试 ...
- Network Emulator for Windows Toolkit(模拟弱网络环境的软件)
前言和下载地址 用户会在各种网络环境下使用我们的app,pc应用,我们决不能祈求用户的网络环境都是稳定的,因此我们需要模拟出弱网络的情况,用来测试我们的APP在弱网络环境下的表现如何. Network ...
随机推荐
- LeetCode专题-Python实现之第9题:Palindrome Number
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- ES6躬行记(19)——生成器
根据ES6制订的标准自定义迭代器实现起来比较复杂,因此ES6又引入了生成器的概念,生成器(Generator)是一个能直接创建并返回迭代器的特殊函数,可将其赋给可迭代对象的Symbol.iterato ...
- Spring Boot 2.x(十四):整合Redis,看这一篇就够了
目录 Redis简介 Redis的部署 在Spring Boot中的使用 Redis缓存实战 寻找组织 程序员经典必备枕头书免费送 Redis简介 Redis 是一个开源的使用 ANSI C 语言编写 ...
- javascript基础修炼(5)—Event Loop(Node.js)
开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. 一. 一道考察异步知识的面试题 题目是这样的,要求写出下面代码的输出: setTimeout(() => { co ...
- C#工具:Bootstrap WPF Style,Bootstrap风格的WPF样式
简介 GitHub地址:https://github.com/ptddqr/bootstrap-wpf-style 此样式基于bootstrap-3.3.0,样式文件里的源码行数都是指的这个版本.CS ...
- Java开发笔记(二)Java工程的帝国区划
上一篇文章介绍了如何运行了第一个Java程序“Hello World”.然而这个开发环境看起来那么陌生,一个个名字符号完全不知道它们是干啥的呀,对于初学者来说,好比天书一般,多看几眼感觉都要走火入魔了 ...
- Java学习笔记之——线程的生命周期、线程同步
一. 线程的生命周期 新建(new Thrad):创建线程后,可以设置各个属性值,即启动前 设置 就绪(Runnable):已经启动,等待CPU调动 运行(Running):正在被CPU调度 阻塞(B ...
- vs2013中集成Git
一:为什么不用2013中自带的? 我的2013自带的没法用,连最基本的克隆都用不了,网上看着下 好像说都不能用:不知道各位的如何. 二:如何自己讲Git集成到vs2013中? 需要的工具: ...
- 微信小程序解密得到unoinid和手机号 (开放数据的校验和解密 获取手机号)
实际测试 两种方法都可以: 第一种方法: public static string DecodeUserInfo(string encryptedData, string iv, string cod ...
- ArcGIS API for JavaScript:Layer之间那点儿事
先来看一个模型: |–TiledMapServiceLayer | |–ArcGISTiledMapServiceLayer |–DynamicLayer | |–Dyn ...