【问题标题】:Simulate network conditions with a C/C++ Socket使用 C/C++ Socket 模拟网络条件
【发布时间】:2012-06-28 17:07:48
【问题描述】:

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

基本的解决方案是为连接增加带宽限制。

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

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

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

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

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

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

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

【问题讨论】:

  • 这是一个 C++ 应用程序,虽然你是对的 - 套接字是 C(winsock 和 POSIX)
  • C 也没有套接字......操作系统提供的库有(带有 C 接口)。不要学究气... :)
  • @DrewHall - 这不是迂腐,这是有用的。基本上,这意味着我无法使用标准套接字库真正模拟不同的网络条件。那还有什么?
  • 你想给真实的网络流量增加延迟,还是只是模拟网络流量?
  • @PaulCoccoli - 我正在生成我需要的特定流量(充当客户端,向服务器发出请求)我希望服务器“感觉”就像处理连接速度很慢的客户端跨度>

标签: c++ sockets networking network-programming emulation


【解决方案1】:

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

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

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

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

【讨论】:

  • 这是一个有趣的想法,虽然如果我无论如何都需要为延迟编写代码,我可以直接在发送/接收数据的代码中编写它,我不需要代理那个(见@Paul Coccoli 的回答)
  • @yasei-no-umi - 这几乎就是我想要的。我认为代理解决方案实现起来更简单,对于熟悉winsock/posix socket API的人来说更方便,并且更解耦(例如让您将实现更改为外部进程,或第三方解决方案这将提供更复杂的节流功能。)
  • 我可以使用内置此功能的代理(如 Dummynet),而不是从头开始编写代理 - 我会根据所需的网络动态创建管道,并通过发送流量它。
【解决方案2】:

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

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

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

【讨论】:

  • 这是最接近我需要的,也是我最初想到的。我希望在框架/代码 sn-p 方面获得一些帮助,这将使它更容易和更准确,但我看起来我必须自己编写它。至于另一端,我正在考虑在接收端实现相同的想法(即在接收下一个缓冲区之前添加延迟)-我不想向另一端引入更改-这是我想要的服务器按原样测试。整个过程的目的是让服务器相信它正在与慢速客户端交互。
【解决方案3】:

我只知道 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-conditions/

【讨论】:

  • 谢谢,但不是我要找的 - 它在系统级别,我正在寻找较低级别(套接字)。另外,多平台是指 windows 和 linux,而不是 Mac
【解决方案4】:

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

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

【讨论】:

  • 丢包对我来说不是必须的,但以编程方式进行是 - 我无法安装或设置 netem。
【解决方案5】:

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

最简单的方法就是将add iptables rules 发送到充当代理的 Linux 服务器。

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

【讨论】:

  • 我希望此功能成为我产品的一部分,因此我无法安装/配置其他产品。基本上,我想知道,这些家伙是怎么做到的?
【解决方案6】:

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

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

【讨论】:

  • 我查看了 WANem(我什至在我的问题中提到了它),但这不是我想要的
【解决方案7】:

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

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

【讨论】:

  • 谢谢,但这对我不起作用。根据他们的常见问题解答-“此时,每个网络接口卡最多可以创建 32 个流。流仅在网络模拟器的 GUI 组件运行时才处于活动状态。”我需要比这更多的流程,并且需要以编程方式(而不是通过 UI)进行设置,Linux 也需要它。
【解决方案8】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多