【问题标题】:UDP sendto() and recvfrom() max buffer sizeUDP sendto() 和 recvfrom() 最大缓冲区大小
【发布时间】:2017-06-21 19:49:14
【问题描述】:

我了解可用于这些函数的默认最大缓冲区大小为 65507(5535 - IPv4 标头 - UDP 标头)。但是,有没有办法改变这种情况?我需要能够发送更大的缓冲区 ~66000 字节。我尝试使用 setsockopt() 函数,但它似乎不起作用。

谢谢!

【问题讨论】:

  • 你不能分割你的缓冲区,用额外的位标记它来知道顺序吗?
  • 看来我得想出一个这样的方案了。
  • 5535 应该是 65535

标签: c++ c


【解决方案1】:

没有。

UDP 仅提供数据报作为 IP 数据包的数据部分,IP 数据包具有 16 位长度字段,因此将数据限制为 2^16 字节,包括标头,或 65507 字节用于 UDP 数据部分(假设没有ipv4 选项),没有办法用 UDP 处理更大的数据包,除了将它们分成几个数据包并自己处理重组等。

【讨论】:

  • 感谢您的澄清。
【解决方案2】:

此外,由于MTU 的限制,封装的 IP 数据包可能会在此过程中丢失“大”UDP 数据包。每个片段都可能丢失,UDP 中没有恢复机制。因此,虽然 UDP 有效负载的理论限制约为。 64kB 实际限制在 1kB 左右。

【讨论】:

  • 这是很重要的一点。一个 65500 字节的 UDP 数据包被分片成以太网大小的片段,这会将 1% 的底层片段丢失率变成约 37% 的 UDP 数据包丢失率。大 UDP 数据包 - 不要这样做!
  • 在我工作的地方,我们通过在私有子网上使用专用接口来处理带有大数据包的 UDP 流量(以及防止周期性 ARP 丢弃的静态 ARP 条目)来解决这个问题。但是,如果您不能这样做,请为丢弃的数据包做好准备。
【解决方案3】:

UDP 规范在 UDP 标头中为数据包大小提供了 16 位,这意味着您一次发送的数据不能超过 65k。您无法更改此设置。

您必须将数据分成多个数据包。 使用 TCP 而不是 UDP 会使事情变得更简单,因为完整性和接收顺序得到保证。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多