5

我有一个问题需要我计算可用的最大上传和下载量,然后将我的程序的使用限制在其中的一个百分比。但是,我想不出找到最大值的好方法。

目前,我能想到的唯一解决方案是在客户端和服务器之间传输几兆字节,然后测量传输的时间。然而,这种解决方案是非常不可取的,因为对于 100,000 个客户端,它可能会导致我们服务器的带宽使用量增加过多(这已经太高了)。

有没有人有解决这个问题的方法?

请注意,我最感兴趣的是限制传输到离开 ISP 网络的数据;我认为这很可能是会导致其他程序通信降级的瓶颈发生的地方。不过,如果我错了,请纠正我。

编辑:经过进一步调查,我认为这是不可能的;离开 ISP 网络时,涉及的变量太多,无法准确测量最大传输速率。不过,如果有人想出一个准确的解决方案,请留下问题。

4

5 回答 5

2

如果您可以将代码限制为 Windows Vista 或更新版本(不太可能,但谁知道呢?)您可以使用和SetPerTcpConnectionEStats让Windows 估计连接的带宽,然后检索该估计值。然后,根据该估计,您可以限制您使用的带宽。GetPerTcpConnectionEStatsTCP_ESTATS_BANDWIDTH_RW_v0

所以会发生什么,您将开始像现在一样运行应用程序,收集一段时间的统计信息,然后根据您在初始时间段内测量的内容进行限制。

这样做的好处是它避免发送额外的数据只是为了收集带宽信息——它只是简单地收集关于你正在发送的数据的统计信息。它有一个缺点(我怀疑这几乎是不可避免的),它仍然使用接近全带宽的东西,直到你估计可用的带宽(而且,如上所述,这是在 Windows Vista 中添加的,所以它甚至不接近普遍可用)。

于 2010-05-07T17:42:31.177 回答
1

如果您在连接的两端都有 Windows 设备,则可以使用后台智能传输服务 (BITS) 来移动信息并避免整个带宽问题。http://msdn.microsoft.com/en-us/library/aa362708(VS.85).aspx描述了(几乎)始终安装的组件。

您没有说是否需要带宽友好性或只是成本问题,因此这可能不合适。

于 2010-06-06T21:13:06.210 回答
0

如果问题是原始带宽,那么反馈机制可以在这里工作。当您启动会话时,服务器会以它发送数据的速率告诉客户端。客户端可以监控它接收数据的速率。如果接收数据的速率低于数据发送的速率(您可以在此处使用阈值,例如低 90% 或更低),则客户端会通知服务器降低数据速率并再次启动该过程。这将作为基本的 QoS 机制。

如果问题是连接具有高延迟和/或抖动,请尝试以较小的数据包(实际 IP/TCP 数据包)发送信息。通常系统会尝试使用最大数据包大小,但互联网上的数据包碎片可能并且会延迟流量。如果这仍然不能改善延迟,那么您可以回退到使用 UDP 而不是 TCP。但这并不能确保数据传输。

于 2010-06-01T23:34:21.303 回答
0

我看到的唯一答案是:

  1. 使用一个小样本来计算传输速率。
  2. 以块(例如 1k)为单位计时实际数据并报告平均值。

使问题复杂化的一些问题:

  • 发送机器的处理器带宽(即正在运行的其他任务)。
  • 网络上的流量密度。
  • 在客户端计算机上运行的任务。
  • 所有机器的架构。

由于客户端可能正在运行其他任务,而主机(发送机器)将运行不同的任务,因此传输速率会有所不同。

我投票赞成发送一大块数据对其进行计时,发送另一个数据并对其进行计时。累积这些持续时间并平均块数。这允许动态时序,这将比任何预先计算的时序更准确。

于 2010-05-07T17:20:50.723 回答
0

一种选择是在客户端和服务器之间实现类似uTorrent 的 UDP 传输协议,以降低延迟。当其他一些进程也开始使用带宽时,仅仅测量原始吞吐量将无济于事,从而减少了您可用的带宽量。

于 2010-06-21T17:44:17.590 回答