如何确定理想的数据报设置

时间:2011-10-19 16:34:17

标签: java udp

我正在编写一个消耗高速率UDP数据的Java客户端应用程序,我希望最大限度地减少主机/应用程序层的数据包丢失(我知道网络层可能存在不可避免的损失)。

什么是reasobaly高缓冲区大小(MulticastSocket.setReceiverBufferSize())?

理想的DatagramPacket缓冲区大小是多少?使用64k有不利之处吗?

我对网络拓扑和发送方应用程序的了解非常有限。这是在Linux上运行的。 TCP不是一种选择。

2 个答案:

答案 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字节。