C语言 如何对UDP协议进行拥塞控制



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

如何检测LAN上的拥塞以减慢发送UDP数据包的速率?

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

换句话说:拥塞控制算法如何工作以及如何检测拥塞?

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

从应用程序内部来看,网络拥塞的唯一指示是IP数据包的丢失。根据您的协议,您可能想要做一些事情,例如为每个传出的数据报编号,如果接收方发现丢失了一些(或使它们无序),则向发送方发送一条(或多条)消息,以表明有IP数据包丢失并减慢速度。

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

RTP运行在UDP和RTCP(实时传输控制协议)上,RTP提供了QoS(服务质量)的措施,如数据包丢失,延迟,抖动等,向发送方报告,以便它知道何时减速或更改编解码器。

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

延迟是检测拥塞的好方法。如果您的延迟开始增加,那么您可能应该放慢速度。丢失的数据包相当于延迟=无穷大。但是您永远无法确定数据包是丢失了还是速度很慢,所以您应该设置一个超时来"检测"丢失的数据包。

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

下面的文章将深入讨论这些统计数据及其意义:DEI技术说明0021:损耗、延迟和速度

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

我有以下想法:

  • 发送方发送数据。
  • 接收器等待几秒钟,然后计算吞吐量/s
  • 接收方向发送方发送接收包的速率(字节/秒)
  • 发送方计算其发送数据包的速率
  • 如果发送者的速率明显高,降低它以匹配接收率。

或者,更高级的方法:

  • 发送方以预定义的最小速率开始发送。1kb/s)
  • 接收方将计算出的接收速率返回给发送方。
  • 如果接收速率与发送速率相同(考虑延迟),则将速率增加一个设定的pct(例如。速率* 2)
  • 一直这样做,直到发送速率大于接收速率。
  • 保持监控速率,以解释带宽的变化,如果需要增加/减少速率。

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

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

来自维基百科页面:

AIMD算法是一种反馈控制算法,以其在TCP拥塞避免中的应用而闻名。AIMD结合了拥塞窗口的线性增长和发生拥塞时的指数减少。使用AIMD拥塞控制的多个流最终会收敛到使用等量的争用链路。

最新更新