【问题标题】:Receiving packets in UDP以 UDP 接收数据包
【发布时间】:2010-12-09 18:54:45
【问题描述】:

假设我的程序通过网络 (UDP) 发送 1000 个字节。它是否保证接收器将在一个“批次”中接收 1000 个字节?或者他可能需要执行几次“读取”,直到他收到整个消息?如果后者为真,我如何确保同一消息的数据包顺序不会“混淆”(按顺序),或者协议可能保证它?
编辑:也就是说,我的消息有可能被分成几个数据包吗? (如果我尝试发送 10000mb 的消息会怎样?)

【问题讨论】:

    标签: c# c++ networking udp


    【解决方案1】:

    你会得到它,或者什么都没有。

    但不能特别保证您会按照数据包的传输顺序准确接收一次数据包;丢包、重新排序和(不太常见的)重复都是可能的。

    存在最大帧大小(65,507 字节),发送()更大尺寸的数据包将返回错误。

    您必须提供足够的缓冲区以在一次调用中接收整个帧。

    UDP 数据包可以分成多个 IP 片段,但操作系统会丢弃一个不完整的数据包。因此,这对应用程序是透明的。

    【讨论】:

      【解决方案2】:

      接收方将在一次调用中获取整个数据包。数据包长度是有限的,即使在theory

      长度 一个 16 位字段,指定整个字节的长度 数据报:标题和数据。最小值 长度是 8 个字节,因为那是 标头的长度。字段大小 设定理论限制为 65,535 字节(8 字节头 + 65527 字节 data) 用于 UDP 数据报。这 数据长度的实际限制 这是由基础强加的 IPv4 协议为 65,507 字节。

      但实际限制要低得多,通常假设为 512 字节是安全的。见What is the largest Safe UDP Packet Size on the Internet

      【讨论】:

      • 那么如果生病尝试发送 1024 字节会发生什么?我会在发送时收到错误消息,或者我的消息会被拆分到不同的数据包中吗? (以及它们之间的顺序?)
      • 512 是最小 安全 大小。 1024可能会成功。或充其量在发送过程中出错。更糟糕的是,数据包会被流量中的某些路由器丢弃,而您永远不会知道。 UDP 没有碎片和重构,这就是 TCP 的用途。
      • 莱姆斯:那是错误的。分段和重组是在 IP 级别完成的,这意味着它适用于 UDP。使用 UDP,您将看到整个数据报在发送时正确组装,或者什么也没有。 TCP 还添加了排序和确认/重传。
      • @caf: 是的,但是如果您使用有损网络,您的应用可能很幸运能够获得一半的数据包,如果您使用分段的 UDP,您甚至会丢失通过的一半数据包。
      【解决方案3】:

      UDP 与 TCP 不同,它不是可靠的协议。它没有提供内置机制来确保数据包以正确的顺序到达,甚至根本到达。也就是说,您可以以锁步方式编写发送/接收例程,每次发送数据包时,发送方必须等待接收 ACK 才能再次发送。如果在某个指定的超时后没有收到 ACK,则必须重新发送数据包。这样可以确保以正确的顺序接收数据包。 (有关更多信息,请查看使用此策略的RFC for the TFTP protocol。)

      最后,如果可能,您可能要考虑改用 TCP。

      【讨论】:

        【解决方案4】:

        使用 UDP 发送的数据在packets 中分组,因此如果您发送 x 个字节,那么如果接收者收到数据包,他将收到 x 个字节。

        但是,您的数据包甚至可能没有到达,或者它们可能乱序到达。

        【讨论】:

        • 但是程序是否有可能首先看到它只有 500 个字节可用,然后过了一会儿它又收到了另外 500 个字节?
        • 如果我的消息大小为 100 万字节长.. 那会怎样? (谢谢)
        • 我想它也应该适用于 100 万;但不推荐。
        • 长度字段是一个 16 位数字,因此 64k 减去 IP 和 UDP 标头的空间是硬性限制。
        • 那么当我尝试发送更大的消息时会发生什么?我一开始就发不出去?
        【解决方案5】:

        使用UDP Lite,您可以请求接收部分损坏的数据包。这对于视频和 VoIP 服务很有用。

        【讨论】:

        • 希望我们能得到一个适用于 Windows 的实现,这样它就可以在桌面终端用户应用程序中使用
        猜你喜欢
        • 2013-11-08
        • 2014-12-14
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多