Network programming UDP:如何使网络连接上的UDP数据包的数据流速率平滑

Network programming UDP:如何使网络连接上的UDP数据包的数据流速率平滑,network-programming,udp,asio,Network Programming,Udp,Asio,场景: 我使用了一个在Linux FEDORA 4.9上运行的C++服务器和一个使用对等连接在Android 10手机上运行的客户端。从服务器到客户端连续发送数据,偶尔从客户端到服务器发送数据包 问题: 事情进展顺利,但由于我的服务器以高速率发送许多数据包,我的客户端无法跟上。这会导致数据包被丢弃。通过深入挖掘和阅读这个问题,我了解到有一种东西叫做。另一个链接。在我看来,这是我问题的一个潜在解决方案。至少我想尝试避免UDP数据包的突发流,而不是尝试平滑流 因此,我首先尝试了以下方法: uint3

场景:
我使用了一个在Linux FEDORA 4.9上运行的C++服务器和一个使用对等连接在Android 10手机上运行的客户端。从服务器到客户端连续发送数据,偶尔从客户端到服务器发送数据包

问题:
事情进展顺利,但由于我的服务器以高速率发送许多数据包,我的客户端无法跟上。这会导致数据包被丢弃。通过深入挖掘和阅读这个问题,我了解到有一种东西叫做。另一个链接。在我看来,这是我问题的一个潜在解决方案。至少我想尝试避免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;
}
uint32字节/秒=1000000;
if(setsockopt(udp_套接字、SOL_套接字、SO_MAX_packing_RATE和bytes_per_second、sizeof(bytes_per_second))小于0){

你所描述的是一个问题。 流量控制中的问题不是如何调整数据包的速率,而是如何首先确定正确的速率。您已将
字节数/u\u秒设置为1000000;
,但为什么?为什么不将该速率减半?为什么不加十分之一?也许您没有看到任何改进,因为速率仍然太高

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


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

您需要先将fq规程添加到接口中

tc qdisc添加开发人员eth0根fq


我不知道什么是“平滑”是的,但UDP不可靠,包含UDP数据报的数据包将在网络上丢失。由于各种原因,这种情况随时都会发生。UDP不可靠,任何使用它的应用程序都必须做好丢失数据报的准备,或者具有请求重新发送丢失数据的应用层协议。我编辑了我的问题,指出这是一个P2P我有连接。我知道我在UDP中丢失了数据包,但如果我在服务器端降低数据速率,这种情况就不会发生。这真的很奇怪。UDP应该很快,对吗?但是,它不能在高数据速率下保持速度?它很“快”正是因为它没有很多内置在TCP中的安全机制,比如流控制。你看到的是没有流控制的结果。你写“平滑”时是指“窒息”吗哪一个不是英语单词?即使你将UDP压缩到每秒一个数据报,你仍然可以在包含UDP数据报的网络上丢失IP数据包。当然,这种情况会少很多,但有可能偶尔会发生。@RonMaupin为我的英语不好感到抱歉。我的意思是让它变得平滑。换句话说,让UDP数据流“平滑”.当然不是窒息:这真的是一个很好的信息@Malt。希望从这次讨论中得到更多类似的信息。当然。我在玩这个数字,看看我是否能产生影响。除了
那么\u MAX\u packing\u RATE
之外,还有什么其他的东西我可以用来尝试从这个角度影响事情吗?好的,你可以在使用中限制利率rspace。让你的代码在packets@programmer_of_the_galaxies您是否检查了
SO\u MAX\u packing\u RATE
是否适合您?它需要网络接口使用
fq
qdisc。我认为
SO\u MAX\u packing\u RATE
没有任何区别。我已经尝试了所有范围的值。什么是
fq
允许我控制起搏的inux工具?谈论TCP而不是UDP?