java datagramchannel数据丢失

java datagramchannel数据丢失,java,networking,network-programming,udp,datagram,Java,Networking,Network Programming,Udp,Datagram,我读过一些关于UDP/Java数据报通道如何运行的相互矛盾的东西。我需要知道一些事情: UDP是否有一种继承方式来判断在调用.read(ByteBuffer b)之前接收的数据包是否完整且按顺序?我至少读过一篇文章说UDP继承会丢弃不完整或无序的数据 datagramchannel是否将一次发送(缓冲区..)视为一个数据报数据包?如果是部分发送呢 如果作为commands参数提供的缓冲区仅设计用于处理一个数据包,那么.read(..)是否可以读取多个数据包,从而导致数据被丢弃 UDP是否有一

我读过一些关于UDP/Java数据报通道如何运行的相互矛盾的东西。我需要知道一些事情:

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

  • datagramchannel是否将一次发送(缓冲区..)视为一个数据报数据包?如果是部分发送呢

  • 如果作为commands参数提供的缓冲区仅设计用于处理一个数据包,那么.read(..)是否可以读取多个数据包,从而导致数据被丢弃

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

两种说法都不对。更准确的说法是,IP有一种方法来判断数据报的片段是否已经全部到达,然后甚至只有到那时才会将其呈现给UDP。重新组装是IP层的责任,而不是UDP。如果碎片没有到达,UDP根本看不到它。如果它们在重新组装完成之前过期,IP会将它们扔掉

调用
read()
之前/之后与此无关

datagramchannel是否将一个
发送(缓冲区..)
视为一个数据报数据包

如果是部分发送呢

UDP中没有这样的东西

是否可以读取(…)
多个数据包

UDP读取将准确且仅返回一个数据报,否则将失败

如果作为commands参数提供的缓冲区仅设计用于处理一个数据包,会导致数据被丢弃吗

不可能


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

“不可能发生。”我指的是api中关于读取的这一行:如果数据报中的字节数超过了给定缓冲区中的剩余字节数,那么数据报的其余部分将被悄悄地丢弃。有没有办法在读取数据包之前告诉数据包的大小以避免这种情况?@user1908813没有。通常的技术是使用一个比最大预期数据报大的缓冲区。然后,如果你得到一个如此大的数据报,(i)这是一个应用程序协议错误,(ii)它可能也被截断了。你还说IP说明了丢失的数据包,但无序的数据包呢?IP不说明丢失的数据包,我没有说其他。我说的是IP负责重新组装。如果一个片段到达的顺序不正确,IP可能会保留它,也可能不会保留它,它是未定义的。