模拟网络状况与C / C ++编程(Simulate network conditions with

2019-07-30 03:35发布

我正在寻找一种方式来网络仿真添加到插座。

基本的解决方案将是某种方式带宽限制添加到连接。

对我来说,理想的解决办法:

  • 支持先进的网络特性(延迟,分组丢失)
  • 开源
  • 有一个类似的API标准插座(或他们周围包裹)
  • 在Windows和Linux工作
  • 支持IPv4和IPv6

我看到,在系统级工作,甚至作为代理(Dummynet在,WANem,neten等)几个选项,但不会为我工作,因为我希望能够手动模拟每个插座(例如中,打开调制解调器仿真一个插座和一个与3G竞争。基本上,我想知道这些工具是如何做到这一点。

编辑:我需要在自己的产品中嵌入该功能,因此使用一个额外的对话框或第三方工具,需要手工配置是不能接受的。 我想编写的代码,做同样的事情,这些工具做的,我的问题是如何做到这一点。

结语:现在回想起来,我的问题是有点误导。 显然,没有办法做什么,我想直接在插座上。 有两个选项:

添加延迟发送/接收操作 (上@ PaulCoccoli的回答为基础):
通过添加发送和接收之前的延迟,就可以得到一个非常粗网络仿真(恒定延迟等待时间,延迟发送,以不发送超过每秒X字节,带宽)。
保罗的回答和评论都是很大的启发我,所以我要奖励他的奖金。

添加网络仿真逻辑作为代理 (基于@ m0she和其他人回答):
既可以通过代理发送请求,或使用代理拦截的请求,然后加入所需的仿真。 然而,更有意义,使用现成的解决方案,而不是写自己的代理实现的-从我所看到Dummynet在可能是最好的选择(这是webpagetest.org一样)。 其他选项是在下面的答案,我还将添加DonsProxy
这是更好的方式来做到这一点,所以我接受这个答案。

Answer 1:

你可以编译代理注入到你的软件,将做到这一点。 它可以是全功能的SOCKS代理(比如一些执行这个 ),或者可能会更好,更简单的东西,只会成为你的目的(并且不要求与目标等袜子开销前缀您的沟通)。 该代码可以作为一个单独的进程或你的进程中的一个线程运行。

添加节流到代理应该不会太难。 您可以:

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

连接创建API会从正常的POSIX / winsock的有点不同(除非你做一些宏观或其他魔法),但一切(发送/ recv的/选择/关闭/等)是一样的。



Answer 2:

如果你正在构建到你的产品这一点,那么你应该实现在抽象的套接字API层,所以你可以在运行时选择自己的实现。 或者,您可以实现每个插座功能的包装,并选择是否要打电话给你自己的版本或系统的版本。

至于增加的延迟,你可以有你的套接字API分拆一个线程的执行。 在该线程,有按时间排序优先级队列(即该后台线程做一个很基本的离散事件仿真)。 每个“包”您发送或接收可以用一个交货时间一起排队。 每次交付时间应该补充一定量的延迟。 我会用某种随机数发生器的高斯分布。

后台线程还必须模拟连接的另一端,虽然它听起来像你可能已经实施了一部分?



Answer 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 -条件/



Answer 4:

使用Linux时,这个答案可能是你的部分解决方案: 模拟延迟和Linux上丢弃的数据包 。 它指的是所谓的一个内核模块netem ,它可以模拟各种网络问题。

如果你想用的TCP连接的工作,有“丢包”,因为有很多的错误处理(如恢复丢失的包)的内核是做可能会有问题。 在跨平台的方式模拟,这可能是困难的。



Answer 5:

你通常的网络设备添加到您的网络节流的带宽或延迟,通过端口逐个端口上,就可以实现你想要的只是通过连接到分配给特定类型的要测试蹩脚的网络端口,用没有代码改变或修改必需的。

要做到这一点,最简单的办法是刚刚加入的iptables规则来充当代理Linux服务器。

如果你想让它没有独立的设备工作,尝试涓流是一个软件包,节流您的网络客户端PC上。 (或适用于Windows )



Answer 6:

你可能想检查WANem http://wanem.sourceforge.net/ 。 WANEM是开源和GNU通用公共许可证。

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



Answer 7:

我想你可以使用这样的工具网络仿真器 。 它是免费的,适用于Windows。

这样做的唯一的事情就是设置你使用正确的端口(和设置网络,当然)程序。



Answer 8:

如果你想有一个软件只能说明你控制的解决方案,你将不得不自己实现它。 我知道没有这样的现有包。

虽然通过套接字的包装层可以给你介绍延迟的能力,这将不足以引进失效或订单交付的。 为了模拟这些活动,你实际上需要两个TCP协议栈之间传输截取数据。

我建议的方法是使用隧道设备(说tunX )。 路由的设定应使客户相信的方式向服务器通过tunX 。 额外的代码(在不同的线程运行的可能)会胡乱拦截通信量上tunX ,并通过真实的物理接口,将让流量到你的服务器转发数据包之前执行的增强行为。 相反,会发生从物理接口上的服务器到达的数据包。 这些数据包会被客户端代码被截获,行为增强,通过转发前tunX

然而,由于要测试的客户端软件,我不清楚为什么你会想在发布的软件中嵌入该代码,除非软件本身就是一个WAN模拟客户端。



文章来源: Simulate network conditions with a C/C++ Socket