弱网测试:使用netem模拟网络延迟丢包损坏重复和乱序等网络问题

Posted 林哥小站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了弱网测试:使用netem模拟网络延迟丢包损坏重复和乱序等网络问题相关的知识,希望对你有一定的参考价值。

本文目录

NetEm 是Linux的TC(traffic control)下的那个增强工具,使用这个工具可以在指定的网卡的发送方向上,注入网络延迟、丢包、重复、损坏和乱序等,用于在性能良好的局域网中,模拟出广域网中复杂的网络问题。 值得注意的是NetEm的规则是在指定网卡上生效的,所以所有从指定网卡发出的报文都会受到NetEm指定规则的影响。

NetEm借助于tc的qdisc框架,配置到网卡上,支持的命令格式如下(注意:一般来说netem要在root权限下配置)

   tc qdisc ... dev DEVICE ] add netem OPTIONS
   OPTIONS := [ LIMIT ] [ DELAY ] [ LOSS ] [ CORRUPT ] [ DUPLICATION ] [ REORDERING ] [ RATE ] [ SLOT ]

NetEm支持LIMIT, DELAY, LOSS, CORRUPT, DUPLICATION, REORDERING, RATE, SLOT这几种选项,下面会挨个详细介绍。

1、延时—Delay

设置延时的命令如下所示:

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

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

  1. TIME:延迟的时间
  2. JITTER:抖动,增加一个随机时间长度,让延迟时间出现在某个范围
  3. CORRELATION:相关,下一个报文延迟时间和上一个报文的相关系数
  4. distribution:分布,延迟的分布模式,可以选择的值有 uniform、normal、pareto 和 paretonormal
  • delay
    通过些命令,可以在指定网卡的发送方向上给发送出去的报文设置一个指定的延时,这个延时值(TIME)可以是固定的,也可以在固定值的基础上设置一个抖动(JITTER)和一个相关性(CORRELATION)(网络延时的变化应该是平滑的,则相邻的报文的延时应该是大小变化不大的,而不是突变的,100%表示前后完全相关,即无抖动的固定延时,0%表示完全不相关,则延时是完全随机的,相邻报文之间的延时没有任何相关性)。延时和抖动的单位是ms,而相关性是个百分数。

  • distribution
    可以通过这个参数配置延时的分布状态,不使用这个配置时,默认为Normal配置,延时的分布会符合正态分布,但因为受网络里流量类型不同的影响,延时分布可能用不同的分布状态,所以除了默认的Normal之外,NetEm同时不提供了uniform, pareto和paretonormal供用户选择。

使用例子如下:

1.1、enp2s0 网卡上增加100ms延时

tc qdisc add dev enp2s0 root netem delay 100ms

1.2、enp2s0 网卡上增加100ms ± 20ms的延时(80ms到120ms)

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

1.3、enp2s0 网卡上增加100ms ± 20ms的延时(80ms到120ms),并且设置相关系数为50%

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

1.4、enp2s0 网卡上增加100ms ± 20ms的延时(80ms到120ms),报文延时分布满足正态分布

tc qdisc add dev enp2s0 root netem delay 100ms 20ms distribution normal

2、丢包率—loss

设置丢包的命令如下所示:

       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参数都是可选参数。

  • loss random
    设置本网卡发送数据报文的丢包率(用百分比来表示),同样也支持相关性配置(这里相关性配置强烈不推荐使用,因为在使用过程中发现了一些影响测试结果的表现)。

  • loss state
    adds packet losses according to the 4-state Markov using the transition probabilities as input parameters. The parameter p13 is mandatory and if used alone corresponds to the Bernoulli model. The optional parameters allows to extend the model to 2-state (p31), 3-state (p23 and p32) and 4-state (p14). State 1 corresponds to good reception, State 4 to independent losses, State 3 to burst losses and State 2 to good reception within a burst.

  • loss gemodel
    adds packet losses according to the Gilbert-Elliot loss model or its special cases (Gilbert, Simple Gilbert and Bernoulli). To use the Bernoulli model, the only needed parameter is p while the others will be set to the default values r=1-p, 1-h=1 and 1-k=0. The parameters needed for the Simple Gilbert model are two (p and r), while three parameters (p, r, 1-h) are needed for the Gilbert model and four (p, r, 1-h and 1-k) are needed for the Gilbert-Elliot model. As known, p and r are the transition probabilities between the bad and the good states, 1-h is the loss probability in the bad state and 1-k is the loss probability in the good state.

使用例子如下:

2.1、enp2s0 网卡模拟发送的报文有 16% 的丢包率

tc qdisc add dev eth0 root netem loss 16%

2.2、enp2s0 网卡模拟发送的报文使用loss state/loss gemodel模型进行丢包

4-state Markov 模型 和 Gilbert-Elliot 丢包模型一般使用不多,待更新

2.3、enp2s0 网卡模拟发送的报文选用loss state/loss gemodel模型进行丢包时的enc选项

can be used optionally to mark packets instead of dropping them. A loss model has to be used for this to be enabled.待更新

3、损坏/错误报文—corrupt

设置损坏/错误的命令如下所示:

       CORRUPT := corrupt PERCENT [ CORRELATION ]]

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

  • corrupt PERCENT
    按PERCENT指定的百分比随机选定的报文中模拟随机噪声在报文随机的位置引入错误。
  • CORRELATION
    同样支持相关系数。0%表示完全不相关,是完全随机的,而100%是完全相关。

使用例子如下:

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

tc qdisc add dev enp2s0 root netem corrupt 25%

4、重复报文—duplicate

设置重复报文的命令如下所示:

       DUPLICATION := duplicate PERCENT [ CORRELATION ]]

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

  • duplicate PERCENT
    按PERCENT指定的百分比随机选定的报文相应的产生一组重复报文
  • CORRELATION
    同样支持相关系数。0%表示完全不相关,是完全随机的,而100%是完全相关。

使用例子如下:

4.1、enp2s0 网卡模拟发送的报文中随机选取 25%产生重复报文

tc  qdisc  add  dev  eth0  enp2s0  netem  duplicate 25%

5、乱序—reorder

设置重复报文的命令如下所示:

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

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

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

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

     要使用乱序,则必须要同时配置一个延时(这个很好理解,本该在前面的报文延时了,后面的报文先发,才会产生乱序)。通常有以下二种方式来配置乱序(以延时10ms做为前提).
    
  • reorder 90% gap 5
    在这里,最开始4个报文(4= gap - 1)延时10ms, 接下去的下一个报文(第5个报文)以90%的可能性(就是说第5个报文有90%的可能性会被立刻发送)会被立刻发送(第5个报文有10%的可能性会被延时10ms发送),同样也支持相关系数。在产生了一个乱序的包后(上面第5个报文如果被立刻发送了,那么因为只有第5个包没有被延时,那第它就是一个乱序的包) ,立刻重复上述流程(将再接下去的4个报文延时10ms, 再接下去的第5个报文有90%的可能性立刻发送,就有90%的可能性产生一个乱序包)。注意:如果你需要 100%的每5个包,产生一个乱序包,则可以将可能性设置成100%。

  • reorder 25%
    25%的包被立刻发送,其它75%的包被延时10ms以产生乱序。

使用例子如下:

5.1、enp2s0 网卡模拟发送的报文中每5个报文就产生一个乱序包

这里100%可以设置成0-100%,那么系统将以指定的概率来生产一个乱序包,如果不到100%则生产乱序的规则见上面说明,只有100%的情况 下,才是稳定的每5个包,产生一个乱序。gap值也可以按需要进行修改。

root@xxx-pc:/home/xxx# tc qdisc add dev enp2s0 root netem delay 20ms reorder 100% gap 5

5.2、enp2s0 网卡模拟发送的报文中以50%的概率完全随机产生乱序包

在不设置相关系数和gap的情况下,系统会以指定的概论完全随机的产生乱序包

root@xxx-pc:/home/xxx# tc qdisc add dev enp2s0 root netem delay 20ms reorder 50% 

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

待更新

7、基于报文长度的限速—rate

待更新

8、基于时间窗的延时与限速—slot

待更新

tc和netem模拟动态网络

        Netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能。例如:低带宽、传输延迟、丢包等等情况。

        TC 是 Linux 系统中的一个用户态工具,全名为 Traffic Control (流量控制)。TC 可以用来控制 Netem 模块的工作模式,也就是说如果想使用 Netem 需要至少两个条件,一是内核中的 Netem 模块被启用,另一个是要有对应的用户态工具 TC 。

        举例:增删改网络参数,delay和loss可以合并设置(如下),也可以分开设置

# 延迟 300ms ± 100ms, 丢包率 5%
sudo tc qdisc add dev eth0 root netem delay 300ms 100ms loss 5%
sudo tc qdisc del dev eth0 root netem delay 300ms 100ms loss 5%
sudo tc qdisc change dev eth0 root netem delay 300ms 100ms loss 5%

 参考:Linux 模拟网络丢包和延迟命令_fuyuande的博客-CSDN博客_linux网络延时命令

以上是关于弱网测试:使用netem模拟网络延迟丢包损坏重复和乱序等网络问题的主要内容,如果未能解决你的问题,请参考以下文章

linux 下使用 tc 模拟网络延迟和丢包

linux 下使用 tc 模拟网络延迟和丢包

linux 下使用 tc 模拟网络延迟和丢包-使用 linux 模拟广域网延迟 - Emulating wide area network delays with Linux

linux 下使用 tc 模拟网络延迟和丢包

tc和netem模拟动态网络

弱网测试