【问题标题】:Why do I get UDP datagrams out of order even with processes running locally?为什么即使进程在本地运行,我也会让 UDP 数据报乱序?
【发布时间】:2010-03-28 17:51:50
【问题描述】:

我正在开发流媒体服务器和 Flash 客户端之间的 Java 接口。我注意到即使两个进程都在本地运行,UDP 数据报也可以无序到达我的接口。

这正常吗?我认为由于没有数据报必须通过任何路由器或任何网络设备,因此不应该发生这种情况。

【问题讨论】:

  • 这是个好问题,我也对这可能的原因感兴趣。

标签: java udp datagram


【解决方案1】:

这将取决于操作系统。虽然您没有指定操作系统,但它并不重要。为了保持可移植性,您应该始终预期您的数据报套接字会收到乱序数据。

【讨论】:

    【解决方案2】:

    实际上,UDP 数据包的排序和接收并不能保证,即使它们是由 localhost 在 localhost 上发送的。只是因为协议的规范并不暗示它。

    由于您无法对它们做出假设,因此您应该选择使用 TCP 或使用您的程序处理的序列号来处理重新排序。

    【讨论】:

      【解决方案3】:

      尽管您正在运行 localhost,但在实际部署中,预计 UDP 数据报会出现乱序。

      如果您需要按顺序使用它们,请尝试 TCP。

      【讨论】:

        【解决方案4】:

        正如上面的海报所说的那样,没有指定 UDP 来保留序列,但是如果没有中间路由器,我也会怀疑您的代码中存在错误。

        【讨论】:

        • 不。这可能是由于多处理器数据包处理造成的。
        • 哇,刚刚注意到这条评论。你没有标记我的名字,所以没有通知。无论如何:通过将工作分散到多个内核来加速数据包处理的操作系统可能已经在不同的内核上处理了 UDP 数据包,并将它们无序地放入应用程序读取队列中。
        • 更值得深思的是,TCP可以有Zan说的同样的问题。如果有多个线程在处理发送数据,则数据的传输顺序可能与您编写的顺序不同。
        • 赞的评论实际上比任何答案都好;这是这里唯一甚至可以解释问题的原因,这就是 WHY 它发生的原因。
        猜你喜欢
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 2018-08-30
        • 2013-12-15
        • 2021-09-25
        • 2011-01-31
        • 1970-01-01
        相关资源
        最近更新 更多