【问题标题】:UDP: How make the data flow rate smooth for UDP packets over a network connectionUDP:如何使网络连接上的 UDP 数据包的数据流率平滑
【发布时间】:2020-10-22 21:31:08
【问题描述】:

场景:
使用 Boost Asio 1.69 我有一个在 Linux Fedora 4.9 上运行的 C++ 服务器和一个在 Android 10 手机上运行的客户端,使用点对点连接。从服务器到客户端不断地发送数据,偶尔还有一个数据包从客户端到服务器。

问题:
一切运行良好,但由于我的服务器以高速率发送许多数据包,我的客户端无法赶上。这会导致数据包被丢弃。深入挖掘并阅读该问题,我了解到有一个叫做UDP packets pacing 的东西。另一个链接here。在我看来,这似乎是我的问题的潜在解决方案。至少我想尝试避免 UDP 数据包流量的突发,而是尝试平滑流量。

所以我首先尝试了以下方法:

uint32_t bytes_per_second = 1000000;
if(setsockopt(udp_socket, SOL_SOCKET, SO_MAX_PACING_RATE, &bytes_per_second, sizeof(bytes_per_second)) < 0) {
    std::cout << "Unable to set socket max pacing rate" << std::endl;
}

但上面似乎没有任何影响。我为bytes_per_second 设置了不同的数字,但没有任何帮助,问题仍然存在。

问题:
如何有效地锻炼 UDP 数据包起搏?或者如何确保从我的 Linux 服务器端发送的数据包之间存在细微的差距?

这是我可以做的 linux 配置,还是我可以通过在 udp 套接字上调用 setsockopt 来做的事情?也欢迎对潜在调查提出任何建议!

【问题讨论】:

  • 不知道什么是smoothen,但是UDP是不可靠的,包含UDP数据报的包会在网络上丢失。由于各种原因,这种情况一直在发生。 UDP 是不可靠的,任何使用它的应用程序都必须准备好丢失数据报,或者具有请求重新发送丢失数据的应用层协议。
  • 我编辑了我的问题,指出我有一个 P2P 连接。我知道我在 UDP 中丢失了数据包,但如果我在服务器端放慢数据速率,这不会发生。它真的很奇怪。 UDP应该很快吧?但是,它无法在高数据速率下跟上速度?
  • 它之所以“快”,正是因为它没有许多 TCP 内置的安全机制,例如流控制。您看到的是没有流量控制的结果。
  • 你写的不是英文单词“smoothen”是指“smother”吗?即使您将 UDP 抑制到每秒一个数据报,您仍然可能在网络上丢失包含您的 UDP 数据报的 IP 数据包。诚然,这种情况发生的次数要少得多,但机会是偶尔会发生一次。
  • @RonMaupin 对不起我的英语不好。我的意思是让它顺利。换句话说,使UDP数据流“顺畅”。当然不是窒息:D

标签: network-programming udp asio


【解决方案1】:

您所描述的是Flow Control 问题。 流量控制的问题不是如何调整数据包的速率,而是如何确定正确的速率。你已经设置了bytes_per_second = 1000000;,但是为什么呢?为什么不是这个比率的一半?为什么不是十分之一?也许您没有看到任何改善,因为比率仍然太高。

您的协议需要某种方法来为特定客户找到合适的费率。这只能使用来自客户的信息来完成。例如,您可以将序列号添加到数据包中,并让客户端报告其最后处理的序列号。如果这个数字太旧,那么你需要放慢速度。

TCP 有一个built-in flow control mechanism,客户端在其中报告它在接收缓冲区中的可用空间量。此信息在每个 TCP 段中报告,因此发送方始终知道它可以发送多少额外数据。也许值得考虑为您的应用程序切换到 TCP?

【讨论】:

  • 这是非常好的信息@Malt。希望从这次讨论中得到更多类似的东西。当然。我正在玩那个数字,看看我是否能产生影响。除了SO_MAX_PACING_RATE,我还能用什么来尝试从这个角度影响事物?
  • 好吧,您可以在用户空间中进行速率限制。让您的代码在数据包之间等待
  • @programmer_of_the_galaxies 您是否检查过SO_MAX_PACING_RATE 是否适合您?它要求网络接口使用fq qdisc。
  • 我认为SO_MAX_PACING_RATE 没有任何区别。我已经尝试了所有范围的值。 fq 是什么?一个允许我控制节奏的 linux 工具?
  • man7.org/linux/man-pages/man8/tc-fq.8.html 谈论 TCP 而不是 UDP?
【解决方案2】:

你需要先在界面中添加fq学科

tc qdisc add dev eth0 root fq (1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2013-10-18
    • 2019-12-20
    相关资源
    最近更新 更多