知识点编号: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:发送1、2、3
[1发][2发][3发][4可][5可] 6 7 8 9
步骤2:收到ACK1,窗口右移
1 [2发][3发][4可][5可][6可] 7 8 9
↑窗口开始
步骤3:发送4、5、6
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字段
🎓 总结
滑动窗口的关键点:
- 提高效率:批量发送,无需逐个等待
- 动态调整:根据ACK和Window滑动
- 流量控制:防止接收方过载
记忆口诀:
窗口内可发送 📤
收到ACK就滑动 ➡️
批量传输效率高 ⚡
流量控制不过载 🎯
文档创建时间:2025-10-31
作者:AI助手 🤖