Skip to content

介绍tcp的滑动窗口和拥塞控制

滑动窗口拥塞控制是 TCP(传输控制协议)确保可靠传输和网络效率的核心机制: - 滑动窗口:用于流量控制,通过动态调整窗口大小,控制发送方发送数据的速率,避免接收方缓冲区溢出。 - 拥塞控制:用于网络拥塞管理,通过算法(如慢启动、拥塞避免)调节发送速率,防止网络过载。


1. 滑动窗口

是什么

滑动窗口是 TCP 的流量控制机制,基于接收方的缓冲区容量,动态调整发送方可连续发送的数据量(窗口大小),无需等待每次确认。

工作原理

  • 窗口大小
  • 由接收方在 TCP 报头中声明(Window 字段,单位字节)。
  • 表示接收方当前可接受的数据量。
  • 滑动过程
    • 当发送方发送窗口内的数据后,会等待接收方对这些数据进行确认。
    • 接收方收到数据后,会发送 ACK 消息,同时在 ACK 中告知下一个期望的序号。
    • 收到 ACK 后,发送方将窗口右移,视为数据已被成功接收,并可以在空出的窗口中发送新数据。
  • 关键点
  • 发送窗口接收窗口
  • 窗口为 0 时,发送方暂停(零窗口探测)。

示例

  • 接收窗口 = 4000 字节,发送方发送 1000 字节:
  • 窗口剩余 3000。
  • 接收方 ACK 后,窗口滑动,恢复 4000。

特点

  • 高效:连续发送,减少等待。
  • 动态:随接收方能力调整。

2. 拥塞控制

是什么

拥塞控制是 TCP 防止网络过载的机制,通过动态调整拥塞窗口(Congestion Window, cwnd),控制发送速率,避免数据包丢失和网络拥堵。

工作原理

  • 核心变量
  • cwnd:拥塞窗口,限制发送方未确认数据量。
  • ssthresh:慢启动阈值,决定算法切换。
  • 实际窗口
  • 发送窗口 = min(接收窗口, 拥塞窗口)。
  • 四个阶段
  • 慢启动(Slow Start)
    • cwnd 从 1 MSS(最大报文段)开始,每收到 ACK 翻倍(指数增长)。
    • 直到 cwnd ≥ ssthresh。
  • 拥塞避免(Congestion Avoidance)
    • cwnd 线性增长(每轮次 +1 MSS)。
    • 预防拥塞。
  • 快速重传(Fast Retransmit)
    • 收到 3 个重复 ACK,立即重传丢失包。
    • cwnd 减半,ssthresh = cwnd。
  • 快速恢复(Fast Recovery)
    • cwnd = ssthresh + 3,线性增长至稳定。

示例

  • 初始:cwnd = 1 MSS,ssthresh = 16 MSS。
  • 慢启动:1 -> 2 -> 4 -> 8 -> 16(达 ssthresh)。
  • 拥塞避免:16 -> 17 -> 18。
  • 丢包:cwnd 减半(如 9),ssthresh = 9,进入快速恢复。

算法实现

  • 丢包检测
  • 超时(RTO):cwnd 回退到 1,慢启动。
  • 3 个重复 ACK:快速重传 + 恢复。

滑动窗口与拥塞控制的关系

  • 区别
  • 滑动窗口:端到端流量控制,关注接收方能力。
  • 拥塞控制:网络层控制,关注网络状态。
  • 联系
  • 实际发送速率受两者共同限制:min(接收窗口, 拥塞窗口)
  • 滑动窗口保证接收不溢出,拥塞控制保证网络不拥堵。

延伸与面试角度

  • 滑动窗口优化
  • 窗口缩放:TCP 选项扩展窗口(大于 64KB)。
  • 零窗口探测:发送 1 字节探测接收方。
  • 拥塞控制变种
  • TCP Tahoe:丢包后慢启动。
  • TCP Reno:快速重传 + 恢复。
  • TCP Cubic:Linux 默认,窗口增长更平滑。
  • 实际应用
  • HTTP 下载:滑动窗口控制速率,拥塞控制避免丢包。
  • 面试点
  • 问“滑动窗口”时,提流量控制和 ACK。
  • 问“拥塞控制”时,提慢启动和快速重传。

总结

滑动窗口通过接收方窗口实现流量控制,拥塞控制通过 cwnd 和算法(如慢启动、拥塞避免)管理网络负载。二者协同确保 TCP 高效可靠。面试时,可画窗口图或提 TCP Reno,展示理解深度。