AIMD 算法
AIMD 是一种反馈控制算法,它被 TCP/IP 堆栈的传输层中的 TCP 协议使用。 AI 阶段负责发送者的拥塞窗口的线性增长,其中没有检测到拥塞。 MD 阶段负责在检测到拥塞时对发送方的拥塞窗口进行指数缩减。这两个阶段可以存在多种组合:加法和乘法。
AIAD、MIAD 和 MIMD 是三个额外的组合。但他们不能确保公平。相反,AIMD 确保公平,同时与其他 TCP 流竞争网络带宽。当网络中没有拥塞时,MIMD 以指数方式增加拥塞窗口,结果拥塞的机会增加,并且大部分带宽被该特定流消耗,从而损害其他流的性能。由于其指数增长,拥塞发生得更加频繁。 MIMD 和 AIMD 没有达到稳定,所有的 TCP 流都没有收敛到使用网络带宽。
加法增加乘法减少(AIMD):
它被称为拥塞避免算法(但这是用词不当)。它并不能避免真正意义上的拥堵。事实上,没有拥塞避免算法。它非常小心地控制拥塞窗口的增长,以使进一步拥塞的可能性最小。拥塞窗口(cwnd)每 RTT 增加“一个”段,这是 AI 阶段。与慢启动不同,每收到一个“ACK”,cwnd 就会增加“一个”段。 cwnd 在检测到数据包丢失时减少“一半”,这是 MD 阶段。
示例:下载/上传文件时请参阅“剩余时间”。最初,速度会呈指数增长,剩余时间会更少。然后发生丢包,速度减半,剩余时间大约翻倍。如果进一步发生丢包,则速度进一步降低,时间再次翻倍。
AIMD的主要目标:
与“慢启动”阶段相比,AIMD 探测“慢”。慢启动以指数方式增加拥塞窗口大小(每个 RTT 加倍),而 AIMD 线性增加 cwnd(每个 RTT 增加 1)。引入 TCP 时,还没有拥塞控制机制。 TCP 发送方过去一次发送整个 cwnd 价值的数据包,而不关心中间设备的数据包丢失。路由器不能容忍数据包的突发,因此丢失了数据包。然后慢启动就是为了克服这种情况而设计的,因此被命名为慢启动。与最初的 TCP 发送速率和标准相比,它开始缓慢,后者不关心拥塞状态。
AIMD 的第二个目标是确保竞争带宽的流之间的公平性。如果网络中存在拥塞状态,则将 cwnd 减少一半,将网络使用量减少一半或更少,并允许其他 TCP 流(客户端)使用它们。当所有流都获得相同的带宽份额时,系统称为公平。 1000 段的 50% cwnd 是 500 段,100 段的 50 段,因此拥塞的 TCP 流给了其他 TCP 客户端适当的网络共享,并确保公平连接。
算法:
在每个 ACK 到达时,将 cwnd 增加 (1 ÷ cwnd) 并在网络中发送 1 个新段
- cwnd = cwnd + (1 ÷ cwnd)
- inflight = inflight – 1 + 1 // -1 因为我们收到了 ACK,+1 因为我们发送了 1 个新段
示例:假设我们收到 ACK 时 cwnd = 10
cwnd = 10 + (1 ÷ cwnd), since the cwnd increases by 1 per RTT,
means when all the ACK comes. So, for 1 ACK, cwnd increases by 1/cwnd.
inflight = 10 - 1 = 9 + 1, inflight must be equal to cwnd,
So, 1 new packet is send to compensate 1 ACK packet.
因此,如果所有段都被成功确认,cwnd 将“最终”增加“一”。
示例:假设 cwnd = 10 且 inflight = 10。当一个 ACK 到达时,cwnd 将变为 10.1,当第二个 ACK 到达时,cwnd 将变为 10.2,...。当第十个 ACK 到达时,cwnd 将变为 11。所以它从 10 个段开始,到这 10 个段的所有 ACK 到达时,cwnd 变为 11。
Important:
When slow start reaches ssthresh value, it simply handover the control to AIMD.
When packet loss occurs in slow start phase, then ssthresh sets to half of cwnd and AIMD phase begins.
When slow start is idle for 1 second, then it restarts by cwnd=initcwnd=1 segment.
When there is a packet loss during AIMD phase, then ssthresh reduces to half and cwnd resets to inticwnd and slow start phase restarts.
使用 AIMD 的协议
只有 TCP 协议使用 AIMD 除了慢启动重启来进行拥塞检测和采取纠正措施。
AIMD 与慢启动重启非常兼容。这个组合在几乎所有 TCP 中一起使用,即 Tahoe、Reno、NewReno 和 Cubic。当流程开始时使用 SSR,当 SSR 达到阈值时,AIMD 开始。当检测到拥塞时,AIMD 再次切换到 SSR。 AIMD 在网络公平性方面非常有效。它不会伤害其他 TCP 流。
AIMD 的性能因素
- 兼容性:今天,每个设备都在使用 TCP 的某些变体,具体取决于平台。 AIMD 是每个 TCP 不可分割的一部分。它与每个 TCP 变体兼容。拥塞避免基本上是让发送方知道某处链路或路由器拥塞并丢弃数据包的反馈方法。它侧重于'when'而不是'if' 。
- 有效性: AIMD 是最有效的拥塞避免算法。它在“当”链路上出现数据包丢失时起作用。它缓慢地探测网络并采取有效措施避免进一步的丢包。
- 响应性:它本质上是最敏感的。一旦检测到丢包,先前运行的算法就会停止并将控制权移交给 AIMD。当 AIMD 阶段进一步丢包时,立即将控制权交给慢启动重启。
AIMD算法的影响
例如,假设 cwnd 是 1000 个段。在 AIMD 阶段开始之前,会发生数据包丢失并且缓慢启动停止。乘法减少将使 cwnd 减少到 500 段(1000 的一半)。使用 AI 阶段,cwnd 将需要(大约)500 个 RTT 增长到 1000 个段(每个 RTT 增加 1)。如果一个 RTT 是 100 毫秒:500 个 RTT 将是 500 x 100 毫秒 = 50000 毫秒 = 50 秒!因此,AIMD 非常严重地影响了客户端的性能。
建议的解决方案
一种新的拥塞控制算法,称为高速,发展了。高速 TCP(cwnd = cwnd + a 用于 AI,cwnd = cwnd xb 用于 MD)。可扩展的 TCP(需要固定数量的 RTT 才能恢复到 cwnd 的原始值)。二进制增加拥塞控制 (BIC) [这是 CUBIC 的前身]。另一个高速 TCP (YeAH)。 CUBIC [旨在克服 BIC 的公平问题]。