模拟慢速互联网连接

我知道这是个奇怪的问题。因为我通常基于“假设”所有用户的网络连接都很慢来开发应用程序。但是,有没有人认为有一种方法可以通过编程模拟慢速互联网连接,这样我就可以“看到”应用程序在不同“连接速度”下的表现?

我不担心使用哪种语言。我不是在寻找代码示例或其他东西,只是对它背后的逻辑感兴趣。

157615 次浏览

如果你运行的是windows, 提琴手是一个很好的工具。它有一个模拟调制解调器速度的设置,对于想要更多控制的人有插件为每个请求添加延迟

我更喜欢使用这样的工具,而不是在我的应用程序中放置延迟代码,因为它是一个更真实的模拟,而且不需要我设计或编码实际的比特。最好的代码是我不需要写的代码。

添加:这篇在Pavel Donchev的软件技术博客上的文章展示了如何创建自定义模拟速度:

你可以尝试Dummynet,它可以模拟队列和带宽限制、延迟、包丢失和多路径效应

现在有一些TCP代理,比如iprelay和草率,它们可以进行带宽整形来模拟慢速连接。您还可以使用ipfw和iptables等IP过滤工具进行带宽整形和模拟丢包。

使用具有节流功能的web调试代理,如Charles或提琴手

你会发现它们在一般的web开发中很有用。主要的区别是Charles是共享软件,而Fiddler是免费的。

我正在使用http://www.netlimiter.com/,它工作得非常好。不仅限制单个进程的速度,而且还显示实际的传输速率。

使用像TCPMon这样的工具。它可以假装连接很慢。

基本上,你向它请求完全相同的东西,它只是将完全相同的请求转发给真实服务器,然后仅用设置的字节数延迟响应。

此外,为了在某些*nix上模拟慢速连接,您可以尝试使用andy downs表示。更多信息由Ben Newman在Quora上的回答提供问题

还有另一个工具叫做WIPFW - http://wipfw.sourceforge.net/

这有点老派,但您可以使用它来模拟较慢的连接。它是基于Windows的,该工具允许管理员监控路由器从某台机器接收了多少流量,或者它转发了多少WWW流量。

Chrome 38开始,你可以在没有任何插件的情况下做到这一点。只需点击inspect element(或F12热键),然后点击“toggle device mod”enter image description here,你会看到如下内容:

enter image description here

在许多其他功能中,它允许您模拟特定的互联网连接(3G, GPRS)

注:为那些试图限制上传速度的人。遗憾的是,目前这是不可能的。

P.S.2现在你不需要切换任何东西。节流面板可从网络面板。enter image description here

注意,当点击没有节流时,你可以创建你的自定义节流选项。

enter image description here

在Linux机器上,你可以使用wondershaper

apt-get install wondershaper


$ sudo wondershaper {interface} {down} {up}

{down}和{up}是KPBS中的带宽

例如,如果你想限制接口eth1的上行带宽为256kbps,下行带宽为128kbps,

$ sudo wondershaper eth1 256 128

为了清除极限,

$ sudo wondershaper clear eth1

Mac OSX从10.10开始有一个名为Murus防火墙的应用程序,它作为pf的GUI,替换ipfw。

它适用于系统范围或特定领域的节流。我只能用它把我的下载速度在300Kbps到30Mbps之间滑动,以测试流媒体视频播放器是如何调整的。

你可以使用NetEm(网络仿真)作为代理服务器模拟许多网络特征(速度、延迟、丢包等)。它使用iproute2包控制网络,在大多数Linux发行版的内核中都启用了它。

它由tc命令行应用程序(来自iproute2包)控制,但也有一些用于NetEm的web界面gui,例如PHPnetemGUI2

优点是,正如我所写的,它不仅可以模拟不同的网络速度,而且还可以,例如,包丢失复制和/或腐败随机或定义延迟等,所以除了缓慢的连接,你还可以模拟各种性能较差的网络和传输错误。

对于您的应用程序,它是绝对透明的,您可以配置操作系统使用NetEm作为代理服务器,因此来自该机器的所有连接都将通过它路由。或者,您可以只配置一个特定的应用程序来使用该代理。

我一直在用它在各种模拟的低性能网络上测试Android应用程序的性能。

更新这个问题(9年之后)作为我正在寻找的答案,并没有提到:

Firefox也有限制连接速度的预设。在开发工具的网络监控选项卡中找到它们。默认为“不节流”。

最慢的是GPRS (下载速度:50kbps,上传速度:20kbps,最小延迟(ms): 500),范围从“良好”和“常规”2G、3G和4G到DSL和无线网络 (下载速度:30Mbps,上传速度:15Mbps,最小延迟(ms): 2)。

更多在开发工具文档

对于Linux,下面的论文列表可能会有用:

就我个人而言,虽然Dummynet很好,但我发现没多大对我的用例来说是最通用的;我通常对延迟的影响感兴趣,而不是带宽(即WiFi连接问题),而且它非常容易模拟随机数据包丢失/损坏等。它也很容易访问,而且是免费的(不像基于硬件的Linktropy)。

顺便说一句,对于Windows, 笨手笨脚非常棒。我还想补充一点(关于网站),浏览器节流并不是模拟现实网络问题的准确方法(我认为“TKK”评论了上面的一些原因)。

希望这能帮助到一些人!

塑造单个TCP连接的一种常见情况实际上可以按照UNIX方式由socatcpipe的对偶组合而成,如下所示:

socat TCP-LISTEN:5555,reuseaddr,reuseport,fork SYSTEM:'cpipe -ngr -b 1 -s 10 | socat - "TCP:localhost:5000" | cpipe -ngr -b 1 -s 300'

这模拟了一个带宽约为300kB/s的连接,你的服务在:5000上的带宽约为10kB/s,并在:5555上监听传入的连接。警告:注意这个在每个连接,所以每个单独的TCP连接都得到这个量。

< p >解释: 外层(左)socat监听:5555上的给定选项作为分叉服务器。然后,SYSTEM:...选项中的第一个cpipe命令将经过套接字:5555(并且来自第一个外层socat)的数据限制为最多10kByte/s。然后,该数据使用另一个socat转发,该socat连接到localhost:5000(你想要减慢的服务应该正在侦听)。然后将数据:55550 localhost:5000放入右边的cpipe命令中,该命令(使用给定的值)将其限制为大约300kB/s

选项-ngrcpipe很重要。它导致cpipe非贪婪地从其输入文件描述符中读取。否则,您可能会遇到缓冲区中的数据未被转发并等待回复的情况。

使用更常见的buffer工具而不是cpipe也是可能的。

(工作人员:这是基于“双tee”配方由Christophe Loor从socat文档)

有一种简单实用的方法可以做到这一点,不需要任何应用程序或代码。只需使用移动热点连接到互联网。保持热点(手机)远离连接的设备,以模拟较慢的网络。😉