我将大量数据发送到我的服务器,并且由于接收缓冲区大小较小而丢失了部分传入数据包。
你不知道。有很多可能的原因。
现在我正在以这种方式设置接收缓冲区 -
DatagramChannel serverChannel;
serverChannel.setOption(StandardSocketOptions.SO_RCVBUF, 1024*1024*10); // 10 MB
是否有意义?
并非如此,这是一个巨大的缓冲区,操作系统可能会将其截断为更合理的大小。设置后尝试获取该选项并查看实际大小。
此代码没有解决丢包问题。
没有人说会。你只是假设它。
还有一个问题——我的网络控制器的接收缓冲区属性默认为 512——是字节还是兆字节?
在您告诉我们您使用的是什么 NIC 之前,没有人可以回答这个问题,但是您应该能够从制造商的数据中自己发现这一点。
如果它是 512 字节,是否需要手动增加此属性?
不仅没有必要,而且不可能。
我认为以编程方式增加缓冲区实际上会增加操作系统缓冲区
如果您SO_RCVBUF
的意思是控制套接字接收缓冲区的大小,那是正确的。
但这没有意义
是的,它确实。
因为最初 udp 数据包“来”到我的网卡。
然后从那里进入操作系统,从那里进入 IP 堆栈,从那里进入 UDP 堆栈,再从那里进入套接字接收缓冲区。当大多数路径 MTU 高达 1500 字节时,NIC 似乎不太可能有 512 字节的缓冲区,但例如 512k 确实有意义。你可以假设它已经足够了,毕竟它确实有效。
你的基本假设是有缺陷的。UDP 数据包可能因多种原因而丢失:它们从未被发送,它们被中间路由器丢弃,它们被分段并且并非所有分段都到达接收器,或者接收器的套接字接收缓冲区已满,这反过来可能是因为它太小,也可能是因为接收者跟不上发送者。仅仅使用一个巨大的套接字接收缓冲区只能解决这些问题之一。如果您需要可靠性,请使用 TCP,或者通过重试实现 ACK 或 NACK 机制。