题目
TCP拥塞控制机制详解
信息
- 类型:问答
- 难度:⭐⭐
考点
TCP拥塞控制原理,慢启动与拥塞避免,快速重传与快速恢复
快速回答
TCP拥塞控制的核心机制包括:
- 慢启动(Slow Start):指数增长拥塞窗口(cwnd)
- 拥塞避免(Congestion Avoidance):cwnd线性增长
- 快速重传(Fast Retransmit):收到3个重复ACK立即重传
- 快速恢复(Fast Recovery):cwnd减半后直接进入拥塞避免阶段
触发条件:
超时重传触发慢启动,重复ACK触发快速恢复
解析
一、核心原理
TCP拥塞控制通过动态调整拥塞窗口(cwnd)控制发送速率,关键机制:
- 慢启动:初始cwnd=1 MSS,每RTT翻倍(指数增长)
- 拥塞避免:达到慢启动阈值(ssthresh)后,每RTT增加1 MSS(线性增长)
- 快速重传:收到3个重复ACK时立即重传丢失报文(不等待超时)
- 快速恢复:重传后cwnd = cwnd/2 + 3,进入拥塞避免阶段
二、状态转换流程
# 伪代码示例
def on_packet_sent():
if cwnd < ssthresh:
cwnd *= 2 # 慢启动阶段
else:
cwnd += 1 # 拥塞避免阶段
def on_timeout(): # 超时事件
ssthresh = max(cwnd/2, 2)
cwnd = 1 # 重置为慢启动
retransmit_packet()
def on_dup_ack(count): # 重复ACK事件
if count == 3:
ssthresh = max(cwnd/2, 2)
cwnd = ssthresh + 3 # 快速恢复
retransmit_packet()三、最佳实践
- 初始ssthresh设置:通常为接收方通告窗口大小
- 拥塞信号处理:超时视为严重拥塞,重复ACK视为轻度拥塞
- 带宽探测:Linux中默认使用CUBIC算法替代传统AIMD
四、常见错误
- 混淆窗口类型:拥塞窗口(cwnd) vs 接收窗口(rwnd)
- 错误理解ssthresh:超时后ssthresh=cwnd/2,但cwnd重置为1
- 忽略ACK聚合:延迟ACK机制可能导致cwnd增长变慢
五、扩展知识
- 现代算法:BBR(基于带宽时延积)、CUBIC(三次函数增长)
- 显式拥塞通知(ECN):路由器主动标记IP头通知拥塞
- RFC文档:RFC 5681(标准定义)、RFC 6582(NewReno改进)
六、面试回答要点
描述完整状态机:
1. 连接建立后进入慢启动
2. 达到ssthresh转拥塞避免
3. 重复ACK触发快速重传/恢复
4. 超时触发慢启动重置
5. 强调乘法减(Multiplicative Decrease)和加法增(Additive Increase)原则