指数退避和AIMD为什么都青睐数字2

Posted dog250

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指数退避和AIMD为什么都青睐数字2相关的知识,希望对你有一定的参考价值。

这是一个有意思的话题。

无论是指数退避还是AIMD,都涉及到了数字2。指数退避将当前等待时间乘以2,AIMD将当前cwnd除以2。这就有意思了,为什么是2?

我曾将AIMD与指数退避相联系,AIMD是指数退避的零存整取版本,在时间序列发生的退避行为是指数退避,如果引入了buffer,这意味着本来要冲突的事件可以被buffer暂延,但积累的冲突还是不可避免,这就是buffer overflow,通过乘性减的退避行为可以解决。所以,AIMD实际上就是时间序列上指数退避在buffer空间上的积累。

为什么是2?这是一个概率上的最佳保底数字,在一个多用户共享资源的场景,如果多用户之间互不可见,每一个用户均认为自己在独占资源,这趋向于资源利用率的最大化。如果一个用户假设还有别的用户共享资源,但事实上他们并不存在,那么这种假设将会带来资源浪费,因为出让的资源并没有被这些不存在的用户利用,相反,如果假设自己独占资源,只要能检测到冲突即可。

当一个用户检测到了冲突,他的最佳假设是,不止自己,至少还有另一个用户和自己共享资源,但假设另一个用户而不是另两个,另三个,另四个用户分享资源,对于自己的损失是最小的。

无状态是最好的状态,资源共享假设是无记忆的,出让了一半资源后,该用户仍然会假设自己独占资源,直到再次检测到冲突,继续出让一半的资源,如此反复。即只有在检测到冲突的时候,否则用户一直都会假设自己独占资源。

无论是指数退避,还是AIMD,都是在检测到有冲突发生时,出让一半资源给潜在的另一个用户。至于AIMD的加性增,那事实上是对空闲资源的探测,因为假设的另一个用户可能并不存在,冲突另有其因,亦或者有用户退出共享,有新的资源空闲。

这个策略真的是太美妙了,极简,无状态。每个用户都基于自私的假设,最终却能收敛到公平。

以上文字及其抽象,在纯技术视角,疑问便会很多,比如TCP在一个丢包窗口内又发生丢包,窗口应该继续下降吗?在哲学视角,回答是肯定的,但在技术视角,这可能会导致性能陡跌,TCP多次优化了这里的逻辑。此外,对于指数退避,大家似乎就连标准的正态分布都无法忍受,总有人把指数退避的2改成1.5甚至更低,却没认识到指数退避选择数字2还有另一原因,那就是计算的方便。

此外,对于CUBIC,AIMD系数早就不是1/2了,纯粹的AIMD并不拘泥于系数1/2,而是任意小于1的系数都行。所以本文并非讨论这些细节的,但只有在你彻底理解了TCP AIMD的细节,可能才能明白本文的含义。

浙江温州皮鞋湿,下雨进水不会胖。

以上是关于指数退避和AIMD为什么都青睐数字2的主要内容,如果未能解决你的问题,请参考以下文章

如何使用固定超时和尝试次数实现指数退避/延迟计算?

AWS 中的错误重试和指数退避

二进制指数退避算法

RxJava 中的指数退避

Golang指数退避算法

AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS