场景:
使用提升Asio 1.69,我有一个运行在LinuxFedora4.9上的C++服务器和一个使用对等连接运行在Android10手机上的客户端。数据不断地从服务器发送到客户端,偶尔也会从客户端发送数据包到服务器。
问题:
事情运行良好,但由于我的服务器以较高的速率发送了许多数据包,我的客户端无法赶上。这会导致数据包被丢弃。深入挖掘和阅读有关这个问题,我了解到有一个叫做UDP包起搏的东西。另一个链接这里。在我看来,这似乎是解决我的问题的一个潜在办法。至少,我想尝试避免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套接字上调用赛索科普来实现的配置?欢迎对潜在调查提出任何建议!
发布于 2020-07-02 10:30:51
您所描述的是一个流量控制问题。流控制中的问题不是如何调整数据包的速率,而是如何首先确定正确的速率。你设置了bytes_per_second = 1000000;
,但为什么?为什么不减半呢?为什么不是十分之一?也许你没有看到任何改善,因为这一比率仍然太高。
您的协议需要某种方式为特定的客户端找到合适的费率。这只能使用来自客户端的信息来完成。例如,您可以向数据包中添加序列号,并让客户端报告其最后处理的序列号。如果这个数字太老了,那么你需要放慢速度。
TCP有一个内建流量控制机构,其中客户端报告它在接收缓冲区中的空闲空间的数量。此信息在每个TCP段中都会报告,因此发送方总是知道它可以发送多少其他数据。也许为您的应用程序考虑切换到TCP是值得的?
发布于 2020-11-21 07:21:56
首先,您需要在接口中添加fq规则。
tc qdisc添加dev eth0根fq (1)
https://stackoverflow.com/questions/62693698
复制相似问题