【流量控制】算不对 GBN 窗口?分不清 SR 重传?滑动窗口 + 3 大协议一篇吃透
是否在学网络协议时,对着 “滑动窗口” 的定义反复琢磨、却仍不懂它 怎么既控流量又保可靠?或是算错 GBN 的最大窗口尺寸(明明 n=3,却分不清是 7 还是 4)?甚至搞不清 停止 - 等待GBN、SR 的区别 —— 为什么 GBN 要 “丢一帧重传一串”,而 SR 只重传出错的那帧?
其实,流量控制与可靠传输的本质是 “快递配送的精细化管理”:发送方是快递站,接收方是收件人,数据帧是快递,滑动窗口是 “快递车的载重限制”(控流量),ACK 是 “收件回执”(保可靠)。这篇文章会用 “快递配送” 的比喻贯穿始终,把 3 大协议、滑动窗口计算、考点清单全拆明白 —— 既帮你搞定能理解 “为什么 TCP 用类似 SR 的机制”。
一、先搞懂基础:流量控制与可靠传输,到底解决什么问题?
在讲复杂协议前,先明确两个核心概念的区别 —— 很多人混淆它们,其实对应快递配送的两个不同需求:“别送太快” 和 “别送丢 / 送错”。
1. 流量控制:别让 “收件人” 的快递柜满了
- 定义:由接收方主导,限制发送方的发送速率,防止接收方缓冲区(比如快递柜)溢出。比如收件人告诉快递站:“我家快递柜只剩 3 个空位,一次最多送 3 件”—— 这就是流量控制,核心是 “限速”。
- 数据链路层 vs 传输层:
- 数据链路层:控制 “相邻节点”(比如路由器 A 到路由器 B)的流量,窗口大小通常固定,收不下就不发 ACK。
- 传输层(如 TCP):控制 “端到端”(比如你的电脑到服务器)的流量,通过 ACK 里的 “窗口字段” 动态调整大小(比如快递柜空了就告诉快递站 “可以多送点”)。
2. 可靠传输:确保 “每个快递都被正确收到”
- 定义:让发送方发出的所有帧,都能被接收方 “正确、按序” 接收 —— 就算丢了、错了,也要通过机制补救。比如快递站送了 3 件快递,没收到回执就重送,还按顺序送,避免收件人拿到 “第 3 件却没第 2 件”—— 这就是可靠传输,核心是 “纠错、补漏、排序”。
- 三大核心机制:
- 确认(ACK):接收方收到快递后,给快递站发 “已收到” 的回执(比如 ACK=2 表示 “已收到序号≤2 的帧”)。
- 超时重传:快递站发完快递后,等一段时间(超时时间)没收到回执,就重送这件快递。
- 编号(Sequencing):给每个快递贴序号,避免送重复(比如不会把 “重送的第 1 件” 当成 “新的第 4 件”),还能保证按序交付。
二、3 大协议对比:从 “低效快递” 到 “高效配送”
流量控制和可靠传输的落地,靠的是 3 种滑动窗口协议 —— 它们的核心区别是 “快递车一次能送多少件(窗口大小)” 和 “丢件后怎么补(重传策略)”。
3 大协议核心对比表
协议类型 | 发送窗口(Wₜ) | 接收窗口(Wᵣ) | 核心工作原理(快递比喻) | 优点 | 缺点 | 信道利用率 |
---|---|---|---|---|---|---|
停止 - 等待协议 | 1 | 1 | 快递站送 1 件快递,等收件人发回执(ACK),收到后再送下 1 件 ——“送 1 等 1”。 | 实现最简单 | 效率极低(快递车空跑) | 低 |
后退 N 帧(GBN) | >1(≤2ⁿ-1) | 1 | 快递车一次送多件(比如 3 件),收件人只按序收快递(没收第 2 件就拒收第 3 件);丢 1 件就重送 “从丢件开始的所有件”(比如丢第 2 件,重送第 2、3 件)。 | 比停等效率高 | 重传浪费(多送了没丢的件) | 中 |
选择重传(SR) | >1(≤2ⁿ⁻¹) | >1(=Wₜ) | 快递车一次送多件,收件人会暂存 “没按序到的快递”(比如先收第 3 件,暂存等第 2 件);丢哪件就只重传哪件 ——“精准补件”。 | 效率最高 | 实现复杂(需暂存快递) | 高 |
关键补充:信道利用率
用实例拆解:丢件后三种协议的不同操作
假设发送方发 3 帧(序号 1、2、3),其中序号 2 的帧丢失,三种协议的处理方式:
- 停止 - 等待:发完 1 等 ACK,没收到 2 的 ACK 就重传 2,重传成功再发 3—— 全程只能 “单线程”。
- GBN:发完 1、2、3 后,发现 2 丢了,重传 2、3(哪怕 3 没丢)——“一丢全补”。
- SR:发完 1、2、3 后,发现 2 丢了,只重传 2,3 会被接收方暂存,等 2 到了再一起按序交付 ——“丢啥补啥”。
三、滑动窗口机制:协议的 “灵魂”,怎么同时管流量 + 保可靠?
所有协议的核心都是 “滑动窗口”—— 它就像 “快递站的配送规则”:既规定 :一次最多送多少件(控流量),又明确 哪些件要等回执、丢了要重送(保可靠)。
1. 发送窗口:快递站的待确认清单
- 定义:发送方维护的 “已送但没收到回执” 的快递序号集合(比如送了 1、2、3,回执只到 1,发送窗口就是 {2,3})。
- 作用:
- 控流量:窗口大小就是 “一次最多能有多少件待确认快递”(比如窗口 = 3,就不能送第 4 件,直到收到 2 的回执,窗口滑到 {3,4})。
- 定重传:窗口里的快递,没收到回执就重传(比如窗口 {2,3} 里,2 没回执就重传 2)。
- 移动规则:收到 “窗口内最老快递” 的回执(比如窗口 {2,3} 收到 2 的 ACK),窗口就向前滑 1 位,变成 {3,4}。
2. 接收窗口:收件人的 “可接收范围”
- 定义:接收方维护的愿意接收的快递序号集合(比如当前能收 2、3,接收窗口就是 {2,3})。
- 作用:
- 防溢出:只收窗口内的快递,窗口外的拒收(比如窗口 {2,3},收到 4 就拒收)。
- 保顺序:按序交付给上层(比如先收 3,暂存,等收到 2 再一起交)。
- 移动规则:按序收到窗口内最老的快递(比如窗口 {2,3} 收到 2),窗口向前滑 1 位,变成 {3,4},并给发送方发 2 的 ACK。
3. 绝对重要:窗口大小与编号位数的关系(必算)
快递序号用 n 比特表示(比如 n=3,序号就是 0~7,共 8 个),为了避免 “把重送的旧快递当成新快递”,窗口大小必须满足一个核心公式:
推导两种协议的最大窗口(必背)
-
后退 N 帧(GBN):
- 接收窗口 Wᵣ=1(只按序收,不暂存)。
- 代入公式:
(比如 n=3 时,Wₜ最大 = 7)。
- 为什么?如果 Wₜ=8(
),Wᵣ=1,加起来 = 9>8,接收方会分不清 “收到的 8 是新快递,还是重送的 0(序号循环)。
-
选择重传(SR):
- 接收窗口 Wᵣ=Wₜ(要暂存多件,窗口和发送方一样大)。
- 代入公式:
(比如 n=3 时,Wₜ最大 = 4)。
- 为什么?如果 n=3 时 Wₜ=5,Wᵣ=5,加起来 = 10>8,同样会混淆新旧快递。
四、收尾:考点总结 + 行动指南
1、 一句话总结核心
滑动窗口是 “流量控制 + 可靠传输” 的统一解决方案:通过窗口大小限制发送速率(控流量),通过序号、ACK、超时重传确保数据不丢不错(保可靠);3 大协议的差异本质是 “窗口大小” 和 “重传策略” 的选择 —— 从停止 - 等待的 “低效简单” 到 SR 的 “高效复杂”,对应不同的信道需求。