面试题答案
一键面试检测拥塞
- 基于丢包检测:
- TCP通过检测数据包的丢失来推断拥塞的发生。当发送方在重传超时(RTO)时间内没有收到某个数据包的确认(ACK)时,就认为该数据包可能丢失,进而推测网络出现了拥塞。例如,在一个简单的TCP客户端 - 服务器应用中,客户端发送数据后,若超过设定的RTO时间仍未收到服务器的ACK,就启动拥塞处理机制。
- 此外,TCP还通过快速重传机制来更快地检测丢包。当发送方连续收到三个相同的ACK时,就认为中间的数据包已经丢失,此时不必等待RTO超时,直接重传该数据包并进行拥塞控制。
- 基于延迟检测:
- 测量往返时间(RTT),如果RTT显著增加,这可能意味着网络出现了拥塞。因为在拥塞情况下,数据包在网络中的排队时间会变长,导致RTT增大。例如,可以在发送数据包时记录发送时间,收到ACK时记录接收时间,两者之差即为RTT。当连续多个RTT值明显高于正常水平时,可判断为拥塞。
调整发送速率
- 慢启动:
- 当连接建立或拥塞窗口(cwnd)重置时,cwnd初始化为一个较小的值(通常为1个最大段大小MSS)。每收到一个新的ACK,cwnd就增加一个MSS大小。这样,cwnd会以指数级的速度增长,快速探测网络的可用带宽。例如,开始时cwnd = 1MSS,收到第一个ACK后,cwnd变为2MSS,收到第二个ACK后,cwnd变为3MSS,以此类推。
- 拥塞避免:
- 当cwnd增长到慢启动门限(ssthresh)时,进入拥塞避免阶段。在这个阶段,每收到cwnd个ACK,cwnd才增加1个MSS。相比慢启动的指数增长,此时是线性增长,以避免过快占用过多网络资源导致拥塞。例如,若cwnd = 16MSS,ssthresh = 16MSS,收到16个ACK后,cwnd才变为17MSS。
- 快速重传和快速恢复:
- 当发生快速重传(连续收到三个相同ACK)时,执行快速恢复。首先将ssthresh设置为当前cwnd的一半,然后将cwnd设置为ssthresh加上3倍的MSS(因为收到三个ACK,意味着网络可能还有一定的带宽)。之后,cwnd进入拥塞避免阶段,线性增长。例如,当前cwnd = 32MSS,ssthresh = 32MSS,发生快速重传后,ssthresh变为16MSS,cwnd变为16MSS + 3MSS = 19MSS,然后进入拥塞避免。
- 拥塞发生后的调整:
- 当发生超时(RTO超时未收到ACK)时,ssthresh设置为当前cwnd的一半,cwnd重置为1个MSS,重新进入慢启动阶段。这是一种较为保守的策略,以大幅降低发送速率,缓解网络拥塞。
具体机制
- 窗口机制:
- TCP使用拥塞窗口(cwnd)和接收窗口(rwnd)来控制数据发送量。发送方的发送窗口大小为min(cwnd, rwnd)。rwnd由接收方通告,反映接收方的接收能力,而cwnd根据拥塞控制算法动态调整,确保发送速率与网络状况相匹配。
- ACK机制:
- ACK不仅用于确认数据的接收,还在拥塞控制中起到关键作用。发送方根据ACK的返回情况来调整cwnd。例如,通过ACK的到达速率和数量来判断网络的拥塞程度,进而决定是采用慢启动、拥塞避免还是其他拥塞控制策略。
- 定时器机制:
- 重传定时器(RTO)用于在数据包丢失时触发重传和拥塞处理。合理设置RTO至关重要,若RTO设置过短,可能会导致不必要的重传;若设置过长,会使网络拥塞不能及时得到处理。此外,还有其他定时器如持续定时器用于处理窗口更新等情况,辅助整个拥塞控制过程。