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

栏目: 服务器 · Linux · 发布时间: 6年前

内容简介:笔者最近在对一个公网传输方案做测试时,需要模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等)。惊喜地发现,Linux原生已经集成了TC和netem这对组合,只需要几个命令即可快速地实现上述功能。Linux内核内置了一个TC(Traffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制:TC可以实现的功能是非常丰富的,但本身也是比较复杂,感兴趣的同学可以看下赵亚大神的相关文章。

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

背景

笔者最近在对一个公网传输方案做测试时,需要模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等)。惊喜地发现,Linux原生已经集成了TC和netem这对组合,只需要几个命令即可快速地实现上述功能。

TC简介

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

image.png

TC可以实现的功能是非常丰富的,但本身也是比较复杂,感兴趣的同学可以看下赵亚大神的相关文章。

所以在网络异常模拟场景下,我们更偏向于直接使用TC控制netem来便捷地实现相关功能。

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

其他工具

  • wondershaper
  • comcast
  • Netfilter

参考:

https://wiki.linuxfoundation.org/networking/netem

https://blog.csdn.net/dog250/article/details/40483627


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从零开始学微信公众号运营推广

从零开始学微信公众号运营推广

叶龙 / 清华大学出版社 / 2017-6-1 / 39.80

本书是丛书的第2本,具体内容如下。 第1章 运营者入门——选择、注册和认证 第2章 变现和赚钱——如何从0到100万 第3章 决定打开率——标题的取名和优化 第4章 决定美观度——图片的选取和优化 第5章 决定停留率——正文的编辑和优化 第6章 决定欣赏率——版式的编辑和优化 第7章 数据的分析——用户内容的精准营销 书中从微信运营入门开始,以商业变......一起来看看 《从零开始学微信公众号运营推广》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换