在Windows中模拟TCP套接字的慢速传输速度

3
我正在开发一个使用TCP套接字进行通信的应用程序。我想测试在低速条件下它的行为如何。
网站上有类似的问题,但据我所知,它们涉及HTTP流量,或者是关于Linux的。我的流量不是HTTP,只是普通的TCP套接字,操作系统是Windows。
我尝试使用Fiddler的调制解调器速度设置,但它没有起作用,似乎只适用于HTTP连接。

谢谢,但为了防止任何与主题无关的关闭投票,StackOverflow允许关于程序员专门使用的工具的问题,例如IDE等,我认为这在[FAQ]中有写明。 - sashoalm
1
你不能轻易地模拟这个。你可以配置基于策略的 QoS 以限制你的网络流量,可以在驱动程序层面丢弃数据包并广告一个小窗口。这可以模拟真实世界的速率限制,比如在数据中心中,你有一个所谓的 100MBit 链接,它实际上是一个连接到相应配置的交换机的 1Gbit 链接,并且可以模拟数据包丢失。但是进来的数据包仍然以正常速度进来。你最多只能获得“平均”慢速度。 - Damon
使用组策略编辑器,在“计算机配置”-->“基于策略的 QoS”-->“网络”-->“扩展 QoS 属性”下,可能是最简单的完成此操作的方法。这使您可以将速率从 64kB/s (0) 配置到 16MB/s (3)。但这并不是真正的慢速链接,它只允许较少的数据包进入... - Damon
在运行框中键入“组”应该会打开组策略编辑器,在左侧有一个窗格,您可以选择计算机配置->Windows设置。 在下面,您会找到QoS。至少在我的Win7“专业版”下是这样的,如果您有“家庭版”或其他版本,则可能不同。确切的名称也可能会有所不同。Microsoft会翻译所有内容,而我的版本是德语。因此,总是有一些猜测英文叫什么(很少或没有提示正确的术语)。 - Damon
@Damon 谢谢,我找到了并设置了每秒5KB的策略,但似乎仍未生效。我在VirtualBox虚拟机上进行测试,使用VirtualBox的虚拟网络驱动程序。这可能是为什么它不起作用的原因吗?此外,这些策略是否影响本地主机连接? - sashoalm
显示剩余3条评论
3个回答

2
虽然你可能想要投资于一套广泛的单元测试,但是你可以使用VMWare Workstation模拟各种网络条件。

Network Settings Screen

您需要安装一个虚拟机来进行测试,设置桥接网络(让虚拟机可以访问您的真实网络),并将您的代码上传到虚拟机中。
之后,您可以开始更改设置并查看应用程序的表现。 NetLimiter也可以使用,但其选项较少(在您的情况下,数据包丢失 是非常有趣的测试项目,在 netlimiter 中不可用)。

谢谢,我不知道VMware可以做到这一点。你知道VirtualBox是否也支持吗? - sashoalm
2
VirtualBox 确实支持其中的一些功能。请访问 https://www.virtualbox.org/manual/ch06.html#network_bandwidth_limit。 - Ohad

2

1
我认为你在这里采取了错误的方法。
通过一些设计良好的单元测试,您可以实现所需的所有功能。慢速网络连接引起的所有问题都可以在受控条件下在单元测试环境中模拟。
您的代码必须处理以处理“缓慢”链接的事情只是您应该处理的事情,包括:
  • 正确处理分段消息。您的所有网络读取代码都需要正确地假定每次读取将返回1个字节到读取缓冲区的大小之间。您不应该假设您会得到完整的“消息”,因为TCP对您的消息概念一无所知。
  • TCP流量控制可能导致同步发送失败并出现某种形式的“稍后再试”错误,或者异步发送成功并可能使用无法控制的资源(有关更多详细信息,请参见此处)。请注意,即使在“快速”链接上,如果您发送速度比接收器消耗速度快,也可能会发生这种情况。
  • 超时 - 再次强调,这不仅限于“慢”链接。您的所有超时处理代码都应该是强大且经过测试的。您可能希望确保任何读取超时都基于任何读取完成而不是在x时间内读取完整消息。您可能以缓慢的速度获取数据,但只要您仍在获取数据,链接就是活动的。
  • 连接失败 - 再次强调,这不是特定于“慢”链接的问题。您需要知道如何处理在任何时间重置连接的情况。

总之,在模拟缓慢网络上运行客户端和服务器所能实现的任何功能,都可以通过一组合理的单元测试来实现,而你想要在这样的链接上测试的所有内容都可能会影响到任何速度的链接。


1
虽然我很欣赏单元测试,但我也想进行真实世界的测试。例如,我发现我使用的库如果我拔掉以太网电缆,它将无法察觉到连接已经断开。当通知到套接字断开连接时,我会释放内存和资源。测试自己的代码不会警告我使用的库中的错误。 - sashoalm
实际上,除非您尝试发送数据并且电缆保持未插入状态直到TCP重试完成,否则拔出电缆不应导致TCP连接中断。这是TCP的设计特性,也是“一项功能”,并不会让人感到意外。 - Len Holgate
1
@LenHolgate 无论您是否使用单元测试,都需要在某个时候进行验证,以验证您的代码准确地表示这些行为。如果您仅基于对行为的假设来实现代码和/或单元测试,则只测试您的假设/知识是否准确。如果您认为自己正在正确处理边缘情况,则需要使用集成测试(即真实世界)验证您的假设。一旦进行了该测试,您就可以继续编写/调整单元测试并依赖它们前进。 - AaronLS
AaronLS,是的,当然需要在真实硬件上进行集成测试。 - Len Holgate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接