首页 > 其他分享 >网络故障 之二 tc和netem

网络故障 之二 tc和netem

时间:2024-05-24 09:23:04浏览次数:25  
标签:网络故障 netem qdisc 报文 网卡 tc eth0

一、介绍

     netem是Linux2.6及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低宽带,传输延迟,丢包等等情况。使用Liunx 2.6(或以上)版本内核的很多发行版Linux都开启了该内核功能,比如Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian等等。tc是Linux系统中的一个工具,全名为traffic control(流量控制)。tc可以用来控制netem的工作模式,也就是说,如果想使用netem,需要至少两个条件,一个是内核中的netem功能被包含,另一个是要有tc。

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

报文分组从输入网卡(入口)接收进来,经过路由的查找,以确定是发给本机的,还是需要转发的。如果是发给本机的,就直接向上递交给上层的协议,比如TCP,如果是转发的,则会从输出网卡(出口)发出。网络流量的控制通常发生在输出网卡处。虽然在路由器的入口处也可以进行流量控制,Linux也具有相关的功能,但一般说来,由于我们无法控制自己网络之外的设备,入口处的流量控制相对较难,反之出口处的流量控制较为容易。

流量控制的一个基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系,每当内核需要将报文分组从网卡发送出去,都会首先将该报文分组添加到该网卡所配置的队列中,由该队列决定报文分组的发送顺序,即所有的流量控制都发生在队列中。

有些队列的功能是非常简单的,它们对报文分组实行先来先走的策略。有些队列则功能复杂,会将不同的报文分组进行排队、分类,并根据不同的原则,以不同的顺序发送队列中的报文分组。为实现这样的功能,这些复杂的队列需要使用不同的过滤器(Filter)来把报文分组分成不同的类别(Class)。这里把这些复杂的队列称为可分类(ClassfuI)的队列。

通常, 要实现功能强大的流量控制,可分类的队列是必不可少的。因此,类别(class)和过滤器(Filter)也是流量控制的另外两个重要的基本概念。

     通过上面的介绍,获知的重要信息为:流量控制通常是对发出去的报文。

二、语法

可以使用 tc qdisc help 查看你其基本用法

tc qdisc help 展现出来的用法介绍不是很全面,有些看不太明白。  可以直接使用  man netem 查看语法用法  或直接访问: tc-netem(8) - Linux manual page (man7.org)  进行查看。

以上具体的说明如下:

tc qidsc [add|change|del|replace|show] dev  STRING ............. netem OPTIONS  

其中 OPTIONS 就是模拟流量故障的相关配置

 OPTIONS := [ LIMIT ] [ DELAY ] [ LOSS ] [ CORRUPT ] [ DUPLICATION ] [ REORDERING ][ RATE ]

主要如下:

1、基于报文数量(令牌桶TBF)的限速—limit

 LIMIT := limit packets

2、延迟  ----delay

DELAY := delay TIME [ JITTER [ CORRELATION ]]]
[ distribution { uniform | normal | pareto | paretonormal } ]

这里有4个参数:TIME,JITTER, CORRELATION, distribution,TIME是必选参数,而其它几个参数都是可选参数。

TIME:延迟的时间  (单位毫秒)  

   tc qdisc add dev eth0 root netem delay 100ms   

表示:网卡eth0 出去的每个数据包都延迟了100毫秒

JITTER:抖动,增加一个随机时间长度,让延迟时间出现在某个范围   (单位毫秒)

tc qdisc add dev eth0 root netem delay 100ms  20ms

表示:网卡 eth0 出去的每隔数据包延迟的时间有个抖动的范围 80ms --- 120ms

CORRELATION:相关,下一个报文延迟时间和上一个报文的相关系数  (百分比)

tc qdisc add dev eth0 root netem delay 100ms  20ms 50%

表示:网卡 eth0 出去的每隔数据包延迟的时间有个抖动的范围 80ms --- 120ms,设置了相关系数为 50%
distribution:分布,延迟的分布模式,可以选择的值有 uniform、normal、pareto 和 paretonormal,默认是 Normal
tc qdisc add dev eth0 root netem delay 100ms  20ms distribution  normal 

表示:网卡 eth0 出去的每隔数据包延迟的时间有个抖动的范围 80ms --- 120ms,报文延时分布满足正态分布

 3、丢失 ---- lose

LOSS := loss { random PERCENT [ CORRELATION ] |
state p13 [ p31 [ p32 [ p23 [ p14]]]] |
gemodel p [ r [ 1-h [ 1-k ]]] } [ ecn ]

这里有4个参数:其中random, state, gemodel 是必选参数(3选1),而ecn参数都是可选参数。

random : 百分比,丢包率

   tc qdisc add dev eth0 root netem lose 20%

表示:网卡 eth0 出去的数据包,丢包率达到20%

 4、损坏/错误报文 --- corrupt

 CORRUPT := corrupt PERCENT [ CORRELATION ]]

这里有2个参数:其中PERCENT是必选参数,而CORRELATION参数都是可选参数。

PERCENT:指定的百分比随机选定的报文中模拟随机噪声在报文随机的位置引入错误。

tc qdisc add dev eth0 root netem corrupt 25%

表示:eth0 网卡模拟发送的报文中随机选取 25%变成损坏的报文(在被随机选中做为错误报文的随机位置造成一个错误)

CORRELATION :同样支持相关系数。0%表示完全不相关,是完全随机的,而100%是完全相关。

5、重复报文 ---- DUPLICATION 

DUPLICATION := duplicate PERCENT [ CORRELATION ]]

这里有2个参数:其中PERCENT是必选参数,而CORRELATION参数都是可选参数。

PERCENT :按PERCENT指定的百分比随机选定的报文相应的产生一组重复报文

tc qdisc add dev eth0 enp2s0 netem duplicate 25%

表示:网卡模拟发送的报文中随机选取 25%产生重复报文

CORRELATION:同样支持相关系数。0%表示完全不相关,是完全随机的,而100%是完全相关。

6、乱序 --- reorder   [必须和 delay一同使用]

REORDERING := reorder PERCENT [ CORRELATION ] [ gap DISTANCE ]

这里有2个参数:其中PERCENT是必选参数,而CORRELATION和 gap DISTANCE参数都是可选参数。

PERCENT :按PERCENT指定的百分比随机选定的报文相应的产生乱序

CORRELATION : 同样支持相关系数。0%表示完全不相关,是完全随机的,而100%是完全相关。

gap:搭配 deplay 延时使用

tc qdisc add dev eth0 root netem delay 20ms reorder 100% gap 5

表示:从eth0 网卡出去的数据包每5个包中的前4个包延时20ms发出去,第5个包100%立刻发出去,也就是第5个包在前4个包之前发送,以达到乱序。

tc qdisc add dev eth0 root netem delay 20ms reorder 90% gap 5

表示:从eth0 网卡出去的数据包每5个包中的前4个包延时20ms发出去,第5个包90%的概率会立刻发出去达到乱序的目的也有10%的概率延迟20ms再发出去,这样就不乱序。

tc qdisc add dev enp2s0 root netem delay 20ms reorder 50%

表示:从eth0 网卡出去的每个数据包,每个数据包都有50% 的可能会被立刻发送出去,也有50% 的可能会延迟20毫秒,随机性由系统决定。

7、速率 ---- rate

RATE := rate RATE [ PACKETOVERHEAD [ CELLSIZE [ CELLOVERHEAD ]]]]

 

 

三、案例

  ifconfig 

    查看本服务器上的网卡信息

 

1、网络延迟

 tc qdisc add dev etho rootnetem delay 100ms

 该命令将eth0网卡的传输设置为延迟100毫秒发送。

tc qdisc add dev eth0 root netem delay 100ms 10ms

 该命令将eth0网卡的传输设置为延迟100ms ±  10ms(90~110ms之间的任意值)发送,模拟更真实的网络波动,即延迟值存在一定的波动性

2、网络丢包

 tc qdisc add dev eth0 root netem loss 1%

  该命令将eth0网卡的传输设置为随机丢掉1%的数据包

3、 数据包重复

 tc qdisc add dev eth0 root netem duplicate 1%

该命令将eth0网卡的传输设置为随机产生1%的重复数据包。

4、数据包损坏

 tc qdisc add dev eth0 root netem corrupt 0.2%

 该命令将eth0网卡的传输设置为随机产生0.2%的损坏的数据包。

5、 数据包乱序

tc  qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

 该命令将eth0网卡的传输设置为:有25%的数据包(50%相关)会被立即发送,其他的延迟10秒。

6、查看已经配置的网络条件

tc qdisc show dev eth0

7、删除已经配置的网络条件

以网络丢包的网络条件作为示范,如果去掉之前设置的网络丢包规则

tc qdisc del dev eth0 root netem loss 1%

将之前设置的规则 add 更改成 del,其它部分保持不变

 

 

 

 

 

 

参考资料:

网络异常模拟测试方法 - zhangmeng117 - 博客园 (cnblogs.com)

 

标签:网络故障,netem,qdisc,报文,网卡,tc,eth0
From: https://www.cnblogs.com/sandyflower/p/18206541

相关文章

  • .netcore 对象存储帮助类
    说明:1、由于各平台对象存储规则存在细微差异,故在类中对于入参进行处理(使用时需要根据自身情况调整)。2、本文档写于2024年05月24日,由于版本的迭代,可能存在细微差异,可能导致错误,所以推荐下载文档使用NuGet引用版本进行测试。minio对象存储帮助类usingMinio;usingMinio.DataM......
  • Qt线程使用方法三:QtConcurrent::run
    在Qt中,QFuture和QtConcurrent模块提供了一种简便的方式来执行并行任务。QFuture用于接收异步操作的结果,而QtConcurrent提供了一些函数来启动异步操作。这种方法不需要直接使用QThread,而是通过高级API来管理线程池和任务。 步骤 1: 包含必要的头文件 首先,确保你的项目文件(如......
  • netcore webapi部署到docker容器,api调用后显示中文乱码
    vs2022webapi部署到docker容器,api调用后显示中文乱码。原因是:源代码文件不是utf-8编码(用vscode打开是乱码,在vscode修改后,再提交,正常)解决方法:在中文环境下用过微软家Visualstudio的都知道,新建文件的保存编码都默认为当前系统语言,所以你的文件编码永远都是GB2312,非常令人蛋......
  • 使用tc命令模拟linux网络延迟环境
    tc(TrafficControl)是Linux中用于流量控制和网络模拟的强大工具。你可以使用它来模拟网络延迟、带宽限制、数据包丢失等。以下是一个使用tc模拟网络延迟的基本步骤:1.查看当前的qdisc(队列规则)和filter(过滤器)首先,确保你的网络接口没有设置任何qdisc。你可以使用以下命令查......
  • webrtc FEC 协议
    参考:https://www.cnblogs.com/ishen/p/15333271.htmlhttps://zhuanlan.zhihu.com/p/6034212391.生成1.1等待并筹齐多个原始包webrtc会等待筹齐多个rtp包后,再统一生成冗余包,参看UlpfecGenerator::AddPacketAndGenerateFec()函数:voidUlpfecGenerator::AddPacketAndGe......
  • netcore 开源的与插件有关的项目
    在.NETCore生态系统中,有一些开源项目可以实现类似于插件系统的功能,允许应用程序动态加载和运行扩展或模块。以下是一些值得关注的项目和框架:1.OrchardCoreOrchardCore是一个开源、模块化的应用程序框架和内容管理系统,基于ASP.NETCore构建。它提供了强大的模块化和扩展......
  • LeetCode Greatest Common Divisor of Strings All In One
    LeetCodeGreatestCommonDivisorofStringsAllInOneLeetCode1071errorsfunctiongcdOfStrings(str1:string,str2:string):string{letresult=``;lettemp=[];if(str1.length>str2.length){letreg=newRegExp(str2,'g'......
  • QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
     Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台。在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他的IDE配合CMake等方式,但使用QtCreator更加方便,并且操作环境完全一致。QtCreator支持Windows、Linux、M......
  • Nodejs Playwright 2Captcha 验证码识别实现自动登陆
    NodejsPlaywright2Captcha验证码识别实现自动登陆需求日常工作当中,为了提高工作效率,我们可能会写脚本来自动执行任务。有些网站因为需要用户登陆,所以脚本的自动登陆功能必不可少。不过我们在登陆网站的时候经常会出现验证码,验证码的目的就是为了防止机器登陆、自动化脚本操......
  • yolov8 分割任务切块推理库 patched_yolo_infer
    这个Python库简化了类似SAHI的推理,例如分割任务,从而能够检测图像中的小对象。它同时满足对象检测和实例分割任务,支持广泛的Ultralytics模型。该库还为所有模型的推理结果可视化提供了流畅的定制,包括标准方法(直接网络运行)和独特的基于补丁的变体。模型支持:该库提供对多个超解析深......