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

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

内容简介:笔者最近在对一个公网传输方案做测试时,需要模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等)。惊喜地发现,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


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

查看所有标签

猜你喜欢:

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

疯狂又脆弱  坚定又柔软

疯狂又脆弱 坚定又柔软

朱墨 / 湖南文艺出版社 / 2018-3 / 39.80元

《疯狂又脆弱 坚定又柔软》是朱墨的一部作品集,介绍了作者考研到北京,工作在华谊,以及留学去英国的经历,在这短短几年中她一路升职加薪,25岁升任华谊宣传总监,27岁赚到人生的第一笔100万,30岁却毅然离职去英国留学,在表面的光鲜亮丽之下,她也曾付出过外人所不知道的心血和努力。她的人生告诉我们,每一个身居高位或者肆意潇洒的人,都曾为梦想疯狂地倾尽全力,而那些心怀梦想的人也总是怀揣一颗坚定又柔软的内心......一起来看看 《疯狂又脆弱 坚定又柔软》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具