15

我正在寻找一种将网络仿真添加到套接字的方法。

基本的解决方案是通过某种方式为连接增加带宽限制。

对我来说理想的解决方案是:

  • 支持高级网络属性(延迟、丢包)
  • 开源
  • 具有与标准套接字类似的 API(或环绕它们)
  • 在 Windows 和 Linux 上工作
  • 支持 IPv4 和 IPv6

我看到了一些在系统级别上工作的选项,甚至作为代理(Dummynet、WANem、neten 等),但这对我不起作用,因为我希望能够手动模拟每个套接字(例如,开一个模拟modem的socket,一个模拟3G的socket。基本上我想知道这些工具是怎么做的。

编辑:我需要将此功能嵌入到我自己的产品中,因此使用额外的盒子或需要手动配置的第三方工具是不可接受的。我想编写与那些工具做同样事情的代码,我的问题是如何去做。

结语:事后看来,我的问题有点误导。显然,没有办法直接在套接字上做我想做的事。有两种选择:

为发送/接收操作添加延迟(基于@PaulCoccoli's answer):
通过在发送和接收之前添加延迟,您可以获得非常粗略的网络模拟(延迟的恒定延迟,延迟发送,每次发送不超过 X 字节第二,带宽)。
保罗的回答和评论给了我很大的启发,所以我奖励了他。

添加网络模拟逻辑作为代理(基于@m0she 等人
的回答):要么通过代理发送请求,要么使用代理拦截请求,然后添加所需的模拟。然而,使用现成的解决方案而不是编写自己的代理实现更有意义——据我所知, Dummynet可能是最好的选择(这就是webpagetest.org 所做的)。其他选项在下面的答案中,我还会添加DonsProxy
这是更好的方法,所以我接受这个答案。

4

8 回答 8

6

您可以将代理编译到您的软件中来执行此操作。它可以是完全成熟的 socks 代理的一些实现(如this),或者可能更好,更简单的只为您的目的服务(并且不需要在您的通信前加上目的地和其他 socks 开销)。该代码可以作为单独的进程或进程中的线程运行。

向代理添加限制应该不会太难。你可以:

  • 如果超过某些带宽限制,则延迟数据转发
  • 通过在缓冲区的读/写操作之前添加计时器来增加延迟。
  • 如果您使用基于连接的协议(如 TCP),丢弃数据包将毫无意义,但使用基于数据报的协议(UDP)也很容易实现。

连接创建 API 会与普通的 posix/winsock 有点不同(除非你做一些宏或其他魔法),但其他一切(发送/接收/选择/关闭/等等)都是一样的。

于 2012-07-12T16:11:53.587 回答
6

如果您要将它构建到您的产品中,那么您应该在套接字 API 上实现一个抽象层,以便您可以在运行时选择自己的实现。或者,您可以实现每个套接字函数的包装器,并选择是调用自己的版本还是系统的版本。

至于增加延迟,您可以让套接字 API 的实现脱离线程。在那个线程中,有一个按时间排序的优先级队列(即这个后台线程进行非常基本的离散事件模拟)。您发送或接收的每个“数据包”都可以与交付时间一起排队。每个交货时间都应该增加一些延迟。我会使用某种具有高斯分布的随机数生成器。

后台线程还必须模拟连接的另一端,尽管听起来您可能已经实现了那部分?

于 2012-07-13T18:55:11.700 回答
2

我只知道 Mac OS X Lion 的网络链接调节器。你应该是 mac 开发者才能下载它,所以我不能把下载链接放在那里。仅来自 9to5mac.com 的描述:http: //9to5mac.com/2011/08/10/new-in-os-x-lion-network-link-conditioner-utility-lets-you-simulate-internet-and-bandwidth -条件/

于 2012-06-27T11:06:19.223 回答
2

在使用 linux 时,此答案可能是您的部分解决方案: Simulate delayed and dropped packet on Linux。它指的是一个名为netem的内核模块,可以模拟各种网络问题。

如果您想使用 TCP 连接,“数据包丢失”可能会有问题,因为许多错误处理(如恢复丢失的数据包)是在内核中完成的。以跨平台的方式进行模拟可能很困难。

于 2012-06-27T15:30:31.833 回答
1

您通常会在网络中添加一个网络设备来限制带宽或延迟,逐个端口,然后您可以通过连接到分配给您要测试的特定类型的糟糕网络的端口来实现您想要的,使用无需更改或修改代码。

最简单的方法就是将 iptables 规则添加到充当代理的 Linux 服务器。

如果您希望它在没有单独设备的情况下工作,请尝试使用 tricle,这是一个可以在客户端 PC 上限制您的网络的软件包。(或对于 Windows

于 2012-06-27T14:53:52.847 回答
1

您可能想查看 WANem http://wanem.sourceforge.net/。WANEM 是开源的,并根据 GNU 通用公共许可证获得许可。

WANem 允许应用程序开发团队设置一个透明的应用程序网关,可用于模拟 WAN 特性,如网络延迟、数据包丢失、数据包损坏、断开连接、数据包重新排序、抖动等。

于 2012-07-13T15:43:18.837 回答
1

如果您想要一个您可以控制的纯软件解决方案,您必须自己实现它。我知道没有这样的现有软件包。

虽然套接字上的包装层可能使您能够引入延迟,但引入丢失或无序交付是不够的。为了模拟这些活动,您实际上需要拦截两个 TCP 堆栈之间传输的数据。

我推荐的方法是使用隧道设备(比如tunX)。应该设置路由,以便客户端相信到服务器的方式是通过tunX。额外的代码(可能在不同的线程中运行)会在通过真正的物理接口转发数据包之前混杂地拦截 上的流量tunX,并执行您的增强行为,从而将流量发送到您的服务器。从物理接口上的服务器到达的数据包会发生相反的情况。这些数据包将被客户端代码拦截,行为增强,然后通过tunX.

但是,由于您正在测试客户端软件,我不清楚您为什么要将此代码嵌入到您发布的软件中,除非软件本身是 WAN 模拟客户端。

于 2012-07-16T18:58:42.220 回答
1

我认为您可以使用Network Simulator 之类的工具。它是免费的,适用于 Windows。

唯一要做的就是设置您的程序以使用正确的端口(当然还有网络设置)。

于 2012-07-18T09:00:39.787 回答