java datagramchannel数据丢失

时间:2014-08-31 01:28:25

标签: java networking network-programming udp datagram

我已经阅读了有关UDP / Java数据报通道如何运作的一些相互矛盾的信息。我需要了解一些事情:

  • UDP是否有一种继承方式来判断在调用.read(ByteBuffer b)之前是否按顺序接收整个数据包?我至少读了一篇文章,说UDP继承了丢弃不完整或乱序数据。

  • datagramchannel是否将一个send(buffer ..)视为一个数据报包?如果是部分发送怎么办?

  • .read(..)是否可以读取多个数据包,如果作为命令参数给出的缓冲区仅用于处理一个数据包,则导致数据被丢弃?

1 个答案:

答案 0 :(得分:5)

  

UDP是否有[固有]方法来判断在调用.read(ByteBuffer b)之前是否按顺序接收整个数据包?我读过至少一篇文章说UDP继承了丢弃不完整或乱序数据。

这两种说法都不正确。更准确地说, IP 有一种方法可以判断数据报的片段是否全部到达,然后只有这样才能将它呈现给UDP。重组是IP层的责任,而不是UDP。如果片段没有到达,UDP甚至都看不到它。如果它们在重组完成之前到期,则IP会将它们抛弃。

调用read()之前/之后无关紧要。

  

datagramchannel是否将一个send(buffer.. )视为一个数据报包?

  

如果它是部分发送会怎样?

UDP中没有这样的东西。

  

read(.. )可以读取多个数据包吗

UDP读取将准确返回,只返回一个数据报,或者失​​败。

  

如果作为命令参数给出的缓冲区仅用于处理一个数据包,则导致数据被丢弃?

不可能发生。

下面的评论,这是一个完全不同的问题,检测截断的常用技术是使用大于最大预期数据报的缓冲区。然后,如果你得到一个大小的数据报,(i)它是一个应用程序协议错误,(ii)它也可能被截断了。