🎢 TCP滑动窗口:数据传输的"传送带"

4 阅读3分钟

知识点编号:006
难度等级:⭐⭐⭐(必掌握)
面试频率:🔥🔥🔥🔥


🎯 一句话总结

滑动窗口就像传送带,可以同时传多个包,不用一个一个等确认!🎢


🤔 为什么需要滑动窗口?

没有滑动窗口(停等协议)

发送:包1 → 等待ACK → 包2 → 等待ACK → 包3
时间:▓░░░░▓░░░░▓░░░░
      发 等 发 等 发 等

效率:很低!😢

有滑动窗口

发送:包1、包2、包3、包4(同时发)→ 等待ACK
时间:▓▓▓▓░░
      发发发发等

效率:高!😀

📊 滑动窗口结构

发送窗口(Send Window):

|-----|-----|-----|-----|-----|-----|-----|-----|
| 1| 2| 3| 4| 5| 6| 7| 8|
| 发送 | 发送 | 送未 | 送未 | 送未 | 发送 | 发送 | 达到 |
| 已确认 | 已确认 | 确认 | 确认 | 确认 |      |      |      |
|-----|-----|-----|-----|-----|-----|-----|-----|
        ↑                         ↑
      窗口左边界               窗口右边界
      
窗口分为4部分:
1️⃣ 已发送已确认:可以丢弃了
2️⃣ 已发送未确认:等待ACK
3️⃣ 未发送可发送:窗口内,可以发
4️⃣ 未发送不可发:窗口外,等待

窗口滑动:
收到ACK3 → 窗口右移
|-----|-----|-----|-----|-----|-----|-----|-----|
| 2| 3| 4| 5| 6| 7| 8| 9|

🎭 工作过程

发送方视角

窗口大小:5个包

初始状态:
[1可][2可][3可][4可][5可]  6  7  8  9
 ↑窗口开始                ↑窗口结束

步骤1:发送123
[1发][2发][3发][4可][5可]  6  7  8  9

步骤2:收到ACK1,窗口右移
 1  [2发][3发][4可][5可][6可]  7  8  9
     ↑窗口开始

步骤3:发送456
 1  [2发][3发][4发][5发][6发]  7  8  9

步骤4:收到ACK2、ACK3,窗口右移
 1   2   3  [4发][5发][6发][7可][8可]  9

接收方视角

接收窗口(Receive Window):

按序接收:
收到1 → 交给应用层 → 发送ACK1 → 窗口右移
收到2 → 交给应用层 → 发送ACK2 → 窗口右移

乱序接收:
期望:3
收到:4(乱序)
处理:缓存4,继续等3
发送:ACK2(期望收到3)

收到:3(终于来了!)
处理:交给应用层,同时交付4
发送:ACK4

💻 Java代码示例

设置窗口大小

Socket socket = new Socket("localhost", 8080);

// 设置发送缓冲区(影响发送窗口)
socket.setSendBufferSize(64 * 1024); // 64KB

// 设置接收缓冲区(影响接收窗口)
socket.setReceiveBufferSize(64 * 1024);

System.out.println("发送缓冲区: " + socket.getSendBufferSize());
System.out.println("接收缓冲区: " + socket.getReceiveBufferSize());

🐛 常见面试题

Q1:什么是TCP滑动窗口?有什么作用?

答案:

滑动窗口是TCP用于流量控制和提高传输效率的机制。

作用:
1. 提高效率:无需每个包都等ACK
2. 流量控制:接收方控制发送方速度
3. 可靠传输:配合重传机制保证可靠性

工作原理:
- 发送方维护发送窗口
- 接收方维护接收窗口
- 窗口大小动态调整
- 收到ACK后窗口右移

生活例子:
流水线生产:
不用等第1个产品完成才做第2个
可以同时生产多个产品(窗口大小)
完成一个,继续下一个(窗口滑动)

Q2:滑动窗口和流量控制的关系?

答案:

滑动窗口是流量控制的实现机制。

流量控制目的:
防止发送方发送过快,接收方处理不过来

滑动窗口实现:
- 接收方通过Window字段告知窗口大小
- 发送方根据窗口大小控制发送量
- Window=0时停止发送
- Window>0时继续发送

关系:
流量控制 = 滑动窗口 + Window字段

🎓 总结

滑动窗口的关键点:

  1. 提高效率:批量发送,无需逐个等待
  2. 动态调整:根据ACK和Window滑动
  3. 流量控制:防止接收方过载

记忆口诀

窗口内可发送 📤
收到ACK就滑动 ➡️
批量传输效率高 ⚡
流量控制不过载 🎯

文档创建时间:2025-10-31
作者:AI助手 🤖