4

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

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

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

每个数据报都有一个我添加的标题(里面有一个 ID),以便我可以监控:

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

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

问题也发生在本地(仅使用 localhost,1 个网卡) 我不关心丢失数据报,但这里不是由于网络导致的简单丢失(我可以处理)

所以我的问题是:

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

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

4

2 回答 2

2

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

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

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

...我怎样才能获得最佳设置或套接字设置

通常通过实验。

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

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

......如何发送尽可能多的东西而不是太多?

您需要某种 ack/nack/back-pressure/throttling/congestion/任何从接收器返回到源的消息。这正是 TCP 免费为您提供的那种东西,而要自己很好地实现它是比较棘手的。

是否有可能达到 1MB/s ...

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

于 2015-10-01T13:56:15.630 回答
-1

只有在不牺牲 QoS 的情况下可以丢失任意数量的数据报时,UDP 才是一个可行的选择。我不熟悉 Apache MINA,但所描述的场景类似于按顺序处理每个数据报的服务器。在这种情况下,所有在服务期间到达的数据报都将丢失 - 没有 UDP 数据报排队。就像我说的,我不知道 MINA 是否可以针对并行数据报处理进行调整,但如果不能,那只是工具选择错误。

于 2015-10-01T13:04:27.510 回答