网络故障 之二 tc和netem

一、介绍

     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)

 

posted @ 2024-05-24 09:09  夏之夜  阅读(31)  评论(0编辑  收藏  举报