在网络路由中,CoDel(Controlled Delay,)是Van Jacobson和开发的中使用的调度算法 。 它旨在通过设置缓冲区中网络数据包的延迟限制来克服网络硬件(如路由器)中的缓冲膨胀 ,改善了(RED)算法的整体性能,解决了Jacobson 开发 RED 时抱有的一些误解,设计上 CoDel 比 RED 更容易管理和配置。
2012年,DaveTäht和Eric Dumazet为Linux内核编写了CoDel的实现,并以GNU通用公共许可证和3条款BSD许可证双重许可发布。 Dumazet的CoDel变体称为fq_codel,代表“控制延迟”。它在OpenWrt版本“ Barrier Breaker”中被用作标准(AQM)和数据包调度解决方案。自这之后,CoDel和fq_codel 迁移到了各种下游项目,例如Tomato ,dd-wrt和OPNsense 。
理论基础
CoDel背后的理论基于对缓冲区影响下分组交换网络中数据包行为的观察。 这些观察中的一些与排队的基本性质和缓冲膨胀的原因有关,另一些与队列管理算法的弱点有关。 CoDel的开发旨在解决缓冲膨胀问题。
缓冲膨胀
数据包在快速网络和慢速网络之间的网络链路传输时速度会变慢,尤其是在TCP会话开始时,突然出现数据包激增并且较慢的网络可能无法快速接受该突发时足够。缓冲区的存在是为了缓解这个问题,它给了快速网络一个存储数据包的地方,让慢速网络以自己的速度读取数据包。
拥有一个大而不断的缓冲区,这会导致传输延迟增加和交互性降低,尤其是在查看同一通道上的两个或多个同时传输时,这种情况称为缓冲区膨胀。 可用的通道带宽也可能最终未被使用,因为某些缓冲区可能被缓冲区阻塞,等待数据传送到较慢的目的地,因此可能无法到达某些快速的目的地。
好队列和坏队列
CoDel区分两种队列:
; 好队列
定义为不显示缓冲膨胀的队列。 通信突发只会导致队列延迟的暂时增加。 网络链接利用率最大化。
; 坏队列
定义为显示缓冲区膨胀的队列。 通信突发会导致缓冲区填满并保持填满,从而导致利用率低和缓冲区延迟不断增加。
为了有效地防止缓冲区膨胀, 主动队列管理 (AQM)算法形式的解决方案必须能够识别缓冲区膨胀的发生并通过部署有效的对策进行反应。
范雅各布森(Van Jacobson)在2006年断言,现有算法一直在使用错误的方法来识别缓冲区膨胀。 诸如RED之类的算法会测量平均队列长度,如果平均长度过大,则将其视为缓冲膨胀的情况。 雅各布森(Jacobson)在2006年证明,此度量不是一个好的指标,因为在通信突发情况下,平均队列长度会急剧增加。 然后,队列可以快速消散(好队列)或变为站立队列(坏队列)。 网络流量中的其他因素也可能导致误报或误报,从而导致不必要地部署了对策。 Jacobson建议,平均队列长度实际上根本不包含有关数据包需求或网络负载的信息。
Nichols和Jacobson引用了仅使用此度量标准的几个优点:
- 与RED相比,CoDel在整个带宽范围(从3到100Mbit/s)中使数据包延迟更接近目标值。 测得的链路利用率始终接近链路带宽的100%。
- MTU较低时,数据包延迟比MTU较高时低。 MTU越高,链路利用率就越高,而MTU越低,带宽越低,链路利用率就越好,从而降低了高带宽的公平利用率。
的 Greg White和Joey Padden也进行了仿真。
实现
CoDel 2012年5月就出现了完整实现,并已作为开源软件提供 。 它是在Linux内核中实现的(从3.5主线开始)。 DaveTäht将CoDel移植到了CeroWrt项目的Linux内核3.3中,这个项目涉及缓冲膨胀, CoDel 在此进行了详尽的测试。 2013年,CoDel开始在某些专有软件/turnkey带宽管理平台中作为选件出现。 FreeBSD在2016年将CoDel集成到11.x 和10.x 代码分支中。 从6.2版开始,实现随OpenBSD一起分发。
參考資料
外部連結
评论 (0)