当前位置: 首页 > news >正文

拒绝“停下来傻等”:大白话讲透滑动窗口协议 (Sliding Window)

拒绝“停下来傻等”:大白话讲透滑动窗口协议 (Sliding Window)

兄弟们,咱们学计算机网络的,最痛苦的莫过于背那些协议细节。特别是到了传输层,什么 TCP、UDP、三次握手、四次挥手,头都大了。

但在这堆协议里,有一个设计简直是**“天才般的发明”**,它凭借一己之力,把网络传输效率拉升了 N 个档次。

没错,就是滑动窗口协议(Sliding Window Protocol)

如果没有它,你的网速可能至今还停留在 56K 猫的时代,下载一部电影得等到下个世纪。今天咱们就用最通俗的话,把这个面试必考、工作必用的概念给盘明白。


1. 为什么我们需要“窗口”?(从傻瓜式传输说起)

在滑动窗口出现之前,最原始的传输方式叫**“停止-等待”协议(Stop-and-Wait)**。

它的逻辑是这样的:

你(发送方):给,这是第 1 包数据。
(停下来,盯着屏幕,等待…)
对方(接收方):收到第 1 包了,ACK!
:好,给,这是第 2 包数据。
(继续停下来等待…)

这像不像你那个强迫症晚期的同事?发一条微信,必须等你回了“收到”,他才肯发下一条。

缺点显而易见:
大部分时间都在。网络这根“管子”是空的,带宽被极度浪费。如果这是跨洋传输,一来一回(RTT)几百毫秒,这速度能慢到让你怀疑人生。

于是,工程师们想:我能不能不管你会没回,先一口气多发几条?

这就有了流水线(Pipelining),而控制这个流水线怎么流的机制,就是滑动窗口


2. 什么是滑动窗口?(核心机制)

想象一下,你有一长串带有编号的数据包要发:1, 2, 3, 4, 5, 6, 7, 8 ...

滑动窗口就是一个框,框住了一部分数据。

  • 窗口大小(Window Size):假设是 3。
  • 规则:只要是在框里的数据,你都有资格直接发出去,不用等对方回复

此时的状态:

窗口框住了[1, 2, 3]

  1. 你一口气把1, 2, 3全发了。
  2. 当你收到1的确认(ACK)后,说明1搞定了。
  3. 窗口向右滑一格!现在的框变成了[2, 3, 4]
  4. 哎?4进入了窗口,你立马把4发出去。

你看,这个过程是连续的、流动的。只要对方确认得快,你的窗口就滑得快,数据就像流水一样源源不断地发出去,根本不用停下来傻等。


3. 两种流派:GBN vs SR (面试必问)

虽然原理简单,但具体怎么实施,江湖上分成了两大门派。主要分歧在于:如果中间丢包了,怎么办?

比如你发了1, 2, 3, 4, 5,结果2号包在半路丢了,但3, 4, 5顺利到达了。

门派一:回退 N 步 (Go-Back-N, GBN) —— “连坐制”

GBN 的逻辑非常霸道,也叫累积确认

  • 接收方:我很死板。我收到了1,我想要2。你发来了3, 4, 5我不要!统统丢掉!我只要2
  • 发送方:我看迟迟收不到2的确认,超时了。行吧,既然2丢了,那从2开始,后面的3, 4, 5虽然我发过,但我也当它们废了。全部重发!

特点:

  • 接收方很简单,不需要缓存乱序的包。
  • 发送方心态容易崩:一旦丢一个包,后面发的一堆都白费了,网络利用率在丢包率高时会骤降。

门派二:选择性重传 (Selective Repeat, SR) —— “精准扶贫”

SR 的逻辑就理智多了。

  • 接收方:我收到了1。哎呀2丢了?没事,3, 4, 5我先缓存收着,那是好东西。我给你发个 ACK 告诉你要重传2
  • 发送方:收到通知,发现只有2没到。好,我**只重发2**。一旦2到了,接收方把缓存里的3, 4, 5拼起来,一起提交上去。

特点:

  • 效率极高,不浪费带宽。
  • 代码复杂,接收方和发送方都需要维护更复杂的逻辑和缓存。

4. 这里的“坑”:TCP 的滑动窗口

上面说的是理论模型,现实中的 TCP 协议比这更鸡贼。TCP 的滑动窗口主要干两件事:

1. 流量控制(Flow Control)

接收方教你做人。
接收方有个缓冲区(Buffer),如果应用层处理得慢,Buffer 满了怎么办?
接收方会在回复的 ACK 包里带上一个字段叫Window Size(通知窗口)。

  • “兄弟,我这也剩 100 字节空间了,你悠着点。” -> 发送方把窗口缩小。
  • “兄弟,我满了(Win=0)!” -> 发送方暂停发送,进入“零窗口探测”状态,时不时戳一下看看有地儿了没。

这就是为什么你下载东西有时候忽快忽慢,可能是你的电脑处理不过来了,叫对面慢点发。

2. 拥塞控制(Congestion Control)

网络教你做人。
如果网络堵车了(丢包了),发送方不仅受接收方控制,还得看网络的脸色。
TCP 维护了一个拥塞窗口(cwnd)

  • 刚开始,试探性地发一点(慢启动)。
  • 一切正常?指数级扩大窗口,发发发!
  • 丢包了?完蛋,堵车了。立马把窗口减半,或者直接降到 1,重新慢启动。

所以,发送方真正的发送窗口 =min(接收方通告窗口, 拥塞窗口)
既要照顾对方的消化能力,又要照顾网络的道路状况。


总结

滑动窗口协议的核心哲学就是:充分利用时间

它把“发数据”和“等确认”这两个动作并行化了。

  • Stop-and-Wait是走一步停一步的老大爷。
  • Go-Back-N是一个严格的教官,一个人掉队,全队重跑。
  • Selective Repeat是一个精明的物流经理,只补发丢的那件货。
  • TCP则是集大成者,它不仅用滑动窗口,还根据路况(拥塞)和仓库容量(流量控制)动态调整窗口大小。

下次面试官再问你“滑动窗口”,你就告诉他:这本质上就是一种用空间(缓存)换时间(带宽)的贪心策略。

http://www.jsqmd.com/news/107216/

相关文章:

  • MaxScript 实现多边形层级切换按钮
  • 当 Gemini 3 + Nano Banana Pro 抹平了人类最后一丝优越感
  • 从登录测试谈测试用例
  • DeepSeek-V3推理优化实战:从新手到专家的batch_size配置指南
  • 多智能体协同架构:构建分布式AI交互系统的5个关键技术
  • Lottie-web API文档自动化:从手动维护到智能生成的开发革命
  • Cakebrew:macOS包管理的终极图形界面指南
  • 国巨薄膜精密电阻RT0805系列的噪声水平及适合的应用
  • NanoPi R5S性能实战:从零配置到千兆加速全攻略
  • 如何快速美化macOS光标:Mousecape新手完整教程
  • 基于jmeter的性能全流程测试
  • 浅析NCE0130KA在功率开关设计中的应用特性
  • macOS终极解决方案:Electronic WeChat通知管理完全指南
  • Qwen3-30B-A3B-Instruct-2507:小参数激活的智能革命
  • LSPosed框架升级指南:从传统Xposed到现代化模块开发的完美过渡
  • GetQzonehistory:一键备份QQ空间说说的终极解决方案
  • NideShop电商系统:打造高效在线商城的终极Node.js解决方案
  • 2026大专生找工作难吗?Java就业环境变差吗?
  • 企业级构建系统性能优化实战:从Bazel分布式架构到高效团队协作
  • SenseVoice语音识别技术:突破性多任务音频理解解决方案
  • 智能显卡管家:让MacBook双显卡发挥极致效能
  • Base-Admin企业级后台框架终极指南:SpringBoot实战完整解决方案
  • OctoSQL查询计划分析终极指南:从入门到性能优化实战
  • 腾讯混元视频生成模型:打破闭源技术垄断的开源革命
  • WAN2.2 AllInOne技术突破:AI视频生成的极速实战指南
  • 10个高效技巧:终极免费垃圾分类数据集实战指南
  • 3大架构级纹理优化策略:从内存瓶颈到性能突破的实战复盘
  • 3步搞定媒体服务器集成:Homepage实战配置指南
  • GeoTools:构建下一代地理信息系统的终极解决方案
  • 终极B站视频下载神器:bilidown让你轻松收藏8K超清内容