news 2026/6/15 21:07:06

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
拒绝“停下来傻等”:大白话讲透滑动窗口协议 (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则是集大成者,它不仅用滑动窗口,还根据路况(拥塞)和仓库容量(流量控制)动态调整窗口大小。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 10:28:20

深入解析Vitest测试框架中的函数命名陷阱与解决方案

深入解析Vitest测试框架中的函数命名陷阱与解决方案 【免费下载链接】vitest Next generation testing framework powered by Vite. 项目地址: https://gitcode.com/GitHub_Trending/vi/vitest 在Vitest测试框架中,一个看似普通的函数命名可能引发意想不到的…

作者头像 李华
网站建设 2026/6/15 2:40:01

PyTorch3D终极指南:零基础实现3D角色动画生成

想要创建逼真的3D角色动画却不知从何入手?PyTorch3D作为Facebook AI Research推出的专业3D深度学习库,为开发者提供了从模型加载到动画效果再到最终渲染的全套工具链。本教程将带你从零开始,掌握如何利用PyTorch3D实现基于物理的3D角色动画生…

作者头像 李华
网站建设 2026/6/15 21:05:22

QuadriFlow终极指南:快速掌握四边形网格生成技术

QuadriFlow终极指南:快速掌握四边形网格生成技术 【免费下载链接】QuadriFlow QuadriFlow: A Scalable and Robust Method for Quadrangulation 项目地址: https://gitcode.com/gh_mirrors/qu/QuadriFlow 在三维建模和计算机图形学领域,四边形网格…

作者头像 李华
网站建设 2026/6/15 11:23:07

半透明的玻璃瓶在传送带上排着队前进,机械臂精准地抓住瓶颈悬停在灌装口上方。这套看起来真实感十足的饮料生产线,其实是我用MCGS7.7在电脑里搭的虚拟沙盘

饮料灌装模拟仿真生产线昆仑通泰嵌入版MCGS7.7模拟仿真带运行效果视频![仿真界面截图:传送带与灌装机联动](此处可插入仿真运行截图)先给设备穿个"数字外套"。在设备组态里新建了个"灌装阀"对象,顺手绑定了流…

作者头像 李华
网站建设 2026/6/15 11:22:25

Mermaid 在线编辑器:3分钟学会制作专业图表的技术指南

Mermaid 在线编辑器:3分钟学会制作专业图表的技术指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor…

作者头像 李华
网站建设 2026/6/15 12:27:57

Headscale配置管理终极指南:从入门到实战精通

Headscale配置管理终极指南:从入门到实战精通 【免费下载链接】headscale An open source, self-hosted implementation of the Tailscale control server 项目地址: https://gitcode.com/GitHub_Trending/he/headscale 你是否曾经在部署Headscale时感到困惑…

作者头像 李华