gpt4 book ai didi

c++ - UDP传输太快,Apache Mina不处理

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:56 25 4
gpt4 key购买 nike

我们决定使用 UDP 发送大量数据,例如坐标:

  • 客户端 [C++](使用轮询)
  • 服务器 [JAVA] [Apache MINA]

我的数据报最大只有 512 字节,以尽可能避免传输过程中的碎片。

每个数据报都有一个我添加的 header (里面有一个ID),这样我就可以监控:

  • 收到了多少数据报
  • 收到了哪些

问题是我们发送数据报的速度太快了。我们像第一个一样收到,然后损失很大,然后又得到一些,再次损失惨重。接收到的ID数据报的顺序是[1]、[2]、[250]、[251]......

问题也发生在本地(使用本地主机,只有 1 个网卡)我不关心丢失数据报,但这里不是简单的网络丢失(我可以处理)

所以我的问题是:

  • 在客户方面,我怎样才能做到最好:
    • 设置,还是套接字设置?
    • 如何尽可能多地发送而不是太多?
  • 在服务器上,Apache MINA 似乎说它自己管理〜“缓冲区套接字的大小”〜但是还有一些设置需要关心吗?
  • 在知道我们的连接已经允许我们在下载常规文件时至少拥有此带宽的情况下,是否有可能达到 1MB/s 之类的速度?

现在,当我们想要传输 ~4KB 的坐标信息时,我们必须添加 sleep 时间,以便我们等待 5 分钟或更长时间才能完成,这对我们来说是一个大问题,因为我们知道我们应该每分钟发送一次至少 10MB 坐标信息。

最佳答案

如果你想要可靠的传输,你应该使用 TCP。这将使您发送的速度几乎与较慢的网络和客户端一样快,而不会造成任何损失。

如果您想要高度优化的低延迟传输,不需要可靠,您需要 UDP。这将使您发送的速度与网络可以处理的一样快,但您也可以发送得更快,或者比客户端读取的速度更快,然后您就会丢失数据包。

如果您想要具有细粒度控制的可靠的高度优化的低延迟传输,您将最终在 UDP 之上实现 TCP 的自定义子集。听起来您不能或不应该这样做。

... how can I get the best settings, or socket settings

通常通过实验。

如果丢失数据包的原因是客户端速度慢,则需要使客户端更快。较大的接收缓冲区只能购买固定数量的净空(比如吸收突发),但如果您系统地变慢,任何合理大小的缓冲区最终都会填满。

但是请注意,这只能解决过多或可避免的掉落问题。即使您的客户端可以跟上,各种网络堆栈层(即使不留下一个盒子)也允许丢弃数据包,因此如果没有自定义重传逻辑,您仍然不能将其视为可靠(我们又回到实现 TCP) .

... way to send as much as I can without being to much?

您需要某种 ack/nack/back-pressure/throttling/congestion/任何从接收方返回到源的消息。这正是 TCP 免费提供给您的东西,您自己实现起来相对棘手。

Is it possible to reach something like 1MB/s ...

我刚刚看到 8MB/s 使用 scp over loopback,所以我会说。它使用 TCP 并且显然选择了 AES128 来动态加密和解密文件 - 如果您只是发送明文,获得同等性能应该是微不足道的。

关于c++ - UDP传输太快,Apache Mina不处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32888075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com