【发布时间】: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