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

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

netem利用已经内置于Linux和用户空间实用程序中的function来模拟networking。 这实际上是马克的答案所指的,用不同的名字。

在他们的主页上的例子已经显示了你可以如何实现你所要求的:

例子

模拟广域网延迟

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

 # tc qdisc add dev eth0 root netem delay 100ms 

现在一个简单的pingtesting在本地networking上应该显示增加100毫秒。 延迟受内核时钟分辨率(Hz)的限制。 在大多数2.4系统中,系统时钟以100Hz运行,允许延迟10ms。 在2.6上,该值是一个从1000到100 Hz的configuration参数。

后面的例子只是改变参数而不重载qdisc

真正的广域网显示变化,所以可以添加随机变化。

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

这导致增加的延迟为100±10毫秒。 networking延迟的变化不是纯粹的随机的,所以要模拟一个相关值。

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

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

延迟分配

通常,networking中的延迟是不统一的。 使用类似正态分布的东西来描述延迟的变化更为常见。 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% 

这导致百分之十分之一(即1000个中的一个)被随机丢弃。

可选的关联也可以被添加。 这使得随机数发生器的随机性较小,可以用来模拟分组丢失。

 # 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错误的RTNETLINK answers: No such file or directory

对于丢弃的数据包,我只需使用iptables和统计模块 。

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

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

看看男人iptables和search“统计”的更多信息。

我的一个同事使用tc来做到这一点。 有关更多信息,请参阅手册页。 你可以在这里看到它的用法的一个例子。

iptables(8)有一个统计模块,可以用来匹配每个第n个数据包。 要丢弃这个数据包,只需追加-j DROP即可

关于networking物理仿真的这个教程在 示例代码中包含一个C ++类,用于模拟UDP连接中的延迟和数据包丢失,可能是一个指导。 请参阅可下载源代码的Connection.h文件中的Connection类的公共延迟packetLossvariables。

还没有自己尝试过,但是这个页面有一个插件模块列表,可以在Linux内置的iptables IP过滤系统中运行。 其中一个模块被称为“nth”,并允许您设置一个规则,将丢弃一个可configuration的数据包速率。 至less可以成为一个很好的起点。

DummyNet是科学界最常用的工具之一。 一旦你安装了ipfw内核模块,为了在两台机器之间引入50ms传播延迟,只需运行这些命令:

 ./ipfw pipe 1 config delay 50ms ./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2 

为了还要引入50%的数据包丢失,您必须运行:

 ./ipfw pipe 1 config plr 0.5 

这里有更多细节。

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

  • 总networking分区
  • 远程服务死了(不听预期的端口)
  • 延误
  • 数据包丢失-TCP连接超时(当两个系统由状态防火墙分隔时,经常发生)