面试题答案
一键面试TCP拥塞控制四种主要算法工作原理
- 慢启动(Slow Start)
- 原理:在连接建立初期,拥塞窗口(cwnd)初始化为一个最大报文段长度(MSS)。每收到一个对新发送报文段的确认(ACK),cwnd就增加一个MSS大小。这样cwnd呈指数增长,快速增加发送速率,以探测网络的承载能力。例如,初始cwnd = 1MSS,收到第一个ACK后,cwnd变为2MSS,收到第二个ACK后,cwnd变为4MSS,以此类推。
- 拥塞避免(Congestion Avoidance)
- 原理:当cwnd增长到慢启动门限(ssthresh)时,进入拥塞避免阶段。在这个阶段,每收到一个ACK,cwnd增加的幅度变为1/cwnd。也就是说,cwnd以线性方式增长,增长速度比慢启动阶段慢很多,从而避免网络拥塞。例如,cwnd = 16MSS时,收到一个ACK,cwnd增加1/16MSS,变为16 + 1/16MSS。当网络出现拥塞(超时或收到三个重复ACK)时,ssthresh被设置为当前cwnd的一半,cwnd重新设置为1MSS,再次进入慢启动阶段。
- 快重传(Fast Retransmit)
- 原理:接收方如果收到一个失序的报文段,会立即发送重复的ACK给发送方。当发送方收到三个重复的ACK时,就认为有一个报文段丢失了,不等该报文段的超时定时器超时,就立即重传丢失的报文段。这是因为三个重复ACK的出现,大概率意味着网络并没有发生严重拥塞,只是某个报文段丢失了,所以快速重传可以加快数据的传输,避免不必要的等待超时。
- 快恢复(Fast Recovery)
- 原理:当发送方收到三个重复ACK触发快重传后,执行快恢复算法。此时,ssthresh被设置为当前cwnd的一半,cwnd被设置为ssthresh加上3倍的MSS(因为收到了三个重复ACK,说明至少有三个报文段已经离开了网络,所以可以适当增加cwnd)。然后进入拥塞避免阶段,cwnd以线性方式增长。这样可以在快速恢复数据传输的同时,避免过快增加发送速率导致网络再次拥塞。
不同场景下拥塞控制策略的选择
- 网络环境良好,初始连接阶段
- 选择慢启动算法。因为此时对网络状况不了解,通过慢启动以指数方式快速探测网络的承载能力,尽快使发送速率达到合适水平,能有效利用网络资源,提高数据传输效率。
- 网络轻度拥塞(表现为少量重复ACK)
- 采用快重传和快恢复算法。少量重复ACK说明可能只是个别报文段丢失,并非网络严重拥塞。快重传能快速重传丢失报文段,快恢复可以在适当调整发送速率(ssthresh减半,cwnd调整)的基础上,快速进入拥塞避免阶段,继续以线性方式增加发送速率,维持较高的数据传输效率,同时避免进一步拥塞。
- 网络长期处于较高负载但未严重拥塞
- 适合拥塞避免算法。网络处于较高负载,需要稳定的发送速率增长方式,避免突然大量增加数据发送导致拥塞。拥塞避免算法以线性方式增长cwnd,能在一定程度上适应这种网络状况,保持网络相对稳定的运行。
- 网络严重拥塞(出现超时)
- 先采用慢启动算法。因为网络严重拥塞表明当前网络承载能力急剧下降,需要从较低的发送速率重新开始探测网络,慢启动从初始的较小cwnd值开始指数增长,可以较为保守地恢复网络传输,避免再次引发严重拥塞。