侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

TCP拥塞控制机制详解

2025-12-8 / 0 评论 / 5 阅读

题目

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)原则