慢启动
问题:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。
解决方法:因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。
具体来说,当新建连接时,cwnd(congestion window)初始化为1个最大报文段(Maximum Segment Size, MSS)大小,RFC 2581 规定,它的大小不超过 2MSS ,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就+1。这样cwnd的值就随着网络往返时间(Round Trip Time, RTT)呈指数级增长,事实上,慢启动的速度一点也不慢,只是它的起点比较低一点而已。
开始 ---> cwnd = 1
经过1个RTT后 ---> cwnd = 2*1 = 2
经过2个RTT后 ---> cwnd = 2*2= 4
经过3个RTT后 ---> cwnd = 4*2 = 8
如果带宽为W,那么经过RTT*log2W时间就可以占满带宽。
为了防止 cwnd 增长的过大,TCP 中还维护了另一个变量 ssthresh(slow start threshold),它称之为慢启动门限,这是一个阈值,当 cwnd 超过这个值的时候,慢启动算法结束,进入拥塞避免算法!
ssthresh 变量在一开始也是有默认值的,比如