基于TC和netem实现网络异常情况的模拟
背景
笔者最近在对一个公网传输方案做测试时,需要模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等)。惊喜地发现,Linux原生已经集成了TC和netem这对组合,只需要几个命令即可快速地实现上述功能。
TC简介
Linux内核内置了一个TC(Traffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制:
TC可以实现的功能是非常丰富的,但本身也是比较复杂,感兴趣的同学可以看下赵亚大神的相关文章。
所以在网络异常模拟场景下,我们更偏向于直接使用TC控制netem来便捷地实现相关功能。
netem简介
netem是linux内核提供的Network emulation服务,可以用来模拟广域网下的延迟、丢包、重复、损坏和乱序等问题。
2.6版本后的linux发行版都已经在内核中启用了netem,netem内核组件在以下情况下启用:
代码语言:txt复制 Networking -->
Networking Options -->
QoS and/or fair queuing -->
Network emulator
重要:netem 是直接添加到网卡上的,也就是说所有从网卡发送出去的包都会收到配置参数的影响!
假如需要回退到正常情况,请谨记下面这个命令:
代码语言:txt复制# 删除 eth0网卡之前添加的netem配置
tc qdisc del dev eth0 root
netem延迟设置
代码语言:txt复制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模拟丢包设置
代码语言:txt复制# 发送的报文有 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模拟报文重复损坏设置
代码语言:txt复制# 随机产生 50% 重复的包
# tc qdisc change dev eth0 root netem loss 50% # 原错误命令
tc qdisc change dev eth0 root netem duplicate 50%
# 随机产生 2% 损坏的报文(在报文的随机位置造成一个比特的错误)
tc qdisc change dev eth0 root netem corrupt 2%
netem模拟包乱序
网络传输并不能保证顺序,传输层 TCP 会对报文进行重组保证顺序,所以报文乱序对应用的影响比上面的几种问题要小。
代码语言:txt复制# 固定的每隔一定数量的报文就乱序一次
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