> 技术文档 > 计算机网络-- TCP 滑动窗口与拥塞控制

计算机网络-- TCP 滑动窗口与拥塞控制


一、滑动窗口机制(Sliding Window)📤

💡 目的:实现 流量控制(Flow Control)

1. 基本概念

  • 滑动窗口是一种 接收端控制发送端速度 的机制。

  • 每个 TCP 报文头中有一个 Window Size 字段,表示接收方还能接收的字节数。

2. 工作原理

  • 发送方可以发送的数据量 ≤ 接收方通告的窗口大小

  • 随着接收方处理并确认(ACK)数据,窗口向前滑动,允许发送更多数据。

3. 示例图解:

    这个窗口如何动的可以去看

             当 A 不断发送数据包时,已发送的最后一个序号就往右移动,直到碰到了窗口的上边界,此时 A 就无法继续发包,达到了流量控制。

           

          但是当 A 不断发包的同时,A 也会收到来自 B 的确认包,此时整个窗口会往右移动,因此上边界也往右移动,A 就能发更多的数据包了。

             

           

         以上都是在窗口大小不变的情况下,而 B 在发给 A 的 ACK 包中,每一个都可以重新设置一个新的窗口大小,如果 A 收到了一个新的窗口大小值,A 会随之调整。

            如果 A 收到了比原窗口值更大的窗口大小,比如 win = 6,则 A 会直接将窗口上边界向右移动 1 个单位。

         

          如果 A 收到了比原窗口值小的窗口大小,比如 win = 4,则 A 暂时不会改变窗口大小,更不会将窗口上边界向左移动,而是等着 ACK 的到来,不断将左边界向右移动,直到窗口大小值收缩到新大小为止。

        

        OK,终于将流量控制问题解决得差不多了,你看着上面一个个小动图,给这个窗口起了一个更生动的名字,滑动窗口

4. 特点

  • 🌐 是端到端的流控机制

  • 📥 防止接收端被“灌爆”;

  • 📉 接收方处理慢时,窗口会减小,甚至为0,暂停发送。


二、拥塞控制机制(Congestion Control)🌐

💡 目的:防止过多数据注入网络导致拥塞

1. 拥塞窗口(Congestion Window, cwnd)

  • 是发送端维护的一个窗口大小,用于限制注入网络的数据量

  • 每次发送数据时,允许的数据量 ≤ min(滑动窗口, 拥塞窗口)


2. 四种核心算法

(1)慢启动(Slow Start)
  • 初始 cwnd = 1 MSS,每收到一个 ACK,就将 cwnd 增加 1 MSS。

  • 指数增长(1→2→4→8...)直到达到慢启动阈值 ssthresh

(2)拥塞避免(Congestion Avoidance)
  • 达到 ssthresh 后,进入线性增长阶段。

  • 每个 RTT 增加 1 MSS(变为 加法增长)。

(3)快重传(Fast Retransmit)
  • 接收方收到重复的 ACK(例如重复 3 次 ACK n),意味着丢包了。

  • 不等超时,立刻重传该数据段

(4)快恢复(Fast Recovery)
  • 不回到慢启动阶段,而是调整:

    • ssthresh = cwnd / 2

    • cwnd = ssthresh

    • 然后进入拥塞避免阶段。


3. 拥塞窗口图解(经典 TCP Tahoe & Reno 行为):

 cwnd ▲ Reno: | /\'\'\'\'\'\'\'\'\\ | /  \\ | /  \\ | /  \\__ +----------------------------→ 时间  ↖慢启动 ↖拥塞避免 ↖丢包快速重传

三、滑动窗口 vs 拥塞窗口 对比表

项目 滑动窗口 拥塞窗口 控制目的 控制接收方处理能力 控制网络拥堵状况 控制方 由 接收端控制发送端自己控制 存储在哪 报文的 Window Size 字段 发送方内存中的变量 动态调整方式 接收方 ACK 通告新窗口大小 根据网络 ACK/丢包动态调整 极限值 接收方缓存限制 网络状况决定的带宽上限

四、TCP 发送窗口 = min(滑动窗口, 拥塞窗口)

在实际发送过程中,TCP 的发送窗口大小取决于:

实际窗口 = min(接收端窗口, 拥塞窗口)

五、其他术语

  • MSS(Maximum Segment Size):TCP 一次发送的最大数据段大小,不包括 TCP 头部。

  • RTT(Round-Trip Time):往返时延,影响 cwnd 增长速率。

  • Zero Window:如果接收端通告窗口为 0,发送端需定时发送窗口探测包。