Java DatagramPacket (UDP) 最大 send/recv 缓冲区大小

2022-09-02 09:58:45

在Java中使用DatagramPacket时,假设你有一个缓冲区。如果你在发送/接收时只是为DatagramPacket传递它,Java会接收对DatagramPacket块的调用,直到它读取整个兆字节吗?byte[1024*1024]

我问Java是否会拆分它,或者只是尝试发送整个被删除的东西。

通常,UDP数据包的大小限制约为64KB,但是我想知道,因为Java的API允许字节数组,如果这是一个限制,并且会丢弃或拆分并重新组装一些超级大的东西。

如果它被删除,什么API调用会告诉我在Java调用中可以使用的最大数据有效负载?我听说IPv6也有巨型帧,但是DatagramPacket(或DatagramSocket)是否支持,因为UDP定义了标头规范?


答案 1

DatagramPacket只是基于 UDP 的套接字上的包装器,因此通常的 UDP 规则适用。

64 KB 是完整 IP 数据报的理论最大大小,但保证仅路由 576 字节。在任何给定的网络路径上,具有最小最大传输单元的链路将确定实际限制。(1500 字节,较少的标头是常见的最大值,但无法预测将有多少个标头,因此最安全的方法是将消息限制在 1400 字节左右。

如果超过 MTU 限制,IPv4 将自动将数据报分解为片段并在结束时重新组合它们,但最多只能达到 64 KB,并且仅当所有片段都通过时。如果任何片段丢失,或者任何设备决定不喜欢片段,则整个数据包都将丢失。

如上所述,不可能事先知道路径的MTU是什么。有各种算法可以进行实验来找出答案,但许多设备没有正确实现(或故意忽略)必要的标准,因此这一切都归结为反复试验。或者,您可以只猜测每条消息 1400 个字节。

至于错误,如果您尝试发送的字节数超过操作系统配置为允许的字节数,则应该会收到错误或其等效项。如果您发送的少于此值但超过网络允许的量,则数据包将消失。EMSGSIZE


答案 2

java.net.DatagramPacket 缓冲区最大大小为 65507。

查看 https://en.wikipedia.org/wiki/User_Datagram_Protocol#UDP_datagram_structure

最大传输单元(MTU)大小因实现而异,但可以说与基本问题“Java DatagramPacket(UDP)最大发送/recv缓冲区大小”无关,因为MTU对java.net.DatagramPacket层是透明的。


推荐