【问题标题】:Combining UDP packets?合并UDP数据包?
【发布时间】:2012-09-30 01:35:49
【问题描述】:

将多个 UDP 数据包合并为一个而不是一个接一个地发送它们有什么好处?我知道如果大数据包损坏了,那么我会丢失所有数据包,但是将它们全部一起发送可能有好处吗?比如大的丢失的可能性较低?

【问题讨论】:

  • udp 是一种“尽力而为”的协议。繁忙的路由器可能会选择丢弃一个大的 udp 数据包,而一个小的路由器可能会通过流量中断。没有任何保证。
  • 如果不是评论,我会给出这个最佳答案

标签: udp packet-loss


【解决方案1】:

这将由发送应用程序自行决定。

请注意,您的大数据包受底层网络的 MTU 限制。例如UDP 数据包的理论大小为 64k,但以太网帧只有约 1500 字节。所以我怀疑这不是一个实用的功能。

【讨论】:

  • IPv4 UDP数据包有效载荷的理论最大大小为65535-20-8,先减去IP头,再减去UDP头,得到65509字节。
【解决方案2】:

通常网络通道会受到每秒可发送数据包速率的限制。因此,如果您想每秒发送数百万条消息,您通常希望组合成较少数量的数据包以在不发生重大数据包丢失的情况下运行。

概括地说,Windows 不喜欢 UDP 每秒超过 10,000 个数据包,但您可以用大型 MTU 数据包使千兆位网络饱和。

【讨论】:

    【解决方案3】:

    将多个 UDP 数据包合并为一个而不是一个接一个地发送它们有什么好处?

    可以节省每个数据报 8 个字节的 UDP 标头,从而减少通过线路发送的数据量。只需确保您发送的内容不超过 MTU 无 IP 和 UDP 标头大小,以避免在 IP 层产生碎片。

    此外,标准 POSIX 套接字 API 需要一个 send/sendto/sendmsg() 系统调用来发送或接收一个数据报,因此通过发送更少的数据报,一个系统调用更少,从而降低了整体延迟(每次调用大约几微秒)。 Linux 内核从 3.0 开始提供sendmsg()recvmmsg() 函数,用于在一个系统调用中发送和接收多个数据报。

    我知道如果大数据包损坏了,我就会丢失所有的

    没错。但是,如果协议根本无法处理 UDP 数据报丢失问题,那可能就没那么重要了——只要一个数据报丢失,它就会被破坏。

    【讨论】:

      【解决方案4】:

      这对于数据包大小很小(小于 100 字节)的情况很重要。 IP/UDP 标头至少为 28 字节。

      假设您有到服务器的流式连接,每个数据包包含 50 个字节,您的软件以每秒 1000 个数据包的速率发送数据包。

      实际有效负载为1000 * 50 bytes = 50000 bytes. 标头开销1000 * 28 = 28000 bytes 总字节数:50000 + 28000 = 87000 ==> 87 KBps

      假设你可以将每 3 个 UDP 数据包合并为一个数据包:

      标头开销1000 / 3 * 28 = 9333 总字节数:50000 + 9333 ===> 60 KBps

      这 - 在某些应用程序中 - 节省了很大一部分带宽。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多