我知道这是个奇怪的问题。因为我通常基于“假设”所有用户的网络连接都很慢来开发应用程序。但是,有没有人认为有一种方法可以通过编程模拟慢速互联网连接,这样我就可以“看到”应用程序在不同“连接速度”下的表现?
我不担心使用哪种语言。我不是在寻找代码示例或其他东西,只是对它背后的逻辑感兴趣。
我知道这是个奇怪的问题。因为我通常基于“假设”所有用户的网络连接都很慢来开发应用程序。但是,有没有人认为有一种方法可以通过编程模拟慢速互联网连接,这样我就可以“看到”应用程序在不同“连接速度”下的表现?
我不担心使用哪种语言。我不是在寻找代码示例或其他东西,只是对它背后的逻辑感兴趣。
当前回答
现在有一些TCP代理,比如iprelay和草率,它们可以进行带宽整形来模拟慢速连接。您还可以使用ipfw和iptables等IP过滤工具进行带宽整形和模拟丢包。
其他回答
对于Linux,下面的论文列表可能会有用:
网络链路模拟器的比较研究(2009) KauNet:一个多功能灵活的仿真系统(2009) 《傻瓜网》(2010) 网络仿真器的测量精度和性能(2015)
就我个人而言,虽然Dummynet很好,但我发现NetEm对我的用例来说是最通用的;我通常对延迟的影响感兴趣,而不是带宽(即WiFi连接问题),而且它非常容易模拟随机数据包丢失/损坏等。它也很容易获得,而且是免费的(不像基于硬件的Linktropy)。
顺便说一句,对于Windows来说,笨笨是很棒的。我还想补充一点(关于网站),浏览器节流并不是模拟现实网络问题的准确方法(我认为“TKK”评论了上面的一些原因)。
希望这能帮助到一些人!
现在有一些TCP代理,比如iprelay和草率,它们可以进行带宽整形来模拟慢速连接。您还可以使用ipfw和iptables等IP过滤工具进行带宽整形和模拟丢包。
使用具有节流功能的web调试代理,如Charles或Fiddler。
你会发现它们在一般的web开发中很有用。主要的区别是Charles是共享软件,而Fiddler是免费的。
您可以使用NetEm(网络仿真)作为代理服务器来模拟许多网络特征(速度、延迟、包丢失等)。它使用iproute2包控制网络,在大多数Linux发行版的内核中都启用了它。
它由tc命令行应用程序控制(来自iproute2包),但也有一些用于NetEm的web界面gui,例如PHPnetemGUI2。
优点是,正如我所写的,它不仅可以模拟不同的网络速度,而且还可以模拟数据包丢失、复制和/或损坏、随机或定义的延迟等,所以除了缓慢的连接之外,您还可以模拟各种性能较差的网络和传输错误。
对于您的应用程序,它是绝对透明的,您可以配置操作系统使用NetEm作为代理服务器,因此来自该机器的所有连接都将通过它路由。或者,您可以只配置一个特定的应用程序来使用该代理。
我一直在用它在各种模拟的低性能网络上测试Android应用程序的性能。
形成单个TCP连接的一种常见情况实际上可以按照UNIX方式从socat和cpipe的对偶组合起来,如下所示:
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连接都得到这个量。
Explanation: The outer (left) socat listens with the given options on :5555 as a forking server. The first cpipe command in the SYSTEM:... option then throttles data that went into socket :5555 (and comes out of the first, outer socat) to at most 10kByte/s. That data is then forwarding using another socat which connects to localhost:5000 (where the service you want to slow down should be listening). Data from localhost:5000 is then put into the right cpipe command, which (with the given values) throttles it to about 300kB/s.
cpipe的-ngr选项很重要。它导致cpipe非贪婪地从其输入文件描述符中读取。否则,您可能会遇到缓冲区中的数据未被转发并等待回复的情况。
使用更常见的缓冲工具而不是cpipe也是可能的。
(图片来源:这是基于socat文档中Christophe Loor的“双tee”配方)