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

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

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

【问题讨论】:

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

标签: java sockets network-programming bandwidth


【解决方案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?

        【讨论】:

          猜你喜欢
          • 2017-11-20
          • 1970-01-01
          • 2013-04-02
          • 2016-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多