如何为 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 实施客户端带宽限制?的主要内容,如果未能解决你的问题,请参考以下文章