内容简介:笔者最近在对一个公网传输方案做测试时,需要模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等)。惊喜地发现,Linux原生已经集成了TC和netem这对组合,只需要几个命令即可快速地实现上述功能。Linux内核内置了一个TC(Traffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制:TC可以实现的功能是非常丰富的,但本身也是比较复杂,感兴趣的同学可以看下赵亚大神的相关文章。
基于TC和netem实现网络异常情况的模拟
背景
笔者最近在对一个公网传输方案做测试时,需要模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等)。惊喜地发现,Linux原生已经集成了TC和netem这对组合,只需要几个命令即可快速地实现上述功能。
TC简介
Linux内核内置了一个TC(Traffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制:
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
参考:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何在零JS代码情况下实现一个实时聊天功能❓
- 何在不使用工作量证明的情况下实现公平且高效的提议
- 什么情况下不能使用最坏情况评估算法的复杂度?
- DevOps采用现状情况报告
- Unity版本使用情况统计
- Unity版本使用情况统计
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
疯狂又脆弱 坚定又柔软
朱墨 / 湖南文艺出版社 / 2018-3 / 39.80元
《疯狂又脆弱 坚定又柔软》是朱墨的一部作品集,介绍了作者考研到北京,工作在华谊,以及留学去英国的经历,在这短短几年中她一路升职加薪,25岁升任华谊宣传总监,27岁赚到人生的第一笔100万,30岁却毅然离职去英国留学,在表面的光鲜亮丽之下,她也曾付出过外人所不知道的心血和努力。她的人生告诉我们,每一个身居高位或者肆意潇洒的人,都曾为梦想疯狂地倾尽全力,而那些心怀梦想的人也总是怀揣一颗坚定又柔软的内心......一起来看看 《疯狂又脆弱 坚定又柔软》 这本书的介绍吧!