节点接收方(客户端)的套接字上的带宽

时间:2017-06-12 14:25:17

标签: java sockets

我有一个基于Java的客户端应用程序,它连接到服务器并接收数据。

我的目标是限制数据包传输速率。

为了达到这个目的,我只需使用以下属性:

Socket#setReceivedBufferSize(int)

我已经知道,如果我将接收到的缓冲区设置为较小的大小,就会阻止“拥塞窗口”的增长,从而限制传输速率。

在这个假设下,我做了一些测试,似乎工作正常。

我的问题是:这是实现这一目标的有效方法吗? 有没有优点和缺点......

谢谢!

1 个答案:

答案 0 :(得分:0)

Socket#setReceiveBufferSize(int)将用作提示。但是,如果它太小,实际的实现可能会覆盖它。您可以使用Socket#getReceiveBufferSize()在运行时验证这一点。

要实际限制数据包速率(服务器端),我建议使用Google Guava的RateLimiter

  final RateLimiter rateLimiter = RateLimiter.create(5000.0); // rate = 5000 permits per second
  void submitPacket(byte[] packet) {
    rateLimiter.acquire(packet.length);
    networkService.send(packet);
  }

在客户端上,您将希望尽快读取块。但这取决于您对InputStream的具体用法。

另外,关于拥塞窗口的主题,我发现了white paper,我瞥了一眼。如果你想阅读一个实际的“研究”。阅读更简洁。见https://en.wikipedia.org/wiki/TCP_congestion_control

如果你想在客户端上节流并且你正在使用TCP,你可以简单地阅读。 TCP流量控制将补偿并发送更少的数据。见How do I implement client-side bandwidth throttling for FTP/HTTP?