我正在编写一个消耗高速率UDP数据的Java客户端应用程序,我希望最大限度地减少主机/应用程序层的数据包丢失(我知道网络层可能存在不可避免的损失)。
什么是reasobaly高缓冲区大小(MulticastSocket.setReceiverBufferSize())?
理想的DatagramPacket缓冲区大小是多少?使用64k有不利之处吗?
我对网络拓扑和发送方应用程序的了解非常有限。这是在Linux上运行的。 TCP不是一种选择。
答案 0 :(得分:1)
什么是reasobaly高缓冲区大小(MulticastSocket.setReceiverBufferSize())?
计算您的应用程序可能抖动的程度以及您需要接收的数据速率。例如如果您的应用程序暂停执行0.5秒(如垃圾收集),并且您以10MB /秒的速度接收数据,则需要5MB的缓冲区来弥补0.5秒内没有接收数据的情况。
请注意,您可能需要调整linux上的net.core.rmem_max
sysctl以允许将缓冲区设置为所需的大小(实际上,您实际上只能获得您在sysctl中指定的大小的一半),默认情况下net.core.rmem_max可能相当低。
理想的DatagramPacket缓冲区大小是多少?使用64k有不利之处吗?
理想情况是网络的MTU,对于普通以太网,这意味着UDP有效负载为1472字节。任何更大的东西都是一个坏主意,因为它会导致碎片化的IP数据包 - IP碎片通常被认为是一件坏事,因为它会导致更多的开销并导致更多的数据丢失。
答案 1 :(得分:0)
套接字结束和接收缓冲区可以根据需要大小,如果需要,可以是一兆字节或两兆字节。
通过路由器的最大实际数据报大小为534字节。