流量控制与可靠传输
流量控制概述
流量控制(Flow Control)是数据链路层的核心功能之一,用于协调发送方和接收方之间的速率差异,防止发送方发送过快导致接收方缓冲区溢出、数据丢失。
流量控制是一种机制,通过限制发送方的发送速率,使之不超过接收方的接收和处理能力,从而保证数据的可靠传输。
流量控制与差错控制密切相关,共同构成了可靠传输机制。可靠传输的核心思想是:通过确认(ACK)和超时重传(Timeout Retransmission),确保数据正确、有序地到达接收方。
停止-等待协议(Stop-and-Wait)
停止-等待协议是最简单的可靠传输协议。
工作原理
- 发送方发送一帧后,停止发送,等待接收方的确认(ACK)
- 接收方收到正确的帧后,发送 ACK 给发送方
- 发送方收到 ACK 后,才发送下一帧
- 如果发送方在规定时间内(超时计时器)未收到 ACK,则重传该帧
为了解决重复帧的问题(ACK丢失导致发送方重传,接收方收到两个相同的帧),需要对帧进行编号。停止-等待协议使用 1 比特序号(0 和 1),ACK 也带序号,表示”期望收到的下一帧序号”。
信道利用率分析
停止-等待协议的最大问题是效率低。发送方在等待 ACK 的时间内,信道处于空闲状态。
设:
- :帧的传输时延(发送一帧所需时间)= 帧长 / 数据率
- :信号传播时延 = 链路长度 / 信号传播速度
- :ACK 的传输时延(通常很小,可忽略)
一个完整的周期为:发送帧 + 传播到接收方 + 发送 ACK + ACK 传播回发送方
信道利用率(发送方忙的时间占总周期的比例):
当传播时延 远大于传输时延 时(如卫星链路, 约 250ms),停止-等待协议的信道利用率极低,可能不到 1%。这就是为什么需要滑动窗口协议。
滑动窗口协议(Sliding Window)
滑动窗口协议通过允许发送方在收到确认之前连续发送多个帧,大大提高了信道利用率。
基本概念
- 发送窗口(Send Window):发送方允许发送但尚未收到确认的帧的序号范围。窗口大小记为 。
- 接收窗口(Receive Window):接收方允许接收的帧的序号范围。窗口大小记为 。
- 窗口滑动:当发送方收到 ACK 后,发送窗口向前滑动;当接收方收到帧并发送 ACK 后,接收窗口向前滑动。
序号空间
帧的序号用 比特表示,序号范围为 。为了避免新旧帧的序号混淆(即接收方无法区分是新帧还是重传的旧帧),发送窗口大小必须满足:
对于 GBN 协议,,故 。 对于 SR 协议,,故 。
后退 N 帧协议(Go-Back-N, GBN)
GBN 是滑动窗口协议的一种实现,其特点是接收窗口大小为 1,即接收方只按序接收帧。
工作原理
- 发送方可以连续发送发送窗口内的多个帧,无需等待确认
- 接收方只接受按序到达的帧。如果收到乱序的帧(即前面的帧丢失了),则丢弃该乱序帧,并对最后一个按序收到的帧发送重复 ACK
- 发送方如果收到重复 ACK 或超时,则从出错的那一帧开始,重传该帧及其后所有已发送但未确认的帧(即”后退 N 帧”)
累计确认
GBN 使用累计确认(Cumulative ACK):ACK 表示序号为 及之前的所有帧都已正确收到。这意味着如果 ACK 丢失,后续的 ACK 可以”捎带”确认前面的帧。
特点
- 优点:接收方实现简单(不需要缓存乱序帧),累计确认机制健壮
- 缺点:出错时可能重传已经正确接收的帧,浪费带宽;在错误率高的环境下效率低
- 适用场景:错误率较低的网络(如有线网络)
选择重传协议(Selective Repeat, SR)
SR 是另一种滑动窗口协议,其特点是接收窗口大小大于 1,接收方可以缓存乱序到达的帧。
工作原理
- 发送方可以连续发送发送窗口内的多个帧
- 接收方对每个正确收到的帧都发送单独的 ACK(不是累计确认)。对于乱序到达但正确的帧,接收方缓存起来,不立即交付给上层
- 发送方只为每个帧设置独立的超时计时器。如果某帧超时,只重传该帧(不重传后续帧)
- 当缺失的帧被正确收到后,接收方将缓存的帧按序交付给上层
特点
- 优点:只重传出错的帧,避免不必要的重传,在错误率高的环境下效率高
- 缺点:接收方需要缓存乱序帧,实现复杂;需要对每个帧单独确认和计时
- 适用场景:错误率较高的网络(如无线网络)
三种协议的对比
| 特性 | 停止-等待 | GBN | SR |
|---|---|---|---|
| 发送窗口大小 | 1 | , | , |
| 接收窗口大小 | 1 | 1 | |
| 确认方式 | 逐个确认 | 累计确认 | 逐个确认 |
| 重传策略 | 重传当前帧 | 重传出错帧及后续所有帧 | 只重传出错帧 |
| 接收方缓存 | 不需要 | 不需要 | 需要 |
| 信道利用率 | 低 | 中等 | 高 |
| 实现复杂度 | 简单 | 中等 | 复杂 |
| 适用场景 | 低时延链路 | 低错误率链路 | 高错误率链路 |
TCP 协议本质上是一种选择重传协议(但使用累计确认),它结合了 GBN 和 SR 的优点:使用累计确认(类似 GBN),但通过快速重传机制只重传丢失的段(类似 SR)。
典型例题
例题1:停止-等待协议信道利用率
在一个数据率为 1 Mbps、传播时延为 20 ms 的信道上,使用停止-等待协议传输 1000 字节的帧。求信道利用率。如果改用滑动窗口协议,窗口大小至少为多少才能使信道利用率达到 80%?
-
计算传输时延:
-
传播时延
-
停止-等待协议信道利用率:
-
滑动窗口协议的信道利用率近似为: (当窗口足够大时)
要求 :
故窗口大小至少为 5。
答案:停止-等待协议信道利用率约为 16.7%;滑动窗口大小至少为 5 才能使利用率达到 80%。
例题2:GBN 协议序号与窗口
一个 GBN 协议使用 3 比特序号,发送窗口大小为 5。在某一时刻,发送方的发送窗口为 [2, 3, 4, 5, 6](表示已发送但未确认的帧序号)。此时发送方收到了 ACK 4,请问: (1) 新的发送窗口是什么? (2) 发送方接下来可以发送哪些序号的帧?
- GBN 使用累计确认,ACK 4 表示序号 4 及之前的所有帧(0,1,2,3,4)都已正确收到。
- 原发送窗口为 [2,3,4,5,6],收到 ACK 4 后,窗口向前滑动,移除已确认的 2,3,4。
- 新的发送窗口为 [5, 6, 7, 0, 1](3比特序号,6之后是7,0,1)。
- 其中 5,6 已发送但未确认,7,0,1 是新可以发送的帧。
答案:(1) 新的发送窗口为 [5, 6, 7, 0, 1];(2) 接下来可以发送序号为 7, 0, 1 的帧。
例题3:SR 协议序号空间
一个选择重传协议使用 4 比特序号,发送窗口和接收窗口大小相等。请问最大窗口大小是多少?如果窗口大小设为 9,会出现什么问题?
- SR 协议中,发送窗口 和接收窗口 大小相等,且需要满足 。
- ,,故 ,。
- 最大窗口大小为 8。
- 如果窗口大小设为 9(),则 ,会出现序号混淆问题:
- 假设接收方窗口为 [0,1,…,8],收到所有帧并发送 ACK 后,窗口滑动到 [9,10,…,0](即 9,10,11,12,13,14,15,0,1)
- 如果之前的 ACK 全部丢失,发送方超时重传序号 0 的帧
- 接收方此时期望接收的新帧中也包含序号 0,无法区分这是重传的旧帧还是新帧
- 导致协议错误
答案:最大窗口大小为 8;设为 9 会导致序号混淆,接收方无法区分重传的旧帧和新帧。
练习题
练习1
比较停止-等待协议、GBN 协议和 SR 协议在重传策略和接收方缓存方面的区别。
-
重传策略:
- 停止-等待:超时后重传当前帧(只有一帧在传)
- GBN:超时或收到重复ACK后,重传出错帧及其后所有已发送但未确认的帧(后退N帧)
- SR:每个帧有独立计时器,超时后只重传出错的那一帧
-
接收方缓存:
- 停止-等待:接收窗口=1,不需要缓存(只接收一帧)
- GBN:接收窗口=1,只按序接收,乱序帧直接丢弃,不需要缓存
- SR:接收窗口>1,需要缓存乱序到达但正确的帧,等待缺失的帧到达后按序交付
-
确认方式:
- 停止-等待:逐个确认
- GBN:累计确认(ACK n表示n及之前都收到了)
- SR:逐个确认(每个帧单独ACK)
练习2
在数据率为 10 Mbps、传播时延为 5 ms 的信道上,使用停止-等待协议传输 1500 字节的帧,求信道利用率。
- 传输时延:
- 传播时延:
- 信道利用率:
答案:信道利用率约为 10.7%。
术语对照表
| 中文术语 | 英文术语 | 缩写 | 说明 |
|---|---|---|---|
| 流量控制 | Flow Control | - | 限制发送速率防止溢出 |
| 可靠传输 | Reliable Transmission | - | 确保数据正确有序到达 |
| 停止-等待 | Stop-and-Wait | - | 最简单的ARQ协议 |
| 滑动窗口 | Sliding Window | - | 允许连续发送多帧的机制 |
| 后退N帧 | Go-Back-N | GBN | 出错时重传出错帧及后续帧 |
| 选择重传 | Selective Repeat | SR | 只重传出错帧 |
| 自动重传请求 | Automatic Repeat reQuest | ARQ | 确认+超时重传的可靠传输机制 |
| 确认 | Acknowledgment | ACK | 接收方通知发送方已收到 |
| 超时重传 | Timeout Retransmission | - | 超时未收到ACK则重传 |
| 累计确认 | Cumulative ACK | - | ACK n表示n及之前都收到 |
| 信道利用率 | Channel Utilization | - | 发送方忙的时间占比 |
| 发送窗口 | Send Window | - | 允许发送但未确认的帧范围 |
| 接收窗口 | Receive Window | - | 允许接收的帧范围 |
