下面的这张图是一个拥塞控制的过程示例,在学习每一个协议的时候,可以对应图中相应的部分理解。
虽然叫“慢开始”,但是它的拥塞窗口(cwnd)增长的速度可一点也不“慢”。
使用慢开始算法后,每收到一个ACK,窗口值就加一;也就是意味着,每经过一个往返时间RTT,拥塞窗口cwnd就加倍。
这里的一个“往返时间”指把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。
慢开始门限 ssthresh(Slow Start Threshold)慢开始门限相当于慢开始“指数式增长”的一个阈值。
当 cwnd < ssthresh 时,使用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免拥塞避免的设计思路是让拥塞窗口的增长“慢下来”(相对于慢开始),呈线性增长,或者叫“加法增大”(Additive Increase)。
出现拥塞时当发现网络出现拥塞时(重传定时器超时),进行以下操作:
ssthresh = max(cwnd/2,2)
cwnd = 1
执行慢开始算法
快重传和快恢复就是发送方一连收到 3 个对同一个报文段的重复确认(3-ACK)时,发送方执行快重传和快恢复算法。
快重传(Fast Retransmission)
发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。
快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。
快恢复(Fast Recovery)
ssthresh = cwnd/2
cwnd = ssthresh
执行拥塞避免算法
可以留意一下“快恢复”与发现网络出现拥塞时(重传定时器超时)的“‘慢’恢复”的区别。
加法增大,乘法减小(AIMD)加法增大:拥塞避免阶段,拥塞窗口按照线性规律增大;
乘法减小:当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。
二者的结合就是所谓的AIMD算法。
【后记】
拥塞控制的算法这里只介绍了较为常用的4种,更详细的内容维基百科--TCP congestion control讲得也比较清楚。
接下来的两周可能会比较忙,没有办法更新博客了。最近对3B1B的动画引擎比较感兴趣,可能会写一些相关的内容。
最后,每一条留言都是我的动力(提前祝大家圣诞快乐了