[英]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.