繁体   English   中英

接收端Socket上的节流带宽(客户端)

[英]Throttle bandwidth on Socket of the receiving side (client)

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

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

为了实现这一点,我只需使用以下属性:

Socket#setReceivedBufferSize(int)

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

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

我的问题是:这是实现这一目标的有效方法吗? 有利弊吗?

谢谢!

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具体使用。

此外,关于拥堵窗口的主题,我发现了这张白皮书 ,我瞥了一眼。 如果你想阅读一个实际的“研究”。 阅读更简洁。 请参阅https://en.wikipedia.org/wiki/TCP_congestion_control

如果你想在客户端上节流而你正在使用TCP,那么你可以简单地阅读。 TCP流量控制将补偿并发送更少的数据。 请参阅如何为FTP / HTTP实施客户端带宽限制?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM