面试题答案
一键面试慢启动
- 触发条件:
- 连接刚刚建立时,发送方开始进行数据传输,此时进入慢启动阶段。
- 窗口大小变化过程:
- 初始化拥塞窗口
cwnd
为一个最大报文段长度(MSS)。 - 每收到一个对新报文段的确认(ACK),就将
cwnd
增加一个MSS大小。这意味着每经过一个往返时间(RTT),cwnd
就会翻倍。例如,初始cwnd = 1MSS
,收到第一个ACK后cwnd = 2MSS
,收到第二个ACK后cwnd = 3MSS
等,随着ACK的不断到来,cwnd
快速增长。
- 初始化拥塞窗口
- 转换条件:
- 当
cwnd
增长到慢启动门限(ssthresh)时,进入拥塞避免阶段。 - 如果发生超时(即一定时间内没有收到某个报文段的ACK),则将
ssthresh
设置为当前cwnd
的一半(四舍五入),同时将cwnd
重新设置为1个MSS,重新进入慢启动阶段。
- 当
拥塞避免
- 触发条件:
- 当
cwnd
达到慢启动门限ssthresh
时,进入拥塞避免阶段。
- 当
- 窗口大小变化过程:
- 每经过一个RTT,并且收到该RTT内所有报文段的ACK,就将
cwnd
增加1个MSS。例如,当前cwnd = 8MSS
,经过一个RTT收到所有ACK后,cwnd
变为9MSS
,窗口增长速度相对慢启动阶段明显减缓。
- 每经过一个RTT,并且收到该RTT内所有报文段的ACK,就将
- 转换条件:
- 如果发生超时,将
ssthresh
设置为当前cwnd
的一半(四舍五入),同时将cwnd
重新设置为1个MSS,进入慢启动阶段。 - 如果收到三个重复的ACK(即同一个报文段的ACK收到了4次),则执行快重传和快恢复算法,进入快恢复阶段。
- 如果发生超时,将
快重传
- 触发条件:
- 发送方连续收到三个重复的ACK时,触发快重传。这表明可能有一个报文段丢失,但网络还没有拥塞到需要超时重传的程度。
- 窗口大小变化过程:
- 快重传本身不直接改变
cwnd
大小,但它是快恢复的前置条件。在收到三个重复ACK后,发送方立即重传丢失的报文段,而不是等待超时。
- 快重传本身不直接改变
- 转换条件:
- 执行快重传后,立即进入快恢复阶段。
快恢复
- 触发条件:
- 执行快重传后进入快恢复阶段。
- 窗口大小变化过程:
- 将
ssthresh
设置为当前cwnd
的一半(四舍五入)。 - 然后将
cwnd
设置为ssthresh
加上3倍的MSS(因为收到了三个重复ACK,意味着有三个数据包已经离开了网络,所以可以适当增加窗口)。 - 之后每收到一个重复的ACK,
cwnd
增加1个MSS。当收到对重传报文段的ACK时,将cwnd
设置为ssthresh
,进入拥塞避免阶段。
- 将
- 转换条件:
- 收到对重传报文段的ACK后,进入拥塞避免阶段。
- 如果在快恢复阶段发生超时,将
ssthresh
设置为当前cwnd
的一半(四舍五入),同时将cwnd
重新设置为1个MSS,进入慢启动阶段。