【问题标题】:UDPclient rate control in c#c#中的UDPclient速率控制
【发布时间】:2010-11-16 14:03:29
【问题描述】:

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

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

【问题讨论】:

  • 如果你真的想测量吞吐量,那么尽可能多地发送并指望另一边。您不必节流来衡量最大吞吐量。
  • @Daniel Mošmondor。我认为你不知道问题是什么。请不要垃圾邮件。
  • 当然我不知道,因为你说:目标不是可靠地发送数据,而是测量最大吞吐量。 就测量而言,我的建议就是这样做的。
  • @DanielMošmondor 让我解释一下。如果您发送 udp 数据包而没有某种限制方法,则数据包最终会溢出端点之间的网络元素。发生这种情况时,端点只会丢弃数据包。发生这种情况时,您无法分辨端点之间的带宽。更不用说,电信公司使用的一些网络元素会将这种情况检测为数据包垃圾邮件,并立即丢弃来自该 ip 的每个 udp 数据包。还有效率问题。
  • @DanielMošmondor 如果您认为可以通过测量可以发送的数据量来测量带宽,那么当您可以在 Cat 5 电缆上发送高达每秒 1gb 的数据时,如何测量带宽?如果你相信你可以尽可能多地发送 udp 数据包,并且能够通过计算另一端来测量带宽,那么向全世界展示并证明我错了。

标签: c# networking udp bandwidth udpclient


【解决方案1】:

反复试验。点。

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

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

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

【讨论】:

  • 老实说,“决定”对于非机器人(人类)来说非常容易。以数学方式表示问题是非琐碎的。有没有关于这个主题的论文,研究?我应该谷歌的关键字是什么?我的背景不是计算机网络,所以...
  • 检查 RTP 协议。您面临的问题是实时语音/视频传输等标准问题。 RTP 使用的是 UDP,并且有这样的控制协议。
【解决方案2】:

然后试试这个:

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

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

【讨论】:

  • 谢谢丹尼尔。在这里查看我当前的实现stackoverflow.com/questions/4167278/…。如果我错了,请纠正我,据我了解,如果我发送数据 1 秒,而接收器接收数据 2 秒,这意味着我必须重新调整我的发送速率,直到我得到 1 秒发送和 1 秒接收?原谅我的语言。我不擅长解释自己。顺便说一下,这让我想起了一些关于带宽估计的论文。其中之一是 pathload.thanks。
  • 好吧,是时候开始努力了——你已经掌握了所有你需要的信息,现在进行试验,直到你做对了。程序员时不时会这样做,这很有趣,也是最宝贵的经验。玩得开心。
【解决方案3】:

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

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

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

【讨论】:

  • 叹息。我试图实现的是测量有多少数据可以流过一个通道。例如,在 1 mb 通道上,可以流过该通道的最大数据为 1 mb。使用tcp可以获得的带宽是不包括包头的好数据,不包括必须重传的数据。使用 tcp,你的结果总是比它低。加上 udp,你可以获得比带宽更多的统计信息。我很感激你想帮忙。但请。
  • UDP 也有标头。我每个协议都会有“松弛”。
  • 当然 udp 有标头。我从来没有说过 udp 没有标头,是吗?但是你能跟踪多少数据头消耗吗?你能跟踪 tcp 中有多少数据被重传了吗?
  • tcp 的问题是无法跟踪丢失了多少数据包。 tcp 用于带宽测量的另一个问题是数据重传和 tcp 启动缓慢。例如,您正在通过 100Mbits/s 通道发送 100Mbits 的数据。信道丢包率为50%。如果使用 tcp,结果会是信道是 50Mbits/s,这是错误的。主要关心的不是最终用户接收到多少“好”数据,而是通道可以传输多少带宽。当电信公司说他们提供 100Mbps/s 的带宽时,他们并不意味着用户会收到 100Mbps/s 的“好”数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多