我有一台 CentOS 服务器,上面有一个 JAVA 应用程序,可以接收 UDP 数据包,一切正常,直到数据包大于 584 字节,我读了一些相关内容,似乎是 UDP 协议的限制。
我的较大数据包长度(有效负载)为 631 字节
我测试在同一个网络中从一台 Windows 机器向另一台 Windows 机器发送 631 个字节,似乎工作正常,但如果我将相同的日期发送到 CentOS 服务器,服务器只能捕获前 584 个字节。
我使用 Microsoft Network Monitor 3.4 从 Windows 机器上嗅探,发现数据包没有被碎片化。
我是否必须在服务器上设置一些系统参数?是 JAVA 机器的限制吗?
有人能指导我吗?我是新手。谢谢。
我检查了 iptables,似乎是空的。
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
我测试在同一个网络中从一台 Windows 机器向另一台 Windows 机器发送 631 个字节,似乎工作正常,但如果我将相同的日期发送到 CentOS 服务器,服务器只能捕获前 584 个字节。
这没什么意义。使用 UDP,您要么收到完整的数据包,要么什么也收不到,除非应用程序明确调用长度小于数据包的发送,并且还设置MSG_TRUNC
为接受数据包截断。因此,此处的任何限制都必须由应用程序完成。UDP 数据包本身可以最大为 64k,我确信 Java 本身不会将应用程序的每次接收调用都更改为仅使用较小的长度,否则许多其他基于 Java 的应用程序都会出现问题。
因此,请检查应用程序内部的读取方式。我假设读取时存在明确的限制。您还可以使用 strace 运行应用程序并检查应用程序如何调用 recv 或 recvmsg,您可能会看到应用程序请求的大小。
当然,也可能是应用程序从未收到数据包,因为数据包在应用程序之外被过滤掉了。在这种情况下,您应该使用 tcpdump/wireshark 检查数据包是否到达机器,例如,不要检查发送方,而要检查接收方。