【问题标题】:In Java, how do I deal with UDP messages that are greater than the maximum UDP data payload?在 Java 中,如何处理大于最大 UDP 数据负载的 UDP 消息?
【发布时间】:2011-10-17 13:22:27
【问题描述】:

我阅读了this question about the error that I'm getting,了解到 UDP 数据负载不能超过 64k。我读过的建议是使用 TCP,但在这种特殊情况下这不是一个选项。我正在与通过 UDP 传输数据的外部系统进行交互,但目前我无法访问该外部系统,因此我正在模拟它。

在某些情况下,我有超过 1,400,000 字节的数据消息,并且要求使用 UDP 协议。我无法更改协议(我更愿意使用 TCP 或基于 UDP 构建的可靠协议)。相反,我必须找到一种方法,通过 UDP 将大型有效负载从测试应用程序传输到我正在构建的系统中,并在我正在构建的系统中读取这些大型有效负载以进行处理。我也不必担心丢包——如果我没有得到数据报,我不在乎——只需等待下一个有效载荷到达。如果它不完整或丢失,只需将其全部扔掉并继续等待。我也事先不知道数据报的大小(它们的范围从几百字节到 1,400,000+ 字节。

我已经将发送和接收缓冲区的大小设置得足够大,但这还不够。我还能做什么?

【问题讨论】:

  • 他们如何以大于最大大小的有效负载发送它们?我的意思是,您需要将它们编组/解组为合法大小的消息。

标签: java network-programming udp


【解决方案1】:

UDP 数据包有一个 16 位长度的字段。这与Java无关。它们不能更大,期间。如果您正在与之交谈的服务器是不可变的,那么您就会被困在可以放入数据包中的内容中。

如果您可以更改服务器和协议,您可以或多或少地为自己重新实现 TCP。由于 UDP 被定义为不可靠,因此您需要完整的重传机制来处理在网络中某处丢弃的数据包。因此,您必须将“消息”拆分为多个块,发送这些块,并制定一个协议来请求重新传输丢失的块。

【讨论】:

    【解决方案2】:

    这是一个要求......

    因此,该要求还应规定分组技术。您需要有关外部系统及其协议的更多信息。请注意,最大 IPv4 UDP 有效负载为 65535-28 字节,而一旦涉及路由器,最大实际有效负载

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2023-02-18
      • 2020-05-25
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多