UDP:如何使网络连接上的 UDP 数据包的数据流量平滑

UDP: How make the data flow rate smooth for UDP packets over a network connection

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

问题:
一切正常,但由于我的服务器以高速率发送许多数据包,我的客户端无法赶上。这会导致数据包被丢弃。深入挖掘并阅读问题,我了解到有一个叫做 UDP packets pacing. Another link 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 来做?也欢迎对潜在调查提出任何建议!

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

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

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

您需要先在接口中添加fq纪律

tc qdisc add dev eth0 root fq (1)