TCP拥塞控制
TCP拥塞控制的三种方式:
慢启动、拥塞避免、快速恢复
慢启动
当一条TCP连接开始时,cwnd的值是一个很小的MSS值,这使得初始发送速率大约为MSS/RTT。
在慢启动状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加一个MSS,直
到出现超时或者丢包现象。
每增加一个MSS的长度,就会多发送一个MSS长度的报文段。
因此慢启动状态下,发送速率是以指数形式增加的。
例如:
一个MSS/RTT的速率被记作一个α。
则第一次传输后为2α。(2的一次方)
第二次传输后为4α。(2的二次方)
第三次传输后为8α(2的三次方)
慢启动的结束也是很有意思的:
如果存在一个拥塞,则TCP发送方将cwnd重新置为1并重新开始慢启动过程。
并且将第二个状态变量ssthresh(“慢启动阈值”)设置为cwnd/die
第二种方式是:
速率直接与ssthresh相关联,即检测到拥塞的时候,ssthresh就减少一半,当到达或者超过
ssthresh时,结束慢启动并且TCP转移到拥塞避免模式。
最后一种方式:
检测到三个亢余ACK,TCP就执行一种快速重传,并且进入到快速恢复状态。
拥塞避免
一旦进入拥塞避免状态,cwnd的值大约为上一次遇到阻塞的值的一半。
这也导致TCP无法通过一个RTT就将cwnd的值翻倍,而时每个RTT只将cwnd的值增加一个MSS,
而不是像慢启动一样进行指数形式增长。
拥塞避免的结束和慢启动差不太多,如果出现超时,cwnd的值被置为1个MSS。
丢包出现,ssthresh的值被置为cwnd的一半。
快速恢复
在快速恢复中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个亢余ACK,cwnd增
加一个MSS。最终,当对丢失报文段的最后一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。
但是如果出现超时,快速恢复在执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态。
总结
TCP拥塞控制在每个RTT时间内,cwnd线性(加性)增加1MSS,然后出现三个亢余ACK事件时,
cwnd减半(乘性减)。
因此TCP拥塞控制通常被称为“加性增、乘性减。”
下面是TCP拥塞控制造成的一种“锯齿”行为。