我有一个基于Java的客户端应用程序,它连接到服务器并接收数据。
我的目标是限制数据包传输速率。
为了达到这个目的,我只需使用以下属性:
Socket#setReceivedBufferSize(int)
我已经知道,如果我将接收到的缓冲区设置为较小的大小,就会阻止“拥塞窗口”的增长,从而限制传输速率。
在这个假设下,我做了一些测试,似乎工作正常。
我的问题是:这是实现这一目标的有效方法吗? 有没有优点和缺点......
谢谢!
答案 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?