linux tc模拟弱网环境(丢包)

2023-10-28

0. 背景

项目需要模拟弱网环境下,测试音视频的编解码功能。

在linux系统下可以使用tc工具模拟弱网环境,包括出/入流量的丢包等。

1. tc工具介绍

2. 网卡出数据

netem(Network Emulator)可以用来对网卡发出的数据包进行增加延迟、丢包、重复、乱序等处理,来模拟复杂网络环境。netem的设置依赖tc命令,tc是Linux内核提供的流量控制工具。

具体的弱网配置,参考本文第4部分

3. 网卡入数据

为了处理网卡接收的数据包,需要使用linux内核听过的ifb(Intermeidate Functional Block)模块。

个人理解:启动ifb0虚拟网卡,将原输入到eth0的入流量导入到ifb0虚拟网卡中。之后,通过ifb0网卡的中转,返回给应用的数据是ifb0网卡出流量,之后对ifb0网卡便可以复用netem模块设置网络规则。

  1. 加载fib模块,启动ifb0网卡
sudo modprobe ifb
sudo ip link set dev ifb0 up
  1. 将网卡入流量导入到ifb网卡
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: u32 match u32 0 0 action mirred egress redirect dev ifb0
  1. 使用tc配置ifb0网卡入数据规则,举例
# 网卡丢包率设为10%
sudo tc qdisc add dev ifb0 root netem loss 10%

4. 网卡的处理

端口延时命令
网卡配置项,下面的eth0为出流量网卡,若为入流量只需将其替换为ifb0

# 表示对端口廷时100ms
tc qdisc add dev eth0 root netem delay 100ms 
# 表示对端口廷时命令删除
tc qdisc del dev eth0 root netem delya 100ms 
#表示对改变端口廷时命100ms ± 10ms 延时范围(90到110)
tc qdisc add dev eth0 root netem delay 100ms 10ms 
# 表示廷时范围100ms ,同时有25%以± 10ms波动延迟
tc qdisc add dev eth0 root netem delay 100ms 10ms 25%

# 端口丢包命令:
# 丢包率为0.1%
tc qdisc add dev eth0 root netem loss 0.1% 
# 丢包率为范围(0.3%- 25%)
tc qdisc add dev eth0 root netem loss 0.3% 25% 

# 数据包重包命令
# 随机产生 1% 的重复数据包
tc qdisc add dev eth0 root netem duplicate 1% 

# 数据包分发命令
# 数据包重发每格5的整数倍的包将不被延时。其它的将延时10ms
tc qdisc add dev eth0 root netem gap 5 delay 10ms

#速率控制命令:两条命令共同完成
tc qdisc add dev eth0 root handle 1:0 netem delay 100ms
tc qdisc add dev eth0 parent 1:1 handle 10: tbf rate 256kbit buffer 1600 limit 3000

#查看规则信息
tc -s qdisc ls dev eth0
tc qdisc show

#删除规则
tc qdisc del dev eth0 root

5. 特定IP或端口的处理

步骤:

  1. 针对网络物理设备(如以太网卡eth0)绑定一个队列QDisc;
  2. 在该队列上建立分类class;
  3. 为每一分类建立一个基于路由的过滤器filter;
  4. 最后与过滤器相配合,建立特定的路由表。

对IP进行限速

#查看现有的队列
tc -s qdisc ls dev eth0

#查看现有的分类
tc -s class ls dev eth0

#创建队列
tc qdisc add dev eth0 root handle 1:0 htb default 1 
#添加一个tbf队列,绑定到eth0上,命名为1:0 ,默认归类为1
#handle:为队列命名或指定某队列

#创建分类
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 10Mbit burst 15k
#为eth0下的root队列1:0添加一个分类并命名为1:1,类型为htb,带宽为10M
#rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类.
#ceil: ceil是一个类最大能得到的带宽值.

#创建一个子分类
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit ceil 10Mbit burst 15k
#为1:1类规则添加一个名为1:10的类,类型为htb,带宽为10M

#为了避免一个会话永占带宽,添加随即公平队列sfq.
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
#perturb:是多少秒后重新配置一次散列算法,默认为10秒
#sfq,他可以防止一个段内的一个ip占用整个带宽

#使用u32创建过滤器
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 22 flowid 1:10

#删除队列
tc qdisc del dev eth0 root

对PORT进行限速

#清空原有规则
tc qdisc del dev eth0 root

#创建根序列
tc qdisc add dev eth0 root handle 1: htb default 1

#创建一个主分类绑定所有带宽资源(20M)
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 20Mbit burst 15k

#创建子分类
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 20Mbit ceil 10Mbit burst 15k
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20Mbit ceil 20Mbit burst 15k

#避免一个ip霸占带宽资源
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

#创建过滤器
#对所有ip限速
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:10
#对内网ip放行
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 12.0.0.0/8 flowid 1:20

6. 使用tcconfig配置(推荐)

裸tc的配置难以使用,通过tcconfig工具,可以方便的配置netem的功能,就具体使用可参考官方文档

举例:

# 对发往1.1.1.1的出数据包增加500ms延迟
tcset eth0 --delay 500ms --dst-address 1.1.1.1 --direction outgoing 

# 对发往1.1.1.1的80端口的出数据包增加随机丢包5%。
tcset eth0 --loss 5% --dst-address 1.1.1.1 --dst-port 80 --direction outgoing

# 对从1.1.1.1的80端口发来的数据包增加随机丢包5%。
tcset eth0 --loss 5% --src-address 1.1.1.1 --src-port 80 --direction incoming

# 通过tcshow命令可以查看现有的规则
tcshow eth0

# 通过tcdel命令删除现有规则
tcdel eth0 --all

参考链接
https://my.oschina.net/u/2539854/blog/3149307
https://cloud.tencent.com/developer/article/1409664

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux tc模拟弱网环境(丢包) 的相关文章

  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的
  • 计算 TCP 重传次数

    我想知道在LINUX中是否有一种方法可以计算一个流中发生的TCP重传的次数 无论是在客户端还是服务器端 好像netstat s解决了我的目的
  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判

随机推荐

  • 如何安装M26F1 5G路由器

    产品概述 M26F1 是一种物联网无线通信路由器 利用公用 3G 4G 5G 网络为用户提供无线长 距离大数据传输功能 该产品采用高性能的工业级 32 位通信处理器和工业级无线模块 以嵌入式实时操作系 统为软件支撑平台 同时提供 1 个 R
  • Jemalloc free的过程

    redis第一次调用free函数 gdb bt 0 je free ptr 0x7ffff661b000 at src jemalloc c 1837 1 0x000000000043194e in zfree ptr 0x7ffff661
  • 由java速通python(四、文件进程线程)

    45 IO编程 文件读写 with open path to file r as f print f read 这和前面的try finally是一样的 但是代码更佳简洁 并且不必调用f close 调用read 会一次性读取文件的全部内容
  • Python基础教程(7)——模块导入与文件读写

    老样子 先回顾上一节的学习内容 回顾上一节的学习内容 我们主要学习了类与函数的相关知识 不知道你掌握得如何呢 在今天的课程中 我们将会运用之前学到的知识 包括类 函数和字典等内容 如果你之前的知识还没有牢固掌握 可以翻看之前的内容进行复习
  • 分布式事务:解决方案之2PC实战

    说完 分布式事务 解决方案之2PC理论 我们现在就要在理论的基础上实践一把 1 业务说明 下面我们通过Seata中间件实现分布式事务来模拟两个账户的转账交易过程 交易过程是 张三给李四转账指定金额 2 开发环境 数据库 MySQL 5 6
  • POI:从Excel文件中读取数据,向Excel文件中写入数据,将Excel表格中的数据插入数据库,将数据库中的数据添加到Excel表

    POI 简介 POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能 POI为 Poor Obfuscation
  • android中WebView注入Js的问题记录

    在使用WebView加载https链接 会有证书验证问题 通过复写WebViewClient中的方法可以解决 代码如下 mWebView setWebViewClient new WebViewClient Override public
  • 【期中划重点】计算机英语考点整理

    重要 期中考来全部都搜肯定来不及 建议考前看一两遍ppt 到时候大概是哪个ppt的内容 心中有个数 考点快速导航 Week 2 Week 3 考点1 缩写 考点2 前缀后缀 前缀 后缀 Week 4 考点3 计算机历史 Week 5 考点4
  • Google guava之SetMultimap简介说明

    转自 Google guava之SetMultimap简介说明 下文笔者讲述guava中SetMultimap集合的简介说明 如下所示 guava之SetMultimap集合简介 SetMultimap集合 当key和value都相同时 则
  • django系列学习-前言

    在写这个文集的时候 这时候的我已经通过根据网上的大牛单独写好了一个用django 的简单的个人博客 博客源码已经上传到 github上 至于github 你们应该可以找得到 很庆幸自己能通过django学习带来成就的喜悦 但是在学习的过程中
  • 一个相对较全的vue面试链接

    面试官 vue要做权限管理该怎么做 如果控制到按钮级别的权限怎么做 web前端面试 面试官系列web前端面试 vue面试题 react面试题 js面试题 大厂面试题 阿里面试题 京东面试题https vue3js cn interview
  • 物联网--思科模拟器--室内家用电器控制

    视频参考入口 实验拓扑图 实验步骤 服务器设置DHCP 网关为10 1 1 1 ip地址池10 1 1 100开始 子网掩码255 255 255 0 分配10个 电扇 灯 加湿器 咖啡机 手机开启DHCP获取ip地址 手机控制台上注册控制
  • WPF系列教程(二十四):将元素绑定到一起,数据绑定,属性之间的Binding

    项目源码 数据绑定 在窗体中放置了一个Slider控件和一个TextBlock控件
  • PCL 法向量约束的4PCS配准算法

    目录 一 算法原理 1 原理概述 2 参考文献 二 代码实现 三 结果展示 四 测试数据 一 算法原理 1 原理概述 设 B a b c d B a b c d
  • C++中的memset函数

    参考博客 https blog csdn net qq 25406563 article details 83303371 一 一般用于大的数据进行清0的操作 参考上述博客 整理清0数据操作 代码如下 include
  • 【例16 Java从键盘读入学生成绩,找出最高分,并输出学生成绩等级】

    例16 从键盘读入学生成绩 找出最高分 并输出学生成绩等级 成绩 gt 最高分 10 等级为 A 成绩 gt 最高分 20 等级为 B 成绩 gt 最高分 30 等级为 C 其余 等级为 D 提示 先读入学生人数 根据人数创建int数组 存
  • python Pandas庫的學習

    Pandas Series對象 Series 對象用於表示一維的數據結構 其主數組的每個元素都會有一個與之相關聯的標簽 大致如下圖所示 對象的聲明 通過 pd Series 進行聲明 在未指定標簽的情況下 默認使用從0開始一次遞增的數值作爲
  • 创建django项目+创建子应用

    创建django项目 1 work vir1进入虚拟环境 2 通过cd切换到工程目录 django项目会安装至此 3 确保虚拟环境下django 1 11 11安装了 4 创建django项目 django admin startproje
  • Qr Code 二维码的生成与解码

    版权声明 原创文章欢迎转载 不过要记得说明出处 生成二维码 下载phpqrcode 不带logo的二维码 require once phpqrcode qrlib php 图片名 默认为false 直接输出 fileName qr jpg
  • linux tc模拟弱网环境(丢包)

    0 背景 项目需要模拟弱网环境下 测试音视频的编解码功能 在linux系统下可以使用tc工具模拟弱网环境 包括出 入流量的丢包等 1 tc工具介绍 2 网卡出数据 netem Network Emulator 可以用来对网卡发出的数据包进行