在Linux上模拟延迟和丢弃的数据包

时间:2009-03-05 13:43:58

标签: linux tcp throttling

我想在Linux上模拟UDPTCP的数据包延迟和丢失,以衡量应用程序的性能。有一种简单的方法可以做到这一点吗?

8 个答案:

答案 0 :(得分:296)

netem利用已经内置在Linux和用户空间实用程序中的功能来模拟网络。这实际上是马克的答案所指的不同名称。

their homepage上的示例已经展示了如何实现您的要求:

  

实施例

     

模拟广域网延迟

     

这是最简单的例子,它只是为从本地以太网发出的所有数据包增加了一定量的延迟。

# tc qdisc add dev eth0 root netem delay 100ms
     

现在,在本地网络上进行主机的简单ping测试应显示增加100毫秒。延迟受内核时钟分辨率(Hz)的限制。在大多数2.4系统中,系统时钟以100 Hz运行,允许延迟增量为10 ms。在2.6上,该值是1000到100 Hz的配置参数。

     

后面的示例只是更改参数而不重新加载qdisc

     

真正的广域网显示出可变性,因此可以添加随机变化。

# tc qdisc change dev eth0 root netem delay 100ms 10ms
     

这导致增加的延迟为100±10 ms。网络延迟变化不是纯粹随机的,因此要模拟相关值。

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
     

这导致增加的延迟为100±10 ms,下一个随机元素取决于最后一个随机元素的25%。这不是真正的统计相关性,而是近似值。

     

延迟分发

     

通常,网络中的延迟不均匀。使用类似正态分布的东西来描述延迟的变化更为常见。 netem规则可以采用表格来指定非均匀分布。

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
     

实际表(normal,pareto,paretonormal)作为iproute2编译的一部分生成并放在/ usr / lib / tc中;所以可以通过一些努力根据实验数据进行自己的分发。

     

丢包

     

随机数据包丢失在'tc'命令中以百分比形式指定。最小可能的非零值是:

     

2 -32 = 0.0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%
     

这导致1/10百分比(即1000个中的1个)数据包被随机丢弃。

     

还可以添加可选的关联。这会使随机数发生器的随机性降低,并可用于模拟数据包突发丢失。

# tc qdisc change dev eth0 root netem loss 0.3% 25%
     

这将导致0.3%的数据包丢失,并且每个连续概率取决于最后一个数据包的四分之一。

     

Prob n = 0.25×Prob n-1 + 0.75×Random

注意如果您没有该接口的规则,则应使用tc qdisc add;如果您已有该接口的规则,则应使用tc qdisc change。尝试在没有规则的界面上使用tc qdisc change会出现错误 RTNETLINK answers: No such file or directory

答案 1 :(得分:78)

对于丢弃的数据包,我只需使用iptables和statistic module

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

以上将以1%的概率丢弃传入的数据包。要小心,大约0.14以上的任何东西,大多数人tcp连接很可能完全停止。

查看man iptables并搜索“statistic”以获取更多信息。

答案 2 :(得分:7)

我的一位同事使用tc来做到这一点。有关更多信息,请参见手册页。您可以看到其使用情况的示例here

答案 3 :(得分:5)

iptables(8)有一个统计模块,可用于匹配每个第n个数据包。要删除此数据包,只需附加 -j DROP

答案 4 :(得分:3)

tutorial on networking physics simulations包含sample code中的C ++类,用于模拟UDP连接中的延迟和数据包丢失,可能具有指导意义。请参阅{{Connection> 文件中找到的 Connection 类的公共延迟 packetLoss 变量{{ 3}}

答案 5 :(得分:1)

我自己没有尝试过,但this page有一个插件模块列表,这些模块在Linux内置的iptables IP过滤系统中运行。其中一个模块称为“nth”,允许您设置一个规则,该规则将丢弃可配置的数据包速率。至少可能是一个好的开始。

答案 6 :(得分:1)

您可以尝试http://snad.ncsl.nist.gov/nistnet/ 这是一个非常古老的NIST项目(2005年最后一个版本),但它对我有用。

答案 7 :(得分:1)

易于使用的网络故障注入工具是Saboteur。它可以模拟:

  
      
  • 总网络分区
  •   
  • 远程服务已停止(未在预期端口上侦听)
  •   
  • 时滞
  •   
  • 数据包丢失   -TCP连接超时(通常在两个系统被状态防火墙隔开时发生)
  •