Linux下使用tc模拟网络延迟和丢包


模拟延迟传输简介

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(非随到随发):可能会延迟一段时间再将一个包发送出去,以达到期望的带宽 。这意味着它们有时即使有能力发送,也不会发送。

延迟

  1. 延迟

    1
    2
    # eth0 网卡的传输设置为延迟 100 毫秒发送
    tc qdisc add dev eth0 root netem delay 100ms
  2. 延迟+抖动

    1
    2
    # eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送
    tc qdisc add dev eth0 root netem delay 100ms 10ms
  3. 延迟+抖动+随机

    1
    2
    # eth0 网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送
    tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

丢包

  1. 丢包

    1
    2
    # eth0 网卡的传输设置为随机丢掉 1% 的数据包
    tc qdisc add dev eth0 root netem loss 1%
  2. 丢包+随机

    1
    2
    # eth0 网卡的传输设置为随机丢掉 1% 的数据包,成功率为 30%
    tc qdisc add dev eth0 root netem loss 1% 30%

包重复

  1. 重复数据包

    1
    2
    # eth0 网卡的传输设置为随机产生 1% 的重复数据包
    tc qdisc add dev eth0 root netem duplicate 1%

包损坏

  1. 数据包损坏(内核版本需在 2.6.16 以上)

    1
    2
    # eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包 
    tc qdisc add dev eth0 root netem corrupt 0.2%

包乱序

  1. 数据包乱序

    1
    2
    3
    4
    # 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

查看

  1. 查看配置

    1
    tc qdisc show dev eth0

删除

  1. 删除配置

    1
    2
    # 删除 eth0 网卡的相关传输配置
    tc qdisc del dev eth0 XXXXXXXXXXX(自己加的配置)

  目录