java datagramchannel数据丢失

标签 java networking network-programming udp datagram

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

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

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

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

最佳答案

Does UDP have an [inherent] way to tell if the packet that is received whole, and in order, before .read(ByteBuffer b) is called? I've read in at least one article saying that UDP inherit'ly discards incomplete or out of order data.

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

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

Does datagramchannel treat one send(buffer.. ) as one datagram packet?

是的。

what if it's a partial send?

UDP中没有这样的东西。

Can a read(.. ) read more than one packet of data

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

resulting in data being discarded if the buffer being given as the commands argument was only designed to handle one packet of data?

不可能发生。

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

关于java datagramchannel数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588201/

相关文章:

java - C# 和 Java (Android) 中的算法转换为 HTML

java - OnSensorChanged线程

ruby - EventMachine - 端口正在使用中

java - 使用 netsh 从 Java 访问 Wi-Fi 网络接口(interface)详细信息

c# - 使用 .Net 获取域中的计算机列表

java - 从 Hadoop 中的 HDFS 读取时的 I/O 时间

java - 在生产版本中包含不同的 logback.xml

c++ - 无法使用 wininet 将 ZIP 文件发布到服务器

networking - 在端口和套接字之间混淆

python - 使用 Flask Web 应用程序监控实时数据流