关键词: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. 【Vue】----- computed与watch的区别

    1.computed computed是一种计算属性,用来监听属性的变化: computed里面的方法调用的时候不需要加(),并且里面的方法必须要有一个返回值: computed里面的方法不是通过事件 ...

  2. vim编辑器详解(week1_day3)--技术流ken

    vi编辑器 作用:编辑文本文件中的内容的工具 命令历史 末行模式中,以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 v ...

  3. C# 【一】进程 , 线程 , 微线程 , 同步 , 异步 , 并发 , 并行 , 阻塞 , 非阻塞

    一 理解篇 前言 本文仅仅用作借鉴使用,作者刚入行不久,所以请不小心看到这篇文章的朋友,手下留情. 本文以小故事的形式进行叙述,逻辑不通之处.请理解. 如有错误 ,欢迎指出. 谢谢.          ...

  4. IO帮助类

    using System; using System.IO; using System.Web; using System.Drawing; using System.Drawing.Imaging; ...

  5. Android开发——使用LitePal开源数据库框架

    前言:之前使用Android内置的数据库,感觉一大堆SQL语句,一不小心就错了,很难受,学习了这个LItePal的开源数据库框架,瞬间觉得Android内置的数据库简直是垃圾般的存在 LitePal ...

  6. 深入理解JavaScript作用域和作用域链

    前言 JavaScript 中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! ...

  7. cSharp:反射 Reflection

    /// <summary> /// 利用反射调用插件方法 /// 涂聚文(Geovin Du) /// 2019-03-27 /// /// </summary> /// &l ...

  8. arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. java 线程方法 ---- yiled()

    class MyThread3 implements Runnable{ @Override public void run() { for (int i = 0; i < 3; i++){ / ...

  10. React Native基础&入门教程:初步使用Flexbox布局

    在上篇中,笔者分享了部分安装并调试React Native应用过程里的一点经验,如果还没有看过的同学请点击<React Native基础&入门教程:调试React Native应用的一小 ...