如何限制下载速度?

时间:2010-05-05 13:20:40

标签: algorithm web-applications methods download

最近我问了this问题。但答案并不符合我的要求,我知道文件托管服务提供商确实设法限制了速度。所以我想知道一般的算法/方法是什么(我的意思是下载技术) - 特别是限制单一连接/用户下载速度。

@ back2dos我想给特定用户一个特定的下载速度(当然对应于硬件功能),或者换句话说,让用户能够下载某些特定文件,比如20kb / s。当然,我希望有能力将其改为其他价值。

3 个答案:

答案 0 :(得分:6)

您可以使用令牌桶(http://en.wikipedia.org/wiki/Token_bucket

答案 1 :(得分:3)

没有提及平台/语言,很难回答,但“漏桶”算法可能是最合适的:

http://en.wikipedia.org/wiki/Leaky_bucket

答案 2 :(得分:0)

好吧,既然这个答案非常普遍,那么对于普通的TCP来说这是一个非常简单的方法:

您将所有下载连接的资源处理程序放入一个列表中,与有关请求的数据的信息配对,然后循环它。然后你把一大块所需的数据写到套接字上,大约1.5K,这是最常用的最大段大小,据我所知。当你在列表和列表中时,你会重新开始。在重新开始之前,只需等待以获得所需的平均带宽。

请注意,如果太多客户端的带宽低于您允许的带宽,那么您的TCP缓冲区可能会爆炸。一些TCP绑定允许查找一个套接字的当前缓冲数据的大小。如果超过阈值,您可以直接跳过套接字。

此外,如果连接的客户端太多,您实际上没有足够的时间写入所有套接字,因此在一个循环之后,您“必须等待负时间”。在这种情况下,增加块大小可能会加快速度,但在某些时候,服务器将停止加速。

更简单的方法是在客户端执行此操作,但这可能会产生大量开销。死的简单想法是让客户端每50毫秒请求1K(假设你想要20KB / s)。您甚至可以通过HTTP执行此操作,但我强烈建议更大的块大小,因为HTTP具有极大的开销。

我的猜测是,最好是尝试找到一个能够开箱即用的网络服务器。我认为Apache有很多模块可用于各种配额。

格尔茨
back2dos