DatagramPacket - Java碎片并重新排列它吗?

时间:2016-03-14 16:56:52

标签: java network-programming udp

我对整个UDP事物都很陌生(因为每个人都喜欢TCP),并且需要问一些关于Java实现的问题。

我需要有人告诉我是否:

  1. 由于发送,Java发送的DatagramPackets会自动分段 网络配置和数据大小。
  2. 在receive()调用返回结果之前,由于网络配置和数据大小而自动分段后,DatagramPackets被重新排列为Java正确的片段顺序。
  3. 如果删除了未完成的碎片化DatagramPackets,或者在删除时生成异常。 (收到一些碎片,其他碎片丢失)
  4. 我担心Java会无声地丢弃它,或者数据没有正确排列......这意味着我必须实现一种伪TCP类的东西才能同时拥有UDP的好处,以及检查TCP。

2 个答案:

答案 0 :(得分:2)

UDP在很大程度上是在操作系统中实现的,Java在这个问题上几乎没有发言权。

  • 超过576字节的数据包可以分段;
  • 数据包可能丢失;
  • 数据包可能无法到达。

Java没有办法,或者您无法判断这些是否已经发生。

您可以做的是实施协议来检测这一点。例如在每个数据包的开头添加序列号,长度和校验和。

  

这意味着我必须实现一个伪TCP类的东西,既有UDP的好处,也有TCP的检查。

现在你开始明白为什么“每个人都喜欢TCP”或大多数人都喜欢。 UDP有其用途,但对于大多数应用程序,TCP是最简单的。

答案 1 :(得分:1)

  

由于网络配置和数据大小,Java发送的DatagramPackets会自动分段。

是的,但Java与它无关。

  

在receive()调用返回结果之前,由于网络配置和数据大小而自动分段后,DatagramPackets被重新排列为Java正确的片段顺序。

是的,但不是Java,只有当所有碎片到达时。这发生在IP层。

  

如果删除了未完成的碎片化DatagramPackets,或者在删除时生成异常。 (收到一些碎片,其他碎片丢失)

他们默默地掉下来。没有例外。 Java再次与它无关。这一切都发生在IP层。当且仅当所有片段到达时,数据报被重新组装并传递到UDP层。 Java没有任何参与。

  

我担心Java会默默地删除它

Java什么都不做。 IP静静地丢弃它。

  

或数据排列不正确

收到的数据报完整无缺,或者完全没有。 Java再次与它无关。

  

这意味着我必须实现一个伪TCP类的东西,既有UDP的好处,也有TCP的检查。

正确。你这样做。