流量控制与可靠传输

流量控制概述

流量控制(Flow Control)是数据链路层的核心功能之一,用于协调发送方和接收方之间的速率差异,防止发送方发送过快导致接收方缓冲区溢出、数据丢失。

流量控制

流量控制是一种机制,通过限制发送方的发送速率,使之不超过接收方的接收和处理能力,从而保证数据的可靠传输。

流量控制与差错控制密切相关,共同构成了可靠传输机制。可靠传输的核心思想是:通过确认(ACK)和超时重传(Timeout Retransmission),确保数据正确、有序地到达接收方。

停止-等待协议(Stop-and-Wait)

停止-等待协议是最简单的可靠传输协议。

工作原理

  1. 发送方发送一帧后,停止发送,等待接收方的确认(ACK)
  2. 接收方收到正确的帧后,发送 ACK 给发送方
  3. 发送方收到 ACK 后,才发送下一帧
  4. 如果发送方在规定时间内(超时计时器)未收到 ACK,则重传该帧

为了解决重复帧的问题(ACK丢失导致发送方重传,接收方收到两个相同的帧),需要对帧进行编号。停止-等待协议使用 1 比特序号(0 和 1),ACK 也带序号,表示”期望收到的下一帧序号”。

信道利用率分析

停止-等待协议的最大问题是效率低。发送方在等待 ACK 的时间内,信道处于空闲状态。

设:

  • TtT_t:帧的传输时延(发送一帧所需时间)= 帧长 / 数据率
  • TpT_p:信号传播时延 = 链路长度 / 信号传播速度
  • TaT_a:ACK 的传输时延(通常很小,可忽略)

一个完整的周期为:发送帧 TtT_t + 传播到接收方 TpT_p + 发送 ACK TaT_a + ACK 传播回发送方 TpT_p

信道利用率(发送方忙的时间占总周期的比例):

U=TtTt+2Tp+TaTtTt+2TpU = \frac{T_t}{T_t + 2T_p + T_a} \approx \frac{T_t}{T_t + 2T_p}

滑动窗口协议(Sliding Window)

滑动窗口协议通过允许发送方在收到确认之前连续发送多个帧,大大提高了信道利用率。

基本概念

  • 发送窗口(Send Window):发送方允许发送但尚未收到确认的帧的序号范围。窗口大小记为 WTW_T
  • 接收窗口(Receive Window):接收方允许接收的帧的序号范围。窗口大小记为 WRW_R
  • 窗口滑动:当发送方收到 ACK 后,发送窗口向前滑动;当接收方收到帧并发送 ACK 后,接收窗口向前滑动。

序号空间

帧的序号用 nn 比特表示,序号范围为 02n10 \sim 2^n - 1。为了避免新旧帧的序号混淆(即接收方无法区分是新帧还是重传的旧帧),发送窗口大小必须满足:

WT+WR2nW_T + W_R \leq 2^n

对于 GBN 协议,WR=1W_R = 1,故 WT2n1W_T \leq 2^n - 1。 对于 SR 协议,WT=WRW_T = W_R,故 WT2n1W_T \leq 2^{n-1}

后退 N 帧协议(Go-Back-N, GBN)

GBN 是滑动窗口协议的一种实现,其特点是接收窗口大小为 1,即接收方只按序接收帧。

工作原理

  1. 发送方可以连续发送发送窗口内的多个帧,无需等待确认
  2. 接收方只接受按序到达的帧。如果收到乱序的帧(即前面的帧丢失了),则丢弃该乱序帧,并对最后一个按序收到的帧发送重复 ACK
  3. 发送方如果收到重复 ACK 或超时,则从出错的那一帧开始,重传该帧及其后所有已发送但未确认的帧(即”后退 N 帧”)

累计确认

GBN 使用累计确认(Cumulative ACK):ACK nn 表示序号为 nn 及之前的所有帧都已正确收到。这意味着如果 ACK 丢失,后续的 ACK 可以”捎带”确认前面的帧。

特点

  • 优点:接收方实现简单(不需要缓存乱序帧),累计确认机制健壮
  • 缺点:出错时可能重传已经正确接收的帧,浪费带宽;在错误率高的环境下效率低
  • 适用场景:错误率较低的网络(如有线网络)

选择重传协议(Selective Repeat, SR)

SR 是另一种滑动窗口协议,其特点是接收窗口大小大于 1,接收方可以缓存乱序到达的帧

工作原理

  1. 发送方可以连续发送发送窗口内的多个帧
  2. 接收方对每个正确收到的帧都发送单独的 ACK(不是累计确认)。对于乱序到达但正确的帧,接收方缓存起来,不立即交付给上层
  3. 发送方只为每个帧设置独立的超时计时器。如果某帧超时,只重传该帧(不重传后续帧)
  4. 当缺失的帧被正确收到后,接收方将缓存的帧按序交付给上层

特点

  • 优点:只重传出错的帧,避免不必要的重传,在错误率高的环境下效率高
  • 缺点:接收方需要缓存乱序帧,实现复杂;需要对每个帧单独确认和计时
  • 适用场景:错误率较高的网络(如无线网络)

三种协议的对比

特性停止-等待GBNSR
发送窗口大小1>1>12n1\leq 2^n-1>1>12n1\leq 2^{n-1}
接收窗口大小11>1>1
确认方式逐个确认累计确认逐个确认
重传策略重传当前帧重传出错帧及后续所有帧只重传出错帧
接收方缓存不需要不需要需要
信道利用率中等
实现复杂度简单中等复杂
适用场景低时延链路低错误率链路高错误率链路

典型例题

例题1:停止-等待协议信道利用率

在一个数据率为 1 Mbps、传播时延为 20 ms 的信道上,使用停止-等待协议传输 1000 字节的帧。求信道利用率。如果改用滑动窗口协议,窗口大小至少为多少才能使信道利用率达到 80%?

参考答案(4 个标签)
停止等待信道利用率滑动窗口传输时延
  1. 计算传输时延: Tt=帧长数据率=1000×81×106=8000106=8 msT_t = \frac{\text{帧长}}{\text{数据率}} = \frac{1000 \times 8}{1 \times 10^6} = \frac{8000}{10^6} = 8 \text{ ms}

  2. 传播时延 Tp=20 msT_p = 20 \text{ ms}

  3. 停止-等待协议信道利用率: U=TtTt+2Tp=88+2×20=848=1616.7%U = \frac{T_t}{T_t + 2T_p} = \frac{8}{8 + 2 \times 20} = \frac{8}{48} = \frac{1}{6} \approx 16.7\%

  4. 滑动窗口协议的信道利用率近似为: UW×TtTt+2TpU \approx \frac{W \times T_t}{T_t + 2T_p}(当窗口足够大时)

    要求 U80%U \geq 80\%W×8480.8\frac{W \times 8}{48} \geq 0.8 W0.8×488=4.8W \geq \frac{0.8 \times 48}{8} = 4.8

    故窗口大小至少为 5。

答案:停止-等待协议信道利用率约为 16.7%;滑动窗口大小至少为 5 才能使利用率达到 80%。

例题2:GBN 协议序号与窗口

一个 GBN 协议使用 3 比特序号,发送窗口大小为 5。在某一时刻,发送方的发送窗口为 [2, 3, 4, 5, 6](表示已发送但未确认的帧序号)。此时发送方收到了 ACK 4,请问: (1) 新的发送窗口是什么? (2) 发送方接下来可以发送哪些序号的帧?

参考答案(4 个标签)
GBN滑动窗口累计确认序号
  1. GBN 使用累计确认,ACK 4 表示序号 4 及之前的所有帧(0,1,2,3,4)都已正确收到。
  2. 原发送窗口为 [2,3,4,5,6],收到 ACK 4 后,窗口向前滑动,移除已确认的 2,3,4。
  3. 新的发送窗口为 [5, 6, 7, 0, 1](3比特序号,6之后是7,0,1)。
  4. 其中 5,6 已发送但未确认,7,0,1 是新可以发送的帧。

答案:(1) 新的发送窗口为 [5, 6, 7, 0, 1];(2) 接下来可以发送序号为 7, 0, 1 的帧。

例题3:SR 协议序号空间

一个选择重传协议使用 4 比特序号,发送窗口和接收窗口大小相等。请问最大窗口大小是多少?如果窗口大小设为 9,会出现什么问题?

参考答案(4 个标签)
选择重传序号空间窗口大小SR
  1. SR 协议中,发送窗口 WTW_T 和接收窗口 WRW_R 大小相等,且需要满足 WT+WR2nW_T + W_R \leq 2^n
  2. n=4n=424=162^4 = 16,故 2WT162W_T \leq 16WT8W_T \leq 8
  3. 最大窗口大小为 8。
  4. 如果窗口大小设为 9(WT=WR=9W_T = W_R = 9),则 WT+WR=18>16W_T + W_R = 18 > 16,会出现序号混淆问题:
    • 假设接收方窗口为 [0,1,…,8],收到所有帧并发送 ACK 后,窗口滑动到 [9,10,…,0](即 9,10,11,12,13,14,15,0,1)
    • 如果之前的 ACK 全部丢失,发送方超时重传序号 0 的帧
    • 接收方此时期望接收的新帧中也包含序号 0,无法区分这是重传的旧帧还是新帧
    • 导致协议错误

答案:最大窗口大小为 8;设为 9 会导致序号混淆,接收方无法区分重传的旧帧和新帧。


练习题

练习1

比较停止-等待协议、GBN 协议和 SR 协议在重传策略和接收方缓存方面的区别。

参考答案(4 个标签)
协议比较停止等待GBNSR
  1. 重传策略

    • 停止-等待:超时后重传当前帧(只有一帧在传)
    • GBN:超时或收到重复ACK后,重传出错帧及其后所有已发送但未确认的帧(后退N帧)
    • SR:每个帧有独立计时器,超时后只重传出错的那一帧
  2. 接收方缓存

    • 停止-等待:接收窗口=1,不需要缓存(只接收一帧)
    • GBN:接收窗口=1,只按序接收,乱序帧直接丢弃,不需要缓存
    • SR:接收窗口>1,需要缓存乱序到达但正确的帧,等待缺失的帧到达后按序交付
  3. 确认方式

    • 停止-等待:逐个确认
    • GBN:累计确认(ACK n表示n及之前都收到了)
    • SR:逐个确认(每个帧单独ACK)

练习2

在数据率为 10 Mbps、传播时延为 5 ms 的信道上,使用停止-等待协议传输 1500 字节的帧,求信道利用率。

参考答案(3 个标签)
信道利用率停止等待传输时延
  1. 传输时延:Tt=1500×810×106=12000107=1.2 msT_t = \frac{1500 \times 8}{10 \times 10^6} = \frac{12000}{10^7} = 1.2 \text{ ms}
  2. 传播时延:Tp=5 msT_p = 5 \text{ ms}
  3. 信道利用率:U=TtTt+2Tp=1.21.2+10=1.211.210.7%U = \frac{T_t}{T_t + 2T_p} = \frac{1.2}{1.2 + 10} = \frac{1.2}{11.2} \approx 10.7\%

答案:信道利用率约为 10.7%。


术语对照表

中文术语英文术语缩写说明
流量控制Flow Control-限制发送速率防止溢出
可靠传输Reliable Transmission-确保数据正确有序到达
停止-等待Stop-and-Wait-最简单的ARQ协议
滑动窗口Sliding Window-允许连续发送多帧的机制
后退N帧Go-Back-NGBN出错时重传出错帧及后续帧
选择重传Selective RepeatSR只重传出错帧
自动重传请求Automatic Repeat reQuestARQ确认+超时重传的可靠传输机制
确认AcknowledgmentACK接收方通知发送方已收到
超时重传Timeout Retransmission-超时未收到ACK则重传
累计确认Cumulative ACK-ACK n表示n及之前都收到
信道利用率Channel Utilization-发送方忙的时间占比
发送窗口Send Window-允许发送但未确认的帧范围
接收窗口Receive Window-允许接收的帧范围