面试题答案
一键面试慢启动(Slow Start)
- 原理:
- 发送方初始化拥塞窗口(cwnd)为1个最大段长度(MSS)。每收到一个对新数据的确认(ACK),就将cwnd增加1个MSS。这种方式使得发送方在开始阶段缓慢增加发送速率,避免一下子向网络注入过多数据导致拥塞。
- 例如,初始cwnd = 1MSS,收到一个ACK后,cwnd变为2MSS,再收到一个ACK,cwnd变为3MSS,依此类推。
- 作用:在连接建立初期,以一种较为保守的方式逐渐探测网络的承载能力,为后续的数据传输找到合适的发送速率基础。
拥塞避免(Congestion Avoidance)
- 原理:
- 当cwnd增长到慢启动门限(ssthresh)时,进入拥塞避免阶段。此时,每收到一个ACK,cwnd增加1/cwnd个MSS。例如,cwnd = 10MSS时,收到一个ACK,cwnd增加1/10MSS。
- 这意味着cwnd的增长速度比慢启动阶段慢很多,以更加平缓的方式增加发送速率。
- 作用:在网络接近拥塞边缘时,避免发送速率增长过快导致拥塞发生,维持网络的稳定传输。
快重传(Fast Retransmit)
- 原理:
- 当发送方连续收到3个相同的ACK时,就认为该ACK对应的数据包已经丢失,不等该数据包的重传定时器超时,就立即重传该数据包。
- 例如,发送方发送了数据包1、2、3、4,数据包2丢失,接收方收到1、3、4,会连续发送3个对数据包1的ACK,发送方收到这3个相同ACK后,就重传数据包2。
- 作用:快速重传丢失的数据包,减少等待重传定时器超时的时间,提高数据传输效率,避免因长时间等待导致网络资源浪费。
快恢复(Fast Recovery)
- 原理:
- 当发生快重传(即收到3个重复ACK)时,执行以下操作:
- 将ssthresh设置为当前cwnd的一半。
- 将cwnd设置为ssthresh加上3倍的MSS(因为收到3个重复ACK,说明至少有3个数据包已经离开了网络,所以可以增加一定的窗口大小)。
- 开始执行拥塞避免算法,即每收到一个ACK,cwnd增加1/cwnd个MSS。
- 当发生快重传(即收到3个重复ACK)时,执行以下操作:
- 作用:在检测到数据包丢失但网络还没有完全拥塞的情况下,快速调整发送速率,避免进入慢启动阶段带来的较大传输延迟,尽快恢复到合适的传输速率。
协同工作机制
- 初始阶段:连接建立后,首先使用慢启动算法,快速探测网络状况,使cwnd指数增长。
- 接近拥塞:当cwnd达到ssthresh时,切换到拥塞避免算法,使cwnd线性增长,防止网络拥塞。
- 丢包处理:如果发生丢包(超时或收到3个重复ACK),采取不同措施。若超时,将ssthresh设置为当前cwnd的一半,cwnd重置为1MSS,重新进入慢启动阶段;若收到3个重复ACK,执行快重传和快恢复,调整ssthresh和cwnd,进入拥塞避免阶段。
- 综合效果:这些算法协同工作,通过动态调整发送方的拥塞窗口大小,在避免网络拥塞的同时,保证数据能够可靠地从发送方传输到接收方,根据网络实际情况不断调整传输速率,维持网络的稳定性和高效性。