如何为UDP协议进行拥塞控制?

时间:2011-12-30 20:25:44

标签: c linux udp

我有一个带有多个发送器/接收器的自定义UDP协议,旨在尽可能快地发送大型文件。它是基于客户端/服务器的。

如何检测LAN上的拥塞以降低发送UDP数据包的速度?

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

重新解释这个问题:拥塞控制算法如何工作以及如何检测拥塞?

5 个答案:

答案 0 :(得分:14)

这假设您必须使用UDP(首选TCP)。

从应用程序中,网络拥塞的唯一指示是IP数据包丢失。根据您的协议的具体情况,您可能希望对每个数据报输出进行编号,如果接收方发现它丢失了一些(或使它们无序),请向发送方发送一条消息(或多个)表示丢失了IP数据包并减速。

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

RTP在UDP和RTCP(实时传输控制协议)上运行,与RTP协同工作,提供QoS(服务质量)的措施,如丢包,延迟,抖动等,以便向发送方报告,以便知道何时放慢速度关闭或更改编解码器。

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

答案 1 :(得分:3)

延迟是检测拥塞的好方法。如果您的延迟开始上升,那么您应该放慢速度。丢失的数据包相当于延迟=无穷大。但是你永远不能确定数据包是丢失还是非常慢,所以你应该有一个超时来“检测”丢失的数据包。

答案 2 :(得分:3)

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

以下文章深入讨论了这些统计数据及其含义: DEI Tech Note 0021: Loss, Latency, and Speed

寻找一个好的解决方案已经成为许多研究和商业努力的主题。 不同的算法(TCPUDTMultipurpose Transaction Protocol等)使用不同的方法并做出不同的假设,都试图根据非常稀疏的数据弄清楚网络中发生了什么可用。

答案 3 :(得分:1)

我有以下想法:

  • 发件人发送数据。
  • 接收器等待几秒钟,然后计算吞吐率/秒
  • Receiver将接收数据包的速率(字节/秒)发送给发送方
  • 发件人计算其发送数据包的速率
  • 如果发件人的费率明显较高,请将其降低以匹配接收率。

或者,更先进的方法:

  • 发件人开始以预定义的最低费率(例如,1kb / s)发送
  • 接收方将计算出的接收率发送回发件人。
  • 如果接收率与发送率相同(考虑延迟),则将费率增加一个pct(例如,费率* 2)
  • 继续这样做,直到发送速率高于接收速率。
  • 持续监控费率,以便在需要时考虑带宽增加/减少率的变化。

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

答案 4 :(得分:0)

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

来自维基百科页面:

  

添加 - 增加/乘法 - 减少(AIMD)算法是一种反馈控制算法,因其在TCP拥塞避免中的使用而闻名。当拥塞发生时,AIMD将拥塞窗口的线性增长与指数减少相结合。使用AIMD拥塞控制的多个流最终会收敛以使用相同数量的竞争链路。