如何为 FTP/HTTP 实施客户端带宽限制?

Posted

技术标签:

【中文标题】如何为 FTP/HTTP 实施客户端带宽限制?【英文标题】:How do I implement client-side bandwidth throttling for FTP/HTTP? 【发布时间】:2013-05-30 20:38:27 【问题描述】:

我的任务是编写一个客户端数据下载系统(在 Linux 上),该系统使用 FTP 或 HTTP 将 TB 大小的数据从外部合作伙伴下载到我们的本地站点。我们公司的网络管理员告诉我,我不能超过一定的带宽。我实施这样一个系统的最佳方式是什么?是否存在现有库?

我愿意编写自己的 FTP 和 HTTP 客户端(在 Linux 上使用 C 或 Java),但更愿意远离内核。我知道我可以限制我的 FTP/HTTP 客户端调用套接字 read() 的速率,但是如果服务器端调用 write() 的速度快于我的限制会发生什么?

【问题讨论】:

只要您使用 TCP/IP,服务器发送的东西就不会比您想象的要快。客户端必须先确认一个数据包,然后服务器才能发送另一个数据包。 谢谢。我忘记了 TCP 的流量控制,所以回答了那部分。但我仍在寻找实现整体节流的最佳方法。 读点东西,用数据包大小计算睡眠时间,再读一遍是我的头等大事。 【参考方案1】:

您可以在InputStream 之上构建另一个层:在read 方法中,您可以计算到目前为止的字节数。如果每秒字节数超过一定的限制,让下载线程休眠一段时间。 TCP 的流量控制完成了其余的工作。

【讨论】:

你不是要在 InputStream(从套接字读取的那个)的 read() 方法中执行休眠吗? 这样更好。实际上,我查看了前段时间实现的 upload 限制代码。可能两者都有效,但是是的,放入 read() 看起来更好。我已经更正了我的答案。【参考方案2】:

我知道 Apache JMeter 模拟慢速连接。你可以看看the code。

【讨论】:

【参考方案3】:

如果您知道网络路径延迟,您可以将 TCP 接收缓冲区大小设置为所需的带宽延迟乘积。那会很好地限制发件人。但结果值对于您的平台可能太小,因此可能会向上调整。设置后检查值。

您的网络管理员是否知道 TCP 会自动公平地共享带宽?

【讨论】:

【参考方案4】:

您愿意接受现成的 GUI 或命令行产品吗? Filezillia 提供了这一点。 还有一个名为 lftp 的 linux 命令行客户端。一个可设置的参数是 net:limit-total-rate,它将限制传输速率。由于这个客户端支持一次多笔转账,所以还有一个参数net:limit-rate。

【讨论】:

【参考方案5】:

为了简单起见,如果您使用的是 linux,您可以使用 wget 而不是重新发明***?看看--limit-rate 开关。

但回到主题 :) 这个答案可以让你开始:How can I implement a download rate limited in Java?

【讨论】:

以上是关于如何为 FTP/HTTP 实施客户端带宽限制?的主要内容,如果未能解决你的问题,请参考以下文章

什么是服务器的上行带宽和下行带宽?

服务器带宽限制10M独享,为何有时候会跑超呢?

RestKit 是不是支持带宽限制?

是否可以限制 Amazon S3 使用的带宽?

如何用路由器限制某IP的网速

使用mod_throttle模块限制web服务连接数和带宽