我已经阅读了有关UDP / Java数据报通道如何运作的一些相互矛盾的信息。我需要了解一些事情:
UDP是否有一种继承方式来判断在调用.read(ByteBuffer b)之前是否按顺序接收整个数据包?我至少读了一篇文章,说UDP继承了丢弃不完整或乱序数据。
datagramchannel是否将一个send(buffer ..)视为一个数据报包?如果是部分发送怎么办?
.read(..)是否可以读取多个数据包,如果作为命令参数给出的缓冲区仅用于处理一个数据包,则导致数据被丢弃?
答案 0 :(得分:5)
UDP是否有[固有]方法来判断在调用.read(ByteBuffer b)之前是否按顺序接收整个数据包?我读过至少一篇文章说UDP继承了丢弃不完整或乱序数据。
这两种说法都不正确。更准确地说, IP 有一种方法可以判断数据报的片段是否全部到达,然后只有这样才能将它呈现给UDP。重组是IP层的责任,而不是UDP。如果片段没有到达,UDP甚至都看不到它。如果它们在重组完成之前到期,则IP会将它们抛弃。
调用read()
之前/之后无关紧要。
datagramchannel是否将一个
send(buffer.. )
视为一个数据报包?
是
如果它是部分发送会怎样?
UDP中没有这样的东西。
read(.. )
可以读取多个数据包吗
UDP读取将准确返回,只返回一个数据报,或者失败。
如果作为命令参数给出的缓冲区仅用于处理一个数据包,则导致数据被丢弃?
不可能发生。
下面的评论,这是一个完全不同的问题,检测截断的常用技术是使用大于最大预期数据报的缓冲区。然后,如果你得到一个大小的数据报,(i)它是一个应用程序协议错误,(ii)它也可能被截断了。