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

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

一、TC介绍

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

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

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

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

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

使用TC

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

为网卡配置一个队列;

在该队列上建立分类;

根据需要建立子队列和子分类;

为每个分类建立过滤器。

具体命令参见Linux 下 TC 命令原理及详解<一>_tc命令详解-CSDN博客文章浏览阅读1w次,点赞17次,收藏86次。文章目录1 前言2 相关概念3 使用TC4 创建HTB队列5 为根队列创建相应的类别6 为各个类别设置过滤器7 复杂的实例1 前言众所周知,在互联网诞生之初都是各个高校和科研机构相互通讯,并没有网络流量控制方面的考虑和设计,IP协议的原则是尽可能好地为所有数据流服务,不同的数据流之间是平等的。然而多年的实践表明,这种原则并不是最理想的,有些数据流应该得到特别的照顾,比如,远程登录的交互数据流应该比数据下载有更高的优先级。针对不同的数据流采取不同的策略,这种可能性是存在的。并且,随着研究的发展和深入,_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

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打工人996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值