我有一个问题,需要我计算可用的最大上传和下载,然后将我的程序的使用量限制为它的百分比。但是,我想不出找到最大值的好方法。
目前,我能想出的唯一解决方案是在客户端和服务器之间传输几兆字节,然后测量传输的方式。然而,这种解决方案是非常不受欢迎的,因为有100,000个客户端可能会导致我们服务器的带宽使用量增加太多(这已经太高了)。
有没有人有解决这个问题的方法?
请注意,我最感兴趣的是数据传输的限制,直至离开ISP的网络;我认为这很可能会导致导致其他程序通信降级的瓶颈。如果我错了,请纠正我。
编辑:经过进一步调查,我不认为这是可能的;当离开ISP的网络时,准确测量最大传输速率涉及太多变量。如果有人提出准确的解决方案,请将问题保持开放。
答案 0 :(得分:2)
如果您可以将代码限制为Windows Vista或更高版本(不太可能,但谁知道?),您可以使用SetPerTcpConnectionEStats
和GetPerTcpConnectionEStats
以及TCP_ESTATS_BANDWIDTH_RW_v0
让Windows估算带宽用于连接,然后检索该估计值。然后,根据该估计,您可以限制使用的带宽。
那么会发生什么事情,你现在开始运行应用程序,收集统计数据一段时间,然后根据你在初始时间段内测量的内容强加限制。
这样做的好处是可以避免发送额外的数据仅来收集带宽信息 - 它只是收集有关您正在发送的数据的统计信息。它有一个缺点(我怀疑几乎是不可避免的)它仍然使用接近全带宽的东西,直到你得到可用带宽的估计(并且,如上所述,这是在Windows Vista中添加的,所以它甚至不接近普遍可用)。
答案 1 :(得分:1)
如果连接的两端都有Windows设备,则可以使用后台智能传输服务(BITS)将信息和警报移出整个带宽问题。 (几乎)始终安装的组件在http://msdn.microsoft.com/en-us/library/aa362708(VS.85).aspx描述。
您没有说明是否需要带宽友好性或仅仅是成本问题,因此这可能不合适。
答案 2 :(得分:0)
我看到的唯一答案是:
使问题复杂化的一些问题:
由于客户端可能正在运行其他任务,并且主机(发送机器)将运行不同的任务,因此传输速率会有所不同。
我投票给发送一大块数据计时,发送另一个并计时。累计这些持续时间并平均超过块数。这允许动态定时,这比任何预先计算的定时更准确。
答案 3 :(得分:0)
如果问题是原始带宽,则可以在此处使用反馈机制。 当您启动会话时,服务器以最快的速率告诉客户端它将发送数据。客户端可以以最低速率监控它接收数据。如果收到的数据的速率低于发送数据的速率(您可以在此处使用阈值,例如降低90%或更低),则客户端会通知服务器降低数据速率并再次启动该过程。这将作为一种基本的QoS机制。
如果问题是连接具有高延迟和/或抖动,请尝试以较小的包(实际IP / TCP包)发送信息。通常情况下,系统会尝试使用最大数据包大小,但互联网上的数据包碎片可能会延迟流量。如果这仍然没有改善延迟,那么您可以回退到使用UDP而不是TCP。但这不能确保数据传输。
答案 4 :(得分:0)
一种选择是在客户端和服务器之间实现uTorrent's UDP transport protocol之类的东西,以减少延迟。当其他一些进程开始使用带宽时,仅测量原始吞吐量将无济于事,从而减少了您可用的带宽量。