我正在寻找一种将网络仿真添加到套接字的方法。
基本的解决方案是通过某种方式为连接增加带宽限制。
对我来说理想的解决方案是:
- 支持高级网络属性(延迟、丢包)
- 开源
- 具有与标准套接字类似的 API(或环绕它们)
- 在 Windows 和 Linux 上工作
- 支持 IPv4 和 IPv6
我看到了一些在系统级别上工作的选项,甚至作为代理(Dummynet、WANem、neten 等),但这对我不起作用,因为我希望能够手动模拟每个套接字(例如,开一个模拟modem的socket,一个模拟3G的socket。基本上我想知道这些工具是怎么做的。
编辑:我需要将此功能嵌入到我自己的产品中,因此使用额外的盒子或需要手动配置的第三方工具是不可接受的。我想编写与那些工具做同样事情的代码,我的问题是如何去做。
结语:事后看来,我的问题有点误导。显然,没有办法直接在套接字上做我想做的事。有两种选择:
为发送/接收操作添加延迟(基于@PaulCoccoli's answer):
通过在发送和接收之前添加延迟,您可以获得非常粗略的网络模拟(延迟的恒定延迟,延迟发送,每次发送不超过 X 字节第二,带宽)。
保罗的回答和评论给了我很大的启发,所以我奖励了他。
添加网络模拟逻辑作为代理(基于@m0she 等人
的回答):要么通过代理发送请求,要么使用代理拦截请求,然后添加所需的模拟。然而,使用现成的解决方案而不是编写自己的代理实现更有意义——据我所知, Dummynet可能是最好的选择(这就是webpagetest.org 所做的)。其他选项在下面的答案中,我还会添加DonsProxy
这是更好的方法,所以我接受这个答案。