我每秒接收约 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/