c#中的UDP客户端速率控制

我连续发送多个udp数据包到远程PC。 问题是,如果数据量太高,某些设备之间的某个通道会遇到缓冲区溢出。 我打算限制/限制/控制udp数据包的发送速率。 谁能给我一些关于如何找到最佳费率发送间隔的指导?

顺便说一句,请停止建议tcp over udp。 目标不是可靠地发送数据,而是测量最大吞吐量。

试错。 点。

  • 组成一个仅用于发送控制命令的secnod连接(基于UDP或TCP)。
  • 发送有关丢失数据包等的统计信息。然后双方可以决定数据速率是否过高。
  • 可能会启动低电平然后再提高数据速率,直到看到丢失的数据包。

从不(!)假设所有数据包都将到达。 意思是:你需要(!)一种方法来重新获取丢失的数据包。 即使在完美的cnoditions下,包也会丢失。

如果损失是可以的并且只应该最小化,那么统计方法几乎是我看到处理这个问题的唯一方法。

尽管你提出我不建议TCP over UDP,但我必须这样做。 在同一段中,您指出测试的主要目的是测量吞吐量 – 即带宽 – 并且只有在不重新发明整个TCP堆栈的情况下正确执行它才能实际使用TCP堆栈。

TCP的大部分设计用于处理流量控制问题,并且当使用TCP流时,您将获得您所需要的 – 给定连接的最大带宽,轻松且没有“温水发明”。

如果这个答案不适合您,那可能意味着您必须重新陈述您对问题的要求。 他们发生冲突。

然后尝试这个:

  • 从1KB大小的数据包开始(例如)。
  • 对于他们来说,计算每秒可以发送多少数据包 – 例如 – 1GB ethernet = 100MBytes原始带宽 – > 100000个数据包
  • 创建一个打包所以前4个字节将是序列号,其余可以是任何东西 – 如果你在这里测试,用零填充或噪音(随机数据)
  • 在发送方,创建数据包并以RATE(先前计算)的速度推送它们一秒钟。 计算花费的时间,以及restSleep()剩余的时间,等待新的时间段。
  • 在接收端,收集数据包并查看他们的序列号。 如果数据包丢失,请向发送方发送(另一个连接)一些信息。
  • 发送者,关于丢失数据包的信息,应该做一些像RATE = RATE * .9 – 将发送率降低到前一个的90%
  • 如果没有收到任何“丢失数据包”消息,发送者应该每隔几秒逐渐增加速率(比如1%)
  • 经过一段时间后,你的RATE会收敛到你想要的东西

一些注意事项: – 如果反向连接是TCP,那么你将有一些开销 – 如果反向连接是UDP,你也可以在这里丢弃数据包(因为你充斥了信道)并且发送者永远不会知道数据包被丢弃 – 算法以上不会解决丢失的数据问题或无序数据问题,它只会测量吞吐量。

Interesting Posts