首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UDP:如何通过网络连接使UDP数据包的数据流平滑

UDP:如何通过网络连接使UDP数据包的数据流平滑
EN

Stack Overflow用户
提问于 2020-07-02 09:57:18
回答 2查看 1K关注 0票数 1

场景:

使用提升Asio 1.69,我有一个运行在LinuxFedora4.9上的C++服务器和一个使用对等连接运行在Android10手机上的客户端。数据不断地从服务器发送到客户端,偶尔也会从客户端发送数据包到服务器。

问题:

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

因此,我首先尝试了以下几点:

代码语言:javascript
运行
复制
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套接字上调用赛索科普来实现的配置?欢迎对潜在调查提出任何建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-02 10:30:51

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

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

TCP有一个内建流量控制机构,其中客户端报告它在接收缓冲区中的空闲空间的数量。此信息在每个TCP段中都会报告,因此发送方总是知道它可以发送多少其他数据。也许为您的应用程序考虑切换到TCP是值得的?

票数 1
EN

Stack Overflow用户

发布于 2020-11-21 07:21:56

首先,您需要在接口中添加fq规则。

tc qdisc添加dev eth0根fq (1)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62693698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档