如何模拟弱网条件 - 限流, 丢包, 延迟和抖动

2023-11-06

Abstract 弱网条件的模拟
Authors Walter Fan
Category learning note
Status v1.0
Updated 2023-02-16
License CC-BY-NC-ND 4.0

概述

在网络会议,实时通信,网络直播中,由于网络不稳定造成的卡顿,花屏,模糊屡见不鲜,这样不稳定的网络我们称为弱网。
需要采取诸如拥塞控制,重传,纠错等手段进行优化。

实际开发中,我们碰不到客户所遇到的各种网络问题,必须通过一些工具和手段来模拟弱网条件,从而有针对性的进行调优。

验证

在开始模拟弱网,进行网络限制之前,有必要用 iperf3 来验证我们实施的网络限制是否生效

  • 在服务器端启动 iperf3 server
iperf3 -s -i 3s -V -f m -p 12000
  • -s, --server: 以服务器模式启动

  • -f m: 显示带宽的单位为 m

  • -p 12000: 指定侦听的端口

  • -V --verbose: 输出更多的细节

  • 在客户端启动 iperf3 client,这里我们用 udp 方式来传输数据, 这样可以观察到丢包的数据

iperf3 -c 10.224.84.89 -p 12000 -w 5m -b 10m -t 300s -i 3s  -u -l 1000
  • -c: 作为客户端连接服务器
  • -w 5m: 设置 socket 的缓存大小
  • -b 20m: 设置发送数据的比特率(带宽)
  • -t 300s: 持续时间为 300秒
  • -i 3s: 每隔3秒显示报告
  • -u: 用 UDP 传输
  • -l 1000k: 设置读写的缓存大小,TCP 默认是 128 KB,UDP 默认是 8 KB

具体参见 https://iperf.fr/iperf-doc.php#3doc

在服务器端的显示结果如下, 我们可以观察到传输过的数据量,带宽,抖动以及丢包率

Linux ubuntu 4.15.0-180-generic #189-Ubuntu SMP Wed May 18 14:13:57 UTC 2022 x86_64
-----------------------------------------------------------
Server listening on 12000
-----------------------------------------------------------
Time: Thu, 16 Feb 2023 06:54:46 GMT
Accepted connection from 10.224.85.58, port 37666
      Cookie: ubuntu.1676530537.883608.68ec4248520
[  5] local 10.224.84.89 port 12000 connected to 10.224.85.58 port 55932
Starting Test: protocol: UDP, 1 streams, 1000 byte blocks, omitting 0 seconds, 600 second test
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-3.00   sec  6.92 MBytes  19.4 Mbits/sec  0.005 ms  0/7257 (0%)
[  5]   3.00-6.00   sec  7.15 MBytes  20.0 Mbits/sec  0.014 ms  0/7500 (0%)
[  5]   6.00-9.00   sec  7.15 MBytes  20.0 Mbits/sec  0.013 ms  0/7501 (0%)
[  5]   9.00-12.00  sec  7.15 MBytes  20.0 Mbits/sec  0.016 ms  0/7499 (0%)
[  5]  12.00-15.00  sec  7.15 MBytes  20.0 Mbits/sec  0.018 ms  0/7501 (0%)
[  5]  15.00-18.00  sec  7.17 MBytes  20.0 Mbits/sec  0.047 ms  0/7514 (0%)

Windows

在 windows 系统中,我们可以使用 clumsy 来模拟弱网条件,更改网络状况, 引入延迟(lag),丢包(drop),乱序等

Mac

在 MAC 系统中, Network Link Conditioner 是一个很好用的工具,您可以从 Apple Developers 页面下载,可通过 System Preferences 访问。它可以限制上行或下行链路的带宽、延迟和数据包丢失率。

安装说明参见 https://nshipster.com/network-link-conditioner/#installation

Linux

在 Linux系统中, tc(Traffic Control)是最常用的网络控制工具,它既强大又复杂, 我们常用 netem 模块和 tc 命令常用来控制网络流量,模拟网络中常见的各种问题。

tc 用于在 Linux 内核中配置流量控制。流量控制包括以下内容:

  • SHAPING 整形

当流量被整形时,它的传输速率是受控的。 整形可能不仅仅是降低可用带宽 - 它还用于平滑流量突发以获得更好的网络行为。 整形发生在出口处。

  • SCHEDULING 调度

通过调度数据包的传输,可以提高需要它的流量的交互性,同时仍然保证批量传输的带宽。 重新排序也称为优先级,仅发生在出口处。

  • POLICING 监管

整形处理的是流量的传输,而监管则与到达的流量有关。 因此,监管发生在入口处。

  • DROPPING 丢弃

超过设定带宽的流量也可以立即被丢弃,丢弃可发生在入口和出口处

流量的处理由三种对象控制:

  1. qdiscs : 简单来说,它可以理解为一个队列,以及入队出队的调度器,默认的调度器是 FIFO, 包括可分类和不可分类的 qdisc
  2. classes: 类存在于 classful qdisc 中,它可以包含多个子类或单个子 qdisc, 可用于极其复杂的场景
  3. filters: 过滤器 filter 是Linux流量控制系统中最复杂的组件,它提供了一种方便的机制,可以将流量控制的几个关键元素粘合在一起

关于 TC 的内容,三天三夜也讲不完,需要另外详细阐述,略过不表。

通过一些例子来看看怎么使用 TC

Loss 丢包

  • 增加 loss
sudo tc qdisc add dev eth0 root netem loss 20%
  • 更改 loss
sudo tc qdisc change dev eth0 root netem loss 30%
  • 删除 loss
sudo tc qdisc del dev eth0 root netem loss 30%

Jitter 抖动

  • 增加jitter 到 50ms
sudo tc qdisc add dev eth0 root netem rate 1000mbit delay 0ms 50ms 0%
  • 更改jitter 到 100ms
sudo tc qdisc change dev eth0 root netem rate 1000mbit delay 0ms 100ms 0%
  • 删除 jitter
sudo tc qdisc del dev eth0 root netem rate 1000mbit delay 0ms 100ms 0%

速率控制 Rate Control (带宽限制)

  • 限制 rate 到 1mbps
sudo tc qdisc add dev eth0 root netem rate 1mbit

叠加多种限制条件 Impairments

  • 使用 handle 1: 增加 rate control at root qdisc:
sudo tc qdisc add dev eth0 root handle 1: netem rate 1mbit
  • 串接 500ms jitter 到 rate control qdisc handle 1:
sudo tc qdisc add dev eth0 parent 1:1 handle 10: netem rate 1000mbit delay 0ms 500ms
  • 串接 5% 的丢包到 jitter qdisc
sudo tc qdisc add dev eth0 parent 10:1 netem loss 5%

inbound traffic 输入流量的限制

刚才说的都是输出流量的限制,tc 很容量来控制发送的速率,延迟和丢包,但是对于输入流量,需要引入一个虚拟网卡, 数据流向是 “client --> ifb --> nic --> server” , 其中 ifb 是虚拟网卡,nic 是真实网卡,我们用 tc控制 ifb 到 nic 之间的发送, 来达到网络限制的目的。

  • 先用 modprobe ifb 命令来启动相关的内核模块, 以创建虚拟接口,代表输入的流量
modprobe ifb
  • modprobe ifb 默认创建两个 ifb 设备 ifb0 和 ifb1.
    它位一开始的状态是 "down", 需要用以下命令启用
ip link set dev ifb0 up
  • 如果上述命令失败,需要输入以下命令后重试上一步
ip link add ifb0 type ifb
  • 在网络接口上启用 ingress 并使用 filter 将所有输入的流量重定向到虚拟的 ifb 设备
tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
  • 在虚拟 ifb 设备上应用网络限制,就像在普通的网络设备上一样
tc qdisc add dev ifb0 root netem delay 750ms
  • 显示当前的网络设置
sudo tc qdisc show
  • 删除所有的网络限制
sudo tc qdisc del dev eth0 root

如果嫌命令太烦琐,可以用如下的脚本来做网络限制 netimpair.py
(这个版本有点老,我做了一些改动,回头 fork 一个 git repo 提交上去)



本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模拟弱网条件 - 限流, 丢包, 延迟和抖动 的相关文章

  • centos系统有什么好处?

    CentOS是一种基于开源代码的Linux操作系统 它有以下几个优势 1 稳定性 CentOS是一种非常稳定的操作系统 它的代码经过了严格的测试和审查 因此它非常适合作为服务器操作系统使 用 2 安全性 由于CentOS是基于开源代码的操作
  • 使用Hypothesis生成测试数据

    Hypothesis是Python的一个高级测试库 它允许编写 测试用例 时参数化 然后生成使测试失败的简单易懂的测试数据 可以用更少的工作在代码中发现更多的bug 安装 pip install hypothesis 如何设计 测试数据 通
  • 如何利用CHAT做简单的总结体会?

    问CHAT 在测试过程中使用appium python自动化的优点和体会 CHAT回复 使用 Appium 配合 Python 进行自动化测试主要有以下几点优点 1 跨平台性 Appium 支持 iOS 和 Android 平台的应用自动化
  • Linux终端常见用法总结

    熟悉Linux终端的基础用法和常见技巧可以极大提高运维及开发人员的工作效率 笔者结合自身学习实践 总结以下终端用法供同行交流学习 常 见 用 法 1 快捷键 1 1 Alt 在光标位置插入上一次执行命令的最后一个参数 1 2 Ctrl R
  • 2种方法,教你使用Python实现接口自动化中的参数关联

    通常在接口自动化中 经常会参数关联的问题 那么什么是参数关联 参数关联就是上一个接口的返回值会被下一个接口当做参数运用 其中Python中可以实现参数关联的方法有很多种 今天小编给大家介绍下 如何通过Python来实现接口自动化中的参数关联
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

    文章目录 1 前言 2 Imagewheel网站搭建 2 1 Imagewheel下载和安装 2 2 Imagewheel网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道
  • 什么是充放电振子理论?

    CHAT回复 充放电振子模型 Charging Reversal Oscillator Model 是一种解释ENSO现象的理论模型 这个模型把ENSO现象比喻成一个 热力学振荡系统 在这个模型中 ENSO现象由三个组成部分 充电 Char
  • 一台java服务器可以跑多少个线程?

    一台java服务器可以跑多少个线程 一台java服务器能跑多少个线程 这个问题来自一次线上报警如下图 超过了我们的配置阈值 打出jstack文件 通过IBM Thread and Monitor Dump Analyzer for Java
  • Kubernetes (十一) 存储——Secret配置管理

    一 简介 从文件创建 echo n admin gt username txt echo n westos gt password txt kubectl create secret generic db user pass from fi
  • 国外拨号VPS指南:开启你的全球网络之旅

    在当今数字化时代 互联网已经成为了我们生活的一部分 而要在全球范围内畅通无阻地访问互联网 拥有一个可靠的国外拨号VPS是非常重要的 无论您是为了工作 学习还是娱乐 国外拨号VPS都可以为您提供更广泛的网络体验 本文将为您提供国外拨号VPS的
  • ssh:connect to host github.com port 22: Connection timed out

    解决流程 1 将github的端口由22改为443 ssh T p 443 git ssh github com 2 接着输入yes进行确认 The authenticity of host ssh github com 443 192 1
  • 静态综合实验

    1 IP地址划分 192 168 1 0 27 用于主干拆分 192 168 1 32 27 用于用户拆分 192 168 1 64 27 用于用户拆分 192 168 1 96 27 用于用户拆分 192 168 1 128 27 用于用
  • UI自动化测试之Jenkins配置

    背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测试那部分功能整个废弃掉了 其中和易用性有很大关系 另外 也和我们公司的接口业务也有关
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易
  • 服务器中E5和I9的区别是什么,如何选择合适的配置

    随着科技的进步 服务器处理器的性能在不断攀升 其中 Intel的E5和I9系列处理器在业界具有广泛的影响力 而当我们在选择服务器的时候会有各种各样的配置让我们眼花缭乱不知道该怎么去选择 下面我跟大家分享一下E5跟I9有什么区别 方便我们在选

随机推荐

  • selenium爬取京东商品信息

    开始编写代码之前你应了解ajax 和python基础语法和库 知道异步加载 熟悉html js 本人ide用的是vscode 浏览器是chrome python3 7 主要用到了selenium自动化测试工具 一 先看效果 这里以 手机 为
  • C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

    文章目录 写在前面 哈夫曼树及哈夫曼编码的算法实现 实验内容 代码实现 图的基本操作 实验内容 代码实现 写在前面 本篇实验代码非本人写 代码源自外部 经调试解决了部分warning和error后在本地vs上可以正常运行 如有运行失败可换至
  • addr2line objdump命令使用方法

    如果是 的 CMakeList txt 编译的时候需要加上一下选项 才可以生产 版本 可以使用addr2line 定位问题 catkin make DCMAKE BUILD TYPE debug DCATKIN WHITELIST PACK
  • STM32定时器-输入捕获

    定时器 输入捕获 输入捕获工作过程 一句话总结工作过程 通过检测TIMx CHx上的边沿信号 在边沿信号发生跳变 比如上升沿 下降沿 的时候 将当前定时器的值 TIMx CNT 存放到对应的捕获 比较寄存器 TIMxCCRx 里面 完成一次
  • 股票数据预处理

    数据导入 提示 注意是csv 还是xlsx文件 本文导入中证100指数 import pandas as pd data pd read excel data CSI100 xls dtype 股票代码 Stkcd str 注意设置代码格式
  • OSI和TCP/IP

    OSI和TCP IP是两种不同的计算机网络协议体系 OSI协议体系 即开放式系统互联通信参考模型 Open Systems Interconnection 是一种抽象的理论网络体系结构 由国际标准化组织 ISO 制定 这个体系结构包括七层
  • 使用msys2 mingw64编译gcc

    我们在msys2中使用pacman安装的GCC默认是不能显示中文帮助的 而Linux下是可以显示中文的 这是因为在编译msys2 Mingw在编译GCC时 是没有打开 enable nls开关的 为了让其可以显示中文 可以尝试自己编译GCC
  • 60-200-050-使用-命令-MySQL explain命令

    文章目录 1 explain使用方法 2 ID 3 select type 4 table 5 Type 5 0 null 5 1 system 5 2 const 5 3 eq ref 5 4 ref 5 5 range 5 6 inde
  • linux mysql cpu 查看工具_Linux常用系统分析工具-CPU

    TOP top命令可以实时动态地查看系统的整体运行情况 是一个综合了多方信息监测系统性能和运行信息的实用工具 TOP命令的可选参数和其对应的含义如下 c 显示完整的命令 d 屏幕刷新时间间隔 i 设置时间间隔 u 指定用户名 p 指定进程
  • LDA模型训练与得到文本主题、困惑度计算(含可运行案例)

    文章目录 模块一 训练LDA模型 模块二 困惑度计算 模块三 得到一段文本的主题 全部代码及案例 可直接运行 首先使用gensim库 pip install gensim 模块一 训练LDA模型 import gensim pip inst
  • 07-微信小程序-注册页面-模块化

    07 微信小程序 注册页面 文章目录 注册页面 使用 Page 构造器注册页面 参数Object 初始数据 案例代码 生命周期回调函数 组件事件处理函数 setData 案例代码 生命周期 模块化 注册页面 对于小程序中的每个页面 都需要在
  • [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • HTML CSS 盒模型 +background 使用

    HTML 盒模型 box model 和background 部分内容来自菜鸟教程 所有HTML元素可以看作盒子 在CSS中 box model 这一术语是用来设计和布局时使用 CSS盒模型本质上是一个盒子 封装周围的HTML元素 它包括
  • 写一个函数,用户输入一个数判断是否是素数

    写一个函数 用户输入一个数判断是否是素数 function get num if num 1 num 0 return num 不是质数 for var i 2 i lt num i if num i 0 return num 不是质数 r
  • oracle生成标准uuid,Oracle 生成uuid方法

    近日 遇到朋友问及如何生成UUID 是 通用唯一识别码 Universally Unique Identifier 方法 其实数据中是支持的 Oracle中生成跨系统的唯一识别符UUID非常方便 比生成序列还简单 直接用sys guid 就
  • Stable Doodle:简单涂鸦一键变成艺术品

    摘要 Stable Doodle 是一款使用 AI 技术将简单涂鸦转化为艺术品的应用 它可以帮助用户快速 轻松地创作出精美的图画 本教程将介绍 Stable Doodle 的基本使用方法 正文 Stable Doodle 的使用非常简单 只
  • 2080ti,驱动安装,CUDA安装,CUDNN安装,CUDA10.1的不兼容问题

    发现问题 哎呦 我跑的是CPU 不是GPU 解决问题 Tensorflow目前不支持CUDA10 1 继续解决问题 哎呦 驱动被不小心删掉了 那就全部重新安装吧 最终解决好了 跑起来了 看似GPU 其实跑的是CPU 之前写了代码发现 能跑起
  • 分布式版本控制VS集中式版本控制

    集中式版本控制 诸如CVS SVN等 都有一个集中管理的服务器 保存所有的文件修订版本 而协同工作的人们都通过客户端连接到这台服务器 取出最新的文件或者提交更新 如上图所示 A B C为三位开发者 这是A将代码拉到本地进行开发 这个时候A开
  • raise_for_status()方法

    raise for status 方法 理解Response类非常重要 Response这样的一个对象返回了所有的网页内容 那么它也提供了一个方法 叫raise for status 这个方法是专门与异常打交道的方法 该方法有这样一个有趣的
  • 如何模拟弱网条件 - 限流, 丢包, 延迟和抖动

    Abstract 弱网条件的模拟 Authors Walter Fan Category learning note Status v1 0 Updated 2023 02 16 License CC BY NC ND 4 0 概述 在网络