你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

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

2021/12/27 10:18:41

一、TC介绍

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

 

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

 

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

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

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

 

使用TC

在Linux中,流量控制都是通过TC这个工具来完成的。通常,要对网卡进行流量控制的配置,需要进行如下的步骤:

  • 为网卡配置一个队列;
  • 在该队列上建立分类;
  • 根据需要建立子队列和子分类;
  • 为每个分类建立过滤器。

具体命令参见https://blog.csdn.net/hexf9632/article/details/118568933

二、netem简介

netem是linux内核提供的Network emulation服务,可以用来模拟广域网下的延迟、丢包、重复、损坏和乱序等问题。2.6版本后的linux发行版都已经在内核中启用了netem,netem内核组件在以下情况下启用:

 

Networking -->

Networking Options -->

QoS and/or fair queuing -->

Network emulator

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

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

删除 eth0网卡之前添加的netem配置

 

tc qdisc del dev eth0 root

netem延迟设置

 

DELAY := delay TIME [ JITTER [ CORRELATION ]]]

[ distribution { uniform | normal | pareto | paretonormal } ]

TIME:延迟的时间

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

CORRELATION:相关,下一个报文延迟时间和上一个报文的相关系数

distribution:分布,延迟的分布模式,可以选择的值有 uniform、normal、pareto 和 paretonormal

 

# 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模拟丢包设置

 

# 发送的报文有 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模拟报文重复\损坏设置

 

# 随机产生 50% 重复的包

tc qdisc change dev eth0 root netem loss 50%

# 随机产生 2% 损坏的报文(在报文的随机位置造成一个比特的错误)

tc qdisc change dev eth0 root netem corrupt 2%

netem模拟包乱序

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

 

# 固定的每隔一定数量的报文就乱序一次

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

参考:

https://blog.csdn.net/u013128262/article/details/84784663

https://blog.csdn.net/hexf9632/article/details/118568933