前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于TC和netem实现网络异常情况的模拟

基于TC和netem实现网络异常情况的模拟

原创
作者头像
皮皮熊
修改于 2022-08-31 09:41:19
修改于 2022-08-31 09:41:19
7.9K3
举报

基于TC和netem实现网络异常情况的模拟

背景

笔者最近在对一个公网传输方案做测试时,需要模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等)。惊喜地发现,Linux原生已经集成了TC和netem这对组合,只需要几个命令即可快速地实现上述功能。

TC简介

Linux内核内置了一个TC(Traffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制:

image.png
image.png

TC可以实现的功能是非常丰富的,但本身也是比较复杂,感兴趣的同学可以看下赵亚大神的相关文章。

所以在网络异常模拟场景下,我们更偏向于直接使用TC控制netem来便捷地实现相关功能。

netem简介

netem是linux内核提供的Network emulation服务,可以用来模拟广域网下的延迟、丢包、重复、损坏和乱序等问题。

2.6版本后的linux发行版都已经在内核中启用了netem,netem内核组件在以下情况下启用:

代码语言:txt
AI代码解释
复制
 Networking -->
   Networking Options -->
     QoS and/or fair queuing -->
        Network emulator

重要:netem 是直接添加到网卡上的,也就是说所有从网卡发送出去的包都会收到配置参数的影响!

假如需要回退到正常情况,请谨记下面这个命令:

代码语言:txt
AI代码解释
复制
# 删除 eth0网卡之前添加的netem配置
tc qdisc del dev eth0 root 

netem延迟设置

代码语言:txt
AI代码解释
复制
DELAY := delay TIME [ JITTER [ CORRELATION ]]]
    [ distribution { uniform | normal | pareto |  paretonormal } ]
  • TIME:延迟的时间
  • JITTER:抖动,增加一个随机时间长度,让延迟时间出现在某个范围
  • CORRELATION:相关,下一个报文延迟时间和上一个报文的相关系数
  • distribution:分布,延迟的分布模式,可以选择的值有 uniform、normal、pareto 和 paretonormal
代码语言:txt
AI代码解释
复制
# eth0 网卡延迟增加100ms 
tc qdisc add dev eth0 root netem delay 100ms

# 报文延迟的时间在 100ms ± 20ms 之间(90ms - 110ms)
tc qdisc add dev eth0 root netem delay 100ms 20ms

# 因为网络状况是平滑变化的,短时间里相邻报文的延迟应该是近似的而不是完全随机的。这个值是个百分比,如果为 100%,就退化到固定延迟的情况;如果是 0% 则退化到随机延迟的情况
tc qdisc change dev eth0 root netem delay 100ms 20ms 50%

# distribution 参数来限制它的延迟分布模型。比如让报文延迟时间满足正态分布
tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

netem模拟丢包设置

代码语言:txt
AI代码解释
复制
# 发送的报文有 50% 的丢包率
tc qdisc change dev eth0 root netem loss 50%

# 发送的报文有 0.3% ~ 25% 的丢包率
tc qdisc change dev eth0 root netem loss 0.3% 25%

丢包也支持 state(4-state Markov 模型) 和 gemodel(Gilbert-Elliot 丢包模型) 两种模型的丢包配置。不过相对比较复杂,这里我们就不再详细描述。

netem模拟报文重复\损坏设置

代码语言:txt
AI代码解释
复制
# 随机产生 50% 重复的包
# tc qdisc change dev eth0 root netem loss 50%  # 原错误命令
tc qdisc change dev eth0 root netem duplicate 50%

# 随机产生 2% 损坏的报文(在报文的随机位置造成一个比特的错误)
tc qdisc change dev eth0 root netem corrupt 2%

netem模拟包乱序

网络传输并不能保证顺序,传输层 TCP 会对报文进行重组保证顺序,所以报文乱序对应用的影响比上面的几种问题要小。

代码语言:txt
AI代码解释
复制
# 固定的每隔一定数量的报文就乱序一次
tc qdisc change dev eth0 root netem reorder 50% gap 3 delay 100ms
# 使用概率来选择乱序的报文
tc qdisc change dev eth0 root netem reorder 50% 15% delay 300ms

其他工具

  • wondershaper
  • comcast
  • Netfilter

参考:

https://wiki.linuxfoundation.org/networking/netem

https://blog.csdn.net/dog250/article/details/40483627

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
3 条评论
热度
最新
点赞。重复包那里贴错了,应该是:`tc qdisc change dev eth0 root netem duplicate 50%`
点赞。重复包那里贴错了,应该是:`tc qdisc change dev eth0 root netem duplicate 50%`
11点赞举报
确实,感谢老哥提醒
确实,感谢老哥提醒
回复回复点赞举报
mark
mark
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
如何模拟弱网环境?
运维过程中,最复杂的问题,莫过于网络的问题,而网络问题最烦的就是无法复现,这篇介绍一个强大的网络模拟工具Netem
李俊鹏
2020/06/11
3K0
如何模拟弱网环境?
linux下使用tc控制和模拟网络流量
netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。
sunsky
2021/01/13
4.8K0
混沌工程之ChaosMesh使用之四模拟网络Duplicate包
今天我们来玩一下ChaosMesh模拟网络duplicate包的情况。同时也要看一下对应用产生的直接影响。
高楼Zee
2021/07/14
7070
Linux高级流量控制tc使用
在做MHA测试的时候,有一个重要的环节就是测试MHA Manager节点和Master节点的网络情况,如果产生了抖动,那么MHA本身提供了一个参数secondary_check来保证,但是如果你的部署环境中是一主一从的话,这个参数就不会起作用了,因为latest slave和oldest slave是同一个库,简单来说,连不上就是连不上了,至于切还是不切,这个还不好说。我们测试的场景下,有时候切,有时候不切。所以我们原本测试的MHA0.57版本就降级为了0.56,仔细测试发现,其实也存在这样的问题,综合再三
jeanron100
2018/03/22
4.6K0
linux 下使用 tc 模拟网络延迟和丢包-使用 linux 模拟广域网延迟 - Emulating wide area network delays with Linux
tc 是linux 内置的命令;使用man pages 查看 我们看到,其功能为 show / manipulate traffic control settings,可对操作系统进行流量控制;
西湖醋鱼
2020/12/30
4.5K0
【混沌工程】 docker环境下模拟网络延迟和丢包
原文地址:https://www.chenquan.me/archives/315
保持热爱奔赴山海
2020/04/17
3.4K0
learning :network simulator plugin
Vpp 包括一个功能相当强大的网络模拟器插件,它可以模拟网络端到端的延迟往返时间和配置的网络丢包率及报文乱序功能。它非常适合在指定的延迟、带宽、丢包、乱序条件下评估 TCP 堆栈的性能。此功能和Linux系统下使用 tc 和 netem命令组合模拟客户环境网络波动情况一样:
dpdk-vpp源码解读
2023/06/23
3120
learning :network simulator plugin
微信支付异常性能测试
原文链接:https://wetest.qq.com/lab/view/426.html
WeTest质量开放平台团队
2018/12/05
1.1K0
微信支付异常性能测试
Linux TC(Traffic Control)作为损伤仪的基础配置和使用
当我们有要在某两台设备之间的链路上人为增加一定的时延,丢包,损伤的需求时,最简易的方法是在两台设备之间加入一台 Linux 服务器,分别与两个设备直连,服务器上作为一个纯二层 bridge 透传报文;同时使用Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制来实现对于链路流量增加时延,丢包及损伤。
Nujil
2023/07/12
8721
极端场景下jraft的验证
最近1-2周, 业务侧基于性能和一致性的需求,测试和验证基于sofa-jraft的框架。由于上线后事关生产环境的稳定性,于是加入调研jraft/raft相关领域调研,确保生产环境即使在极端情况下,也在我们考量的范围之内。
richard.xia_志培
2022/06/14
1.1K0
混沌工程之ChaosMesh使用之二模拟POD网络丢包
在《混沌工程之ChaosBlade-Operator使用之一模拟POD丢包场景》中,我们提到过一次丢包场景的模拟了,但是不同的混沌工具,是否有不同的实现方式呢?
高楼Zee
2021/07/14
7120
弱网环境搭建之 Linux tc & iptables 详解
笔者有一个需要搭建弱网环境来复现某个网络问题的需求,因此开始在网络中寻找能够快速搭建弱网环境的方式。
siri
2022/11/18
4K0
在CVM上模拟VPC网络故障原理笔记
日常在给客户做稳定性治理时,像实例级别的不可用、主从切换、重启、性能等维度的场景做的比较多,随着治理的深入,大家慢慢把目光专项应用程序更不可控的场景:网络数据包异常。
AIOPS
2023/09/30
2940
微信支付异常性能测试
作 者 尹华乐,腾讯微信事业群工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 一、异常压测场景模拟 说明:压测服务器具备自动完成初始化(支持快速扩缩容),初始化后均已支持:stress 、tc等工具(不需安装) 1.使用stress模拟压力(CPU/内存/IO繁忙)   a.如何使用:       cpu高负载模拟:stress -c 44 -t  60       内存高负载模拟:stress -m 10 -t  60       IO高负载模拟:stress -i 1
WeTest质量开放平台团队
2018/12/11
1K0
微信支付异常性能测试
【云顾问-混沌】Linux的网络管理神器-tc qdisc
在介绍tc qdisc之前,先解释下tc是什么, tc(traffic control)是Linux内核中的一个网络流量控制工具,它可以用来控制网络流量的带宽、延迟、丢包等参数,从而实现网络流量的优化和管理。详细介绍可以参考Linux TC工具的官方文档和man手册。而qdisc (queueing disciplines), 是tc工具中的一部分,叫做队列规则,是一种可以定义Linux网络流量队列规则的一种机制,可以进行流量排队、调度以及限速等操作,达到对网络流量的精细控制和管理。如下是几个qdisc的例子:
冷淡然
2023/06/27
4.3K0
【云顾问-混沌】Linux的网络管理神器-tc qdisc
Linux网络模拟
在Linux下, 通常使用netem或bridge来模拟网络不稳定情况。 在模拟过程中, 最好使用虚拟机。 如果是远程机器, 那么网络环境模拟需要两块网卡, 而桥模拟最好使用三块网卡。 就是需要附加一个网卡, 用作管理。
用户3765803
2019/03/05
3.1K0
为什么MOBA、“吃鸡”游戏不推荐用tcp协议——实测数据
本文主要探讨了在网络游戏领域,从客户端到服务器的网络延迟对于玩家游戏体验的影响。针对MOBA、FPS、MMORPG等多种类型的游戏,分析了在弱网环境下,TCP协议和UDP协议的加速方案。最后,文章介绍了腾讯云智营网优产品,提供了免费试用入口。
腾讯云开发者社区
2017/12/06
17.4K7
为什么MOBA、“吃鸡”游戏不推荐用tcp协议——实测数据
一种手动建立损伤网络的方法
在windows上安装Linux虚拟机 windows 192.168.43.100 路由 43.254 CentOS5.4 linux 192.168.43.101 路由 43.254 这时 linux windows 上网都是正常的。 启动linux的路有功能 sysctl -w net.ipv4.ip_forward=1 也可以设置到配置文件中,重启生效 vi /etc/sysctl.conf net.ipv4.ip_forward = 1 查看方式: sysctl net.i
TSINGEYE清眸物联
2023/01/04
4110
TC(Traffic Control)命令—linux自带高级流控
Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。 接收包从输入接口进来后,经过流量限制丢弃不符合规定的数据包,由输入多路分配器进行判断选择:
阿dai学长
2019/04/03
69.9K2
SecureCRT 命令行备注「建议收藏」
Non-authoritative answer: Name: a.kaixin001.com Addresses:
全栈程序员站长
2022/11/01
1.2K0
推荐阅读
相关推荐
如何模拟弱网环境?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档