在Java中使用DatagramPacket假设你有一个byte[1024*1024]缓冲区.如果你只是在发送/接收时传递给DatagramPacket,那么Java接收对DatagramPacket块的调用,直到它读取整个兆字节为止?
我问的是Java是将它拆分还是只是尝试发送掉掉的整个东西.
通常,UDP数据包的大小限制大约是64KB,但是我想知道,因为Java的API允许字节数组,如果这是一个限制,那么超大的东西会被丢弃或拆分并重新组装给你.
如果它被删除了什么API调用将告诉我可以在Java调用中使用的最大数据有效负载?我听说IPv6也有巨型帧,但DatagramPacket(或DatagramSocket)是否支持UDP,因为UDP定义了头规格?
Set*_*ble 27
DatagramPacket 它只是基于UDP的套接字的包装器,因此适用通常的UDP规则.
64千字节是完整IP数据报的理论最大大小,但保证仅路由576个字节.在任何给定的网络路径上,具有最小最大传输单元的链路将确定实际限制.(1500字节,更少的标头是常见的最大值,但是不可能预测将有多少标头,因此最安全地将消息限制在1400字节左右.)
如果超过MTU限制,IPv4将自动将数据报分解为片段并在最后重组它们,但最多只能重新组装64千字节,并且只有当所有片段都通过时才会重新组装.如果任何片段丢失,或者任何设备决定它不喜欢片段,则整个数据包都会丢失.
如上所述,不可能事先知道路径的MTU是什么.有各种算法可供试验,但许多设备没有正确实施(或故意忽略)必要的标准,所以这一切都归结为试验和错误.或者你可以猜测每条消息1400字节.
至于错误,如果您尝试发送的字节数多于操作系统配置为允许的字节数,则应该收到EMSGSIZE错误或等效错误.如果发送的数量少于网络允许的数量,则数据包将消失.