先介绍两个名词:
cwnd:拥塞窗口
ssthresh:慢启动阈值。(当cwnd到达拥塞窗口时,如果不出现超时或者冗余ACK时,将以线性增长速度增长)
TCP拥塞控制分为三个部分:
- 慢启动
- 拥塞避免
- 快速恢复
慢启动
在慢启动状态cwnd的值,以1个MSS开始并且每当传输的报文首次被确认就增加1一个MSS(翻倍)。
结束慢启动的条件
- 超时丢包
如果传输的分组在中途丢失,或者回传的ACK丢失,导致超时发生。TCP就会将cwnd重新设置为1,并将ssthresh设置为超时时cwnd的一半,当慢启动之后,cwnd到达ssthresh时,就会变为线性增长。
- 检测到三次冗余的ACK
如果检测到三次的冗余ACK,就会进入快速重传。(快速重传后面讲)
拥塞避免
拥塞避免状态:cwnd的值大约是上次遇到拥塞的一半,每次到达一个新的ACK时,就会增加一个MSS。
当出现超时时,就会结束拥塞避免的线性增长,进入慢启动状态。
当出现三个冗余ACK时,也会结束拥塞避免的线性增长,进入快速恢复状态。
快速恢复
当接收到三个冗余ACK时,会进入到快速恢复状态。
快速恢复状态:将cwnd值减半,ssthresh值也设置为cwnd减半,每收到一次冗余ACK,cwnd加1,当收到第一个非冗余ACK时,cwnd值变为ssthresh,进入拥塞避免状态。
如果cwnd减半之后,还没有收到第一个非冗余ACK,并且超时,状态就会变为慢启动。