数据链路层中,流量控制与可靠传输其实是一条线上的两件事
本文最后更新于4 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

这一块在 408 里非常容易“越学越乱”,因为题目会把停止-等待、滑动窗口、ARQ、发送窗口、接收窗口、序号位数、信道利用率这些内容混在一起考。真正把主线理顺之后,会发现它们并不是零散知识点,而是同一个问题的不同侧面。

先把最核心的一句话放在前面:

数据链路层一方面要解决“别把接收方压垮”,这叫流量控制;另一方面要解决“帧丢了、错了要能恢复”,这叫可靠传输。
而停止-等待、GBN、SR,本质上都是“流量控制 + 差错控制 + 序号机制”结合后的具体协议形式。

所以这部分最好的复习方式,不是一个个背协议,而是沿着下面这条链去理解:

发送得多快 → 接收方能不能跟上 → 出错后怎么补救 → 需要多大的窗口 → 需要多少位编号 → 最终信道利用率是多少。


先把几个最容易混淆的概念拆开

停止-等待“流量控制”与停止-等待“协议”不是完全一回事

很多题会默认把这两个混着说,但严格一点看,它们有层次差别。

停止-等待流量控制,强调的是发送方每发 1 帧,就先停下来,等对方“允许”再发下一帧。它解决的是“别发太快”。

停止-等待协议如果再加上确认、超时重传、帧编号,那么它就变成了停止-等待 ARQ。它不仅能控流,还能保证可靠传输。

也就是说:

停止-等待流量控制 = 最朴素的“发一帧等一帧”
停止-等待 ARQ = 在“发一帧等一帧”的基础上,加上确认、编号、超时重传

在考题里,默认说“停止-等待协议”,通常就是后者。


ARQ 的三种典型协议,其实就是三种窗口模型

ARQ 就是自动重传请求。数据链路层常考的 ARQ 有三类:

  1. 停止-等待协议
  2. 后退 N 帧协议 GBN
  3. 选择重传协议 SR

如果从“滑动窗口”的视角看,它们可以统一理解成:

  • 停止-等待:单帧滑动窗口
  • GBN:多帧滑动窗口,但接收方很保守
  • SR:多帧滑动窗口,接收方也有缓存能力

这三者最该比较的,不是名字,而是下面这几项。

协议发送窗口 W_T接收窗口 W_R确认方式出错后的处理
停止-等待11逐帧确认重传当前帧
GBN>11累计确认从出错帧开始,把后面的已发帧一起重传
SR>1>1单独确认只重传出错或丢失的那几帧

这张表几乎是这一章最重要的区分表。


三种协议到底差在哪

停止-等待:最简单,但效率最低

发送方每次只能有 1 帧处于“已发送但未确认”状态。
所以它的发送窗口和接收窗口都等于 1。

优点是结构简单。
缺点是传播时延稍微一大,发送方大部分时间都在“等”,信道利用率很低。

所以停止-等待的本质缺陷,不是“不可靠”,而是“太慢”。


GBN:发送方能连续发,但接收方只认按序到达

GBN 的核心特点是:

  • 发送方窗口可以大于 1,可以连续发送多个帧
  • 接收方窗口固定为 1
  • 接收方只接收按序到达的帧
  • 如果某一帧丢失或出错,那么后面即使到达了,接收方也直接丢弃
  • 确认采用累计确认

所谓累计确认,可以这样理解:

如果已经确认到 4 号帧,那么通常意味着 0、1、2、3、4 都已经按序正确收到。

GBN 的最大问题是:
一旦中间某帧出错,后面很多本来已经发送出去的帧也要跟着重传,所以出错时代价大。


SR:发送方连续发,接收方也能缓存乱序帧

SR 是在 GBN 基础上“更聪明”的版本:

  • 接收方窗口不再是 1,而是大于 1
  • 乱序到达的帧可以先收下、缓存起来
  • 每一帧单独确认
  • 真正丢哪一帧,就只重传哪一帧

所以 SR 在误码率较高时效率明显比 GBN 高。
但代价是协议实现更复杂,因为接收方要缓存乱序帧,发送方也通常要给每一帧单独定时。

这里有个非常重要的考试陷阱:

SR 的优势主要体现在“出错后更省重传”,不是“无差错时信道利用率一定比 GBN 高”。

在同样的序号位数限制下,GBN 的发送窗口上限往往比 SR 更大,所以在“无差错、只看最大流水线能力”时,GBN 的最大发送方利用率反而可能高于 SR。

这是特别爱出选择题的点。


序号位数和窗口大小,才是这部分最核心的硬约束

这部分最容易考公式,也最容易错。

1. 停止-等待协议

发送窗口和接收窗口都为 1。
通常只需要 1 位序号就够了,0 和 1 交替使用。

为什么要编号?
因为如果确认丢失,发送方会重发上一帧;接收方必须能分辨“这是重传的旧帧”还是“新帧”。


2. GBN 协议

设帧序号字段为 n 位,则序号空间大小为 2^n

GBN 中:

  • 接收窗口 W_R = 1
  • 发送窗口必须满足 W_T <= 2^n - 1

这个式子必须会背,也必须理解。

为什么不是 2^n
因为必须至少留出 1 个编号空位,否则一旦序号回绕,接收方就可能分不清某个到来的帧到底是“新一轮的帧”还是“老帧的重传”。

所以 GBN 的记忆法很简单:

W_R = 1W_T 最大只能到 2^n - 1


3. SR 协议

SR 的限制更严格。

一般条件是:

W_T + W_R <= 2^n

如果题目默认发送窗口和接收窗口相等,也就是 W_T = W_R,那么就得到:

W_T <= 2^(n-1)W_R <= 2^(n-1)

这就是为什么大家常背:

SR 中发送窗口、接收窗口最大都不能超过序号空间的一半。

原因也一样,都是为了防止序号回绕后,新旧帧混淆。


信道利用率怎么统一看

这一部分建议直接统一成一个模型,不要三套三套背。

设:

  • 数据帧发送时延为 T_d
  • 确认帧发送时延为 T_ack
  • 单向传播时延为 T_p
  • 发送窗口大小为 W

那么:

停止-等待协议

U = T_d / (T_d + 2T_p + T_ack)

如果确认帧很短,可以忽略不计,那么:

U = T_d / (T_d + 2T_p)

如果再设 a = T_p / T_d,则:

U = 1 / (1 + 2a)


滑动窗口协议(GBN、SR)在无差错时

U = min { 1, W × T_d / (T_d + 2T_p + T_ack) }

如果确认帧发送时延忽略不计,则变成:

U = min { 1, W / (1 + 2a) }

这个式子非常重要,因为它说明了一个本质:

在无差错情况下,GBN 和 SR 的利用率表达式形式是一样的。
差别不在公式形式,而在于两者允许的最大窗口不同、出错后的重传代价不同。


哪些协议理论上可以达到 100% 利用率

标准考法下,答案是:

滑动窗口协议可以理论上达到 100%,也就是 GBN 和 SR 可以。

停止-等待通常做不到,因为它每发一帧就要等确认。

更准确一点说,只要窗口足够大,满足:

W × T_d >= T_d + 2T_p + T_ack

发送方就可以一直连续发送,不必停下来等,利用率就能达到 100%。


下面把你列的题逐题吃透

你给的题里有几处是语音转写后有点模糊,我按 408 里最常见的原题语境来理解并作答。对明显有单位疑点的题,我会顺便指出。


例题 1:停止-等待协议下,最大利用率 80%,数据帧长度至少多少

题意理解:

  • 数据传输速率:4 KB/s
  • 单向传播时延:30 ms
  • 停止-等待协议
  • 最大信道利用率 80%
  • 求数据帧长至少多少

解题思路

停止-等待协议,通常忽略确认帧发送时延时:

U = T_d / (T_d + 2T_p)

代入:

0.8 = T_d / (T_d + 60 ms)

解得:

0.8T_d + 48 = T_d

0.2T_d = 48

T_d = 240 ms

再由

帧长 = 速率 × 发送时延

得到:

L = 4 KB/s × 0.24 s = 0.96 KB

所以最少需要:

960 B

本题结论

数据帧长度至少为 960 B

易错点

最容易错在两处:

第一,传播时延是单向 30 ms,所以往返要乘 2。
第二,停止-等待里求利用率,核心不是“发得多快”,而是“发一帧之后等多久”。


例题 2:GBN 已发 0 到 6,超时后只收到对 1、2、4 号帧的确认,要重传多少帧

这道题的关键在于:GBN 采用累计确认。

如果已经收到了对 4 号帧的确认,那么通常表示 0 到 4 号帧都已被确认。
因此当前未确认的就是 5、6 两帧。

一旦超时,GBN 要从最早未确认帧开始,把后面已发未确认的帧全部重传。

所以要重传:

5、6 两帧,共 2 帧

本题结论

需要重传 2 帧

易错点

很多人会把“收到 1、2、4 的确认”理解成只有 1、2、4 被分别确认。
但 GBN 不是 SR,GBN 的核心是累计确认,看到较大的确认号时,要想到它把前面按序的一串都确认掉了。


例题 3:GBN 中发送窗口为 32,至少需要多少位序列号

GBN 的约束是:

W_T <= 2^n - 1

已知 W_T = 32,求最小 n。

有:

2^n - 1 >= 32

即:

2^n >= 33

所以:

  • 2^5 = 32 不够
  • 2^6 = 64 可以

本题结论

至少需要 6 位序列号


例题 4:GBN 协议中,帧编号字段为 7 位,发送窗口最大长度是多少

GBN 最大发送窗口:

W_T(max) = 2^n - 1

代入 n = 7

W_T(max) = 2^7 - 1 = 127

本题结论

最大发送窗口为 127


例题 5:SR 协议中,若采用 5 位帧序号,最大接收窗口是多少

SR 的常见结论是:

W_R(max) = 2^(n-1)

代入 n = 5

W_R(max) = 2^4 = 16

本题结论

最大接收窗口为 16


例题 6:窗口大小为 n 的滑动窗口,最多可以有多少帧已发送但未确认

这个题本质上是在问发送窗口的定义。

发送窗口大小是多少,就最多允许多少帧处于“已发送但还没收到确认”的状态。

本题结论

最多有 n 帧已发送但未确认

易错点

不要把“窗口里可发送的帧”和“序号总空间”混在一起。
这个题问的是发送方流水线里最多能压多少个未确认帧,答案就是发送窗口大小本身。


例题 7:SR 协议中,4 比特编号,接收窗口为 7,发送窗口最大是多少

SR 的一般约束条件是:

W_T + W_R <= 2^n

题中:

  • n = 4,所以序号空间为 16
  • W_R = 7

所以:

W_T <= 16 - 7 = 9

本题结论

发送窗口最大为 9

补充说明

如果题目额外说明“发送窗口和接收窗口相等”,那就不能这么算了,那时应取二者都不超过 8,并且若已知 W_R = 7,则 W_T = 7

但按你给出的表述,最标准的解法就是:

W_T + W_R <= 2^n,所以最大发送窗口是 9


例题 8:3 比特编号,利用率大于 80%,AB 之间采用什么协议

你这道题的口述里有明显的转写/单位疑点,我先按你给出的数值直接验算一下:

  • 速率:20 KB/s
  • 数据帧和确认帧都为 2000 B
  • 往返传播时延 1400 ms
  • 3 比特编号

则:

T_d = 2000 / 20000 = 0.1 s = 100 ms

T_ack = 100 ms

等待一个确认回来需要:

T_d + RTT传播 + T_ack = 100 + 1400 + 100 = 1600 ms

若要利用率大于 80%,需要:

W × 100 / 1600 > 0.8

得到:

W > 12.8

也就是至少要 W = 13

但 3 比特编号下:

  • GBN 最大窗口 7
  • SR 若发收窗口相等,最大只能 4

所以按你现在给出的数值,没有任何标准协议能做到大于 80%

本题结论

按你当前给出的数据,这道题无解,说明原题大概率有单位或数字转写错误。

这题真正的价值

这类题不要急着猜协议,而要先算“达到目标利用率至少需要多大窗口”,再看序号位数是否允许。
这一步一旦不满足,就应该立刻意识到题目数据有问题,而不是强行选 GBN 或 SR。


例题 9:理论上可以达到 100% 通信利用率的是哪些协议

本题结论

滑动窗口协议可以理论上达到 100%,即 GBN 和 SR。

停止-等待一般不行。

易错点

不要机械地认为“SR 一定比 GBN 利用率高”。
在无差错情况下,两者的公式形式一样,只是允许的窗口上限不同。
SR 的真正优势是出错后只重传少量帧。


例题 10:GBN 中,速率 16 KB/s,单向传播 270 ms,帧长 128~512 B,确认帧与数据帧等长,最高利用率下至少需要几位序号

题目说“为使信道利用率达到最高”,那显然应该取最大帧长 512 B,因为帧越长,发送时延越大,越容易填满传播等待时间。

L = 512 B

若按常规考试近似:

T_d = 512 / 16000 = 0.032 s = 32 ms

确认帧等长,所以:

T_ack = 32 ms

单向传播 270 ms,所以往返传播:

2T_p = 540 ms

要达到最高利用率,也就是达到 100%,需要满足:

W × T_d >= T_d + 2T_p + T_ack

即:

W × 32 >= 32 + 540 + 32 = 604

所以:

W >= 18.875

故至少需要:

W = 19

GBN 中要求:

W_T <= 2^n - 1

所以:

2^n - 1 >= 19

有:

  • 2^4 - 1 = 15 不够
  • 2^5 - 1 = 31 可以

本题结论

至少需要 5 位序号

易错点

这道题特别容易错在“帧长范围 128~512 B 该取哪个”。
既然题目说“使利用率达到最高”,就一定取最大帧长 512 B。


例题 11:3 比特编号,发送窗口大小为 5,接收窗口最大是多少

这题本质还是用:

W_T + W_R <= 2^n

已知:

  • n = 3,所以序号空间为 8
  • W_T = 5

所以:

W_R <= 8 - 5 = 3

本题结论

接收窗口最大为 3


例题 12:3 比特编号下,停止-等待、GBN、SR 的最大信道利用率关系

设三者最大信道利用率分别为 U_SWU_GBNU_SR

当帧序号位数为 3 时:

  • 停止-等待:发送窗口 1
  • GBN:发送窗口最大 7
  • SR:若发送窗口和接收窗口相等,则发送窗口最大 4

在无差错、忽略确认帧长时:

  • U_SW = min{1, 1 / (1 + 2a)}
  • U_GBN = min{1, 7 / (1 + 2a)}
  • U_SR = min{1, 4 / (1 + 2a)}

因此一般关系为:

U_GBN >= U_SR >= U_SW

如果传播时延足够大,通常会严格表现为:

U_GBN > U_SR > U_SW

本题结论

一般应选 U_GBN >= U_SR >= U_SW

易错点

很多人凭直觉会选“SR 最大”。
这是错误的。
SR 的强项是出错时代价小,不是固定序号位数下最大流水线一定最长。


例题 13:50 kb/s,帧长 1 kbit,捎带确认,3 bit 序号,单向传播 270 ms,求三种协议的最大利用率

已知:

  • 传输速率 R = 50 kb/s
  • 数据帧长 L = 1 kbit
  • 所以发送时延

T_d = 1000 / 50000 = 0.02 s = 20 ms

  • 单向传播时延 T_p = 270 ms
  • 往返传播时延 2T_p = 540 ms

因为题目说采用捎带确认,所以确认帧发送时间不单独计入。


1)停止-等待协议

U = T_d / (T_d + 2T_p)

代入:

U = 20 / (20 + 540) = 20 / 560 = 1 / 28

所以:

U = 3.57%


2)GBN 协议

3 bit 序号,GBN 最大发送窗口:

W = 2^3 - 1 = 7

因此:

U = min{1, 7 × 20 / 560} = 140 / 560 = 0.25

所以:

U = 25%


3)SR 协议(发送窗口和接收窗口相等)

3 bit 序号时,SR 最大窗口:

W = 2^(3-1) = 4

因此:

U = min{1, 4 × 20 / 560} = 80 / 560 = 1 / 7

所以:

U = 14.29%


本题结论

  • 停止-等待:3.57%
  • GBN:25%
  • SR:14.29%

这题真正考什么

这题最想考的不是计算,而是让人真正明白:

在给定序号位数、且发送窗口和接收窗口相等的条件下,
GBN 的最大无差错利用率确实可能高于 SR。

这是很多人第一次做会错的地方。


这部分最容易出错的几个陷阱,建议单独记住

第一类错误:把“GBN 更高效”和“SR 更高效”机械化

应该这样记:

  • 无差错时:两者公式形式相同,谁窗口更大谁流水线更长
  • 有差错时:SR 只重传错帧,因此效率通常优于 GBN

所以“谁更高效”必须看题目到底在比什么。


第二类错误:把发送窗口限制公式记混

直接强记成三条最稳:

  • 停止-等待:W_T = 1,W_R = 1
  • GBN:W_R = 1,W_T <= 2^n - 1
  • SR:W_T + W_R <= 2^n
    • 若发收窗口相等,则都不超过 2^(n-1)

第三类错误:利用率公式里忘记传播时延要往返

只要协议里“发出去后要等确认回来”,那等待里就一定会出现往返传播时延。
所以经常是 2T_p,这一点很容易漏。


第四类错误:看到“接收窗口”还在按 GBN 思维做

GBN 的接收窗口固定就是 1。
只要题里接收方能缓存失序帧、能有大于 1 的接收窗口,基本就是 SR 的思路。


最后把这部分压缩成一个真正做题时可直接调用的判断框架

遇到这类题,建议固定按这 4 步走:

第一步:先辨协议类型

先看是:

  • 停止-等待
  • GBN
  • SR

不要一上来就算。


第二步:立刻写出窗口约束

看到序号位数就立刻想到:

  • GBN:W_T <= 2^n - 1
  • SR:W_T + W_R <= 2^n

这是解大多数题的起点。


第三步:再看利用率公式

若考利用率,先求:

  • T_d
  • T_ack
  • T_p

再代:

  • 停止-等待:U = T_d / (T_d + 2T_p + T_ack)
  • 滑动窗口:U = min{1, W × T_d / (T_d + 2T_p + T_ack)}

第四步:最后结合协议特性判断

例如:

  • GBN 超时后重传一串
  • SR 只重传个别帧
  • GBN 累计确认
  • SR 单独确认
  • GBN 接收窗口固定为 1

这一步通常决定选择题能不能选对。


文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇