模拟延迟传输简介
netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。
需要注意的是:本文介绍的流控只能控制发包动作,不能控制收包动作,同时,它直接对物理接口生效,如果控制了物理的 eth0,那么逻辑网卡(比如 eth0:1)也会受到影响,反之,如果您在逻辑网卡上做控制,该控制可能是无效的。(注:虚拟机中的多个网卡可以在虚拟机中视为多个物理网卡)。
TC是什么
TC 全称 Traffic Control,是 Linux 内核提供的流量限速、整形和策略控制的机制。它利用一些队列规则来处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。TC 使用的队列规则分为两类,一类是无类别队列规则, 另一类是分类队列规则。 无类别队列规则相对简单,而分类队列规则则引出了分类和过滤器等概念,使其流量控制功能增强。在分布式系统实验中,通常用于对进出网卡的数据包进行控制,进而模拟网络延时和带宽。
流量的控制通常发生在输出网卡处,我们可以通过改变发送次序来控制传输速率。流量控制的一个基本概念是队列,每个网卡都与一个队列相联系,可以说,所有的流量控制都发生在队列中(没有入向队列)。
流量控制术语
- Scheduling(调度):判断某些包是不是要先于其他包发送出去,这个过程称为调度,也被成为 Reordering(重排序)。
- Shaping(整形):在包发送出去之前进行延迟处理,以达到预设的最大发送速率的过程。
- Policing(执行策略):延迟或丢弃包来达到预设带宽。
- Dropping(丢弃):如果流量超过设定带宽,则丢弃数据包,不管是入向还是出向。
- Work-Conserving(随到随发):只要有包可发送就立即发送。
- non-Work-Conserving(非随到随发):可能会延迟一段时间再将一个包发送出去,以达到期望的带宽 。这意味着它们有时即使有能力发送,也不会发送。
延迟
延迟
# eth0 网卡的传输设置为延迟 100 毫秒发送 tc qdisc add dev eth0 root netem delay 100ms
延迟+抖动
# eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送 tc qdisc add dev eth0 root netem delay 100ms 10ms
延迟+抖动+随机
# eth0 网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送 tc qdisc add dev eth0 root netem delay 100ms 10ms 30%
丢包
丢包
# eth0 网卡的传输设置为随机丢掉 1% 的数据包 tc qdisc add dev eth0 root netem loss 1%
丢包+随机
# eth0 网卡的传输设置为随机丢掉 1% 的数据包,成功率为 30% tc qdisc add dev eth0 root netem loss 1% 30%
包重复
- 重复数据包
# eth0 网卡的传输设置为随机产生 1% 的重复数据包 tc qdisc add dev eth0 root netem duplicate 1%
包损坏
- 数据包损坏(内核版本需在 2.6.16 以上)
# eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包 tc qdisc add dev eth0 root netem corrupt 0.2%
包乱序
- 数据包乱序
# eth0 网卡的传输设置为:有 25% 的数据包(50%相关)会被立即发送,其他的延迟10 秒 tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50% # 新版本中,如下命令也会在一定程度上打乱发包的次序 tc qdisc add dev eth0 root netem delay 100ms 10ms
查看
- 查看配置
tc qdisc show dev eth0
删除
- 删除配置
# 删除 eth0 网卡的相关传输配置 tc qdisc del dev eth0 XXXXXXXXXXX(自己加的配置)