繁体   English   中英

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

[英]UDPclient rate control in c#

我连续向远程电脑发送多个 udp 数据包。 问题是,如果数据量太高,通道之间的某个设备会遇到缓冲区溢出。 我打算限制/节流/控制 udp 数据包的发送速率。 有人可以给我一些有关如何找到最佳速率发送间隔的指南吗?

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

试错。 观点。

  • 建立一个仅用于发送控制命令的 secnod 连接(基于 UDP 或 TCP)。
  • 在那里发送有关丢失数据包等的统计信息。然后双方可以决定数据速率是否太高。
  • 可能从低开始然后提高数据速率,直到您看到丢失的数据包。

永远不要 (!) 假设所有数据包都会到达。 意味着:您需要(!)一种重新请求丢失数据包的方法。 即使在完美的条件下,数据包有时也会丢失。

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

然后试试这个:

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

一些注意事项: - 如果反向连接是 TCP,你会在那里有一些开销 - 如果反向连接是 UDP,你也可以在这里丢弃数据包(因为你正在淹没通道)并且发件人永远不会知道数据包被丢弃 - 算法以上不会解决丢失数据问题或乱序数据问题,它只会测量吞吐量。

尽管您建议我不建议使用 TCP over UDP,但我必须这样做。 在同一段落中,您指出测试的主要目的是测量吞吐量(即带宽),而在不重新发明整个 TCP 堆栈的情况下正确执行此操作的唯一方法是实际使用 TCP 堆栈。

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

如果此答案不适合您,则可能意味着您必须重新说明您对问题的要求。 他们有冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM