我怎样才能做一个UDP协议的拥塞控制?

我有一个自定义UDP协议与多个发送器/接收器devise为尽快发送大文件。 这是基于客户端/服务器。

如何检测局域网上的拥塞情况,以减慢发送的UDP数据包的速率?

编辑:请不要评论使用UDP是否合适。 该协议使用UDP,但在到达时将数据包重新组装成整个文件。

重申一下这个问题:拥塞控制algorithm如何工作以及如何检测拥塞?

Solutions Collecting From Web of "我怎样才能做一个UDP协议的拥塞控制?"

这是假设你必须使用UDP(TCP将是首选)。

从应用程序内部,网络拥塞的唯一指示是IP数据包的丢失。 根据你的协议,你可能想要做一些事情,比如每一个数据报的编号,如果一个接收者看到它丢失了一些(或者不按顺序),发送一个或多个消息给发送者表示IP数据包丢失并减慢。

有一种称为RTP (实时传输协议)的协议,用于实时流传输应用。

RTP运行在UDP上,使用RTP的RTCP(实时传输控制协议)提供了像丢包,延迟,抖动等QoS(服务质量)的措施来报告给发送方,以便知道何时减慢或改变编解码器。

不是说你可以使用RTP,但是看看它是如何工作的可能是有帮助的。

延迟是检测拥塞的好方法。 如果您的延迟时间开始增加,那么您应该放慢速度。 丢失的数据包相当于latency = infinity。 但是,您永远无法确定数据包是丢失还是非常慢,因此您应该有一个超时来“检测”丢失的数据包。

流量控制本质上是一个难题,因为你真正知道的是当你发送一个数据包,当你收到一个数据包的时候。 像延迟,丢失,甚至速度等事情都是你必须计算和解释的统计数据。

以下文章深入讨论了这些统计数据及其含义: DEI技术说明0021:损失,延迟和速度

找到一个好的解决方案已经成为许多研究和商业努力的主题。 不同的算法( TCP , UDT , 多用途交易协议等)使用不同的方法并做出不同的假设,都试图根据非常稀疏的数据找出网络中正在发生的事情。

看来AIMD算法是他们在TCP和UDT协议中使用的,以避免拥塞。

从维基百科页面:

增加/增加 – 减少(AIMD)算法是一种反馈控制算法,它最擅长用于TCP拥塞避免。 当拥塞发生时,AIMD将拥塞窗口的线性增长与指数减少相结合。 使用AIMD拥塞控制的多个流将最终收敛以使用等量的争用链接。

我有以下想法:

  • 发件人发送数据。
  • 接收器等待几秒钟,然后计算吞吐率/秒
  • 接收方向接收方发送接收数据包的速率(字节/秒)
  • 发送方计算发送数据包的速率
  • 如果发送者的速率明显更高,则将其降低到与接收速率相匹配。

或者,更高级的方法:

  • 发送者开始以预定的最小速率发送(例如1kb / s)
  • Receiver将计算出的收款率发回给发件人。
  • 如果接收速率与发送速率相同(考虑到延迟),则以设定的比率(例如速率* 2)增加速率,
  • 继续这样做直到发送速率高于接收速率。
  • 如果需要,请继续监控速率以考虑带宽增加/减少速率的变化。

免责声明:我不是网络专家,这可能不适合你。