java datagramchannel数据丢失

use*_*813 2 java networking udp network-programming datagram

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

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

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

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

use*_*421 5

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

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

read()调用之前/之后是无关紧要的.

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

是.

如果它是部分发送怎么办?

UDP中没有这样的东西.

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

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

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

不可能发生.

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