java - 如何最小化UDP丢包

标签 java udp multicast multicastsocket

我每秒接收约 3000 个 UDP 数据包,每个数据包的大小约为 200 字节。我编写了一个 java 应用程序来监听那些 UDP 数据包并将数据写入文件。然后服务器以先前指定的速率发送 15000 条消息。写入文件后,它只包含 ~3500 条消息。使用 wireshark 我确认我的网络接口(interface)收到了所有 15000 条消息。之后我尝试更改套接字的缓冲区大小(最初为 8496 字节):

(java.net.MulticastSocket)socket.setReceiveBufferSize(32*1024);

该更改将保存的消息数量增加到约 8000 条。我一直将缓冲区大小增加到 1MB。之后,保存的消息数量达到了 ~14400 条。将缓冲区大小增加到更大的值不会增加保存的消息数。我想我已经达到了允许的最大缓冲区大小。不过,我需要捕获我的网络接口(interface)收到的所有 15000 条消息。

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

闻起来像个错误,很可能在您的代码中。如果 UDP 数据包通过网络传送,它们将在本地排队等待传送,正如您在 Wireshark 中看到的那样。也许您的程序在从其套接字读取数据时没有及时取得进展 - 是否有专门的线程来执行此任务?

您可以通过检测您的程序丢失了哪些 数据包来取得一些进展。如果丢失的所有数据包都是早期数据包,则可能在程序等待接收数据之前就已发送数据。如果他们都晚了,也许它退出得太早了。如果它们以固定的时间间隔出现,则循环接收数据包的代码可能会出现一些问题。等等

无论如何,您似乎对丢失的数据包格外着急。按照设计,UDP 不是可靠的传输。如果这些多播数据包的丢失对您的系统来说是一个问题(而不仅仅是您出于性能原因想要解决的一个谜),那么系统设计是错误的。

关于java - 如何最小化UDP丢包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8267271/

相关文章:

Java猜谜游戏。如何使用数据验证来检查数字是否在特定范围内?

java - tomcat 离开 time_wait 连接

linux - BeagleBone Black : Qt 5. 3 无法在 UDP 中发送数据报

Python SocketServer 监听多播

c++ - 对于 recvfrom 的 UDP 情况,缓冲区的大小是多少?

java - ini4j读取文件错误

Java,int x = 5; System.out.println ("x + 5 is "+ x + 5); System.out.println ("x += 5 is "+ x += 5);为什么第二个 println 是错误的?

java - 这是优化我的网络模型的更有效方法吗?

udp - 使用 mio 使用 UDP 并收到错误 "MutBuf is not implemented for the type MutSliceBuf"

java - MulticastSocket 加入/离开组、发送、接收线程安全