最近找实习发现面试官们很喜欢问这个问题,印象中本科大二时的计算机网络那本书写得很详细,找来看了看便有了如下的梳理:
TCP进行拥塞控制的算法有四种:慢开始、拥塞避免、快重传和快恢复。
1.慢开始和拥塞避免
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
慢开始:当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立刻把大量数据字节注入到网络,就可能引起网络发生拥塞。先探测一下,即由小到大逐渐增大发送窗口(拥塞窗口)。使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限 ssthresh。
当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
当cwnd=ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1(报文段的个数)。
2.快重传:让发送方尽早知道发生了个别报文段的丢失。首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立刻发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。发送方只要一连收到3个重复确认,就知道接收方确实没有收到,应当立即进行重传(即,快重传)。这样不会出现超时,发送方也不会误认为出现了网络拥塞。
3.发送方知道现在只是丢失了个别的报文段,于是不启动慢开始,执行快恢复算法。此时,发送方调整门限值ssthresh=cwnd/2,同时cwnd=ssthresh,并开始执行拥塞避免算法。