数据链路层的可靠传输协议,是408计算机网络里"概念+计算"双料重灾区。这三种协议(停止-等待、GBN、SR)看似独立,其实是同一个问题在不同约束下的三次迭代优化,理清了这条演进逻辑,公式记起来就不会混。


一、停止-等待协议(S-W):最朴素的可靠传输

工作原理

发送方每发送一个数据帧,就停下来等待接收方的确认帧(ACK),只有收到确认后,才能发送下一帧——这也是"停止-等待"这个名字的由来。

两个关键容错机制

  1. 超时重传:发送方发出数据帧后启动一个计时器,若在规定时间内没有收到确认,就认为该帧(或对应的确认帧)丢失,自动重传。为此,发送方必须暂时保留已发送帧的副本,直到收到确认为止。
  2. 帧编号去重:如果确认帧在返回途中丢失或延迟,发送方超时重传后,接收方可能会收到同一个数据帧的两份副本。为了让接收方能识别并丢弃这种重复帧,**数据帧和确认帧都只需要用1个比特编号(0和1交替使用)**即可,不需要更长的序号。

致命缺点

因为必须"发一帧等一帧",信道利用率极低——这也是后面GBN和SR协议要解决的核心问题。


二、回退N帧协议(GBN):用窗口换取流水线效率

核心思路

GBN允许发送方不必等待确认,连续发送多个帧(前提是这些帧都落在发送窗口内),大幅提升了信道利用率,这个技巧本质上就是滑动窗口 + 流水线传输。

两个关键约束

窗口大小约束:设序号占用 n 个比特,则序号范围是 0 ~ 2^n - 1,共 2^n 个可用序号。GBN协议要求:

1 < W_T ≤ 2^n - 1,W_R = 1
  • 发送窗口 W_T 不能超过 2^n - 1,否则新帧和旧帧的序号会重复,接收方无法区分;
  • 接收窗口 W_R 恒为1,因为GBN只能按序接收。

接收方的处理规则(这是GBN和SR最本质的区别):

  • 接收方只按顺序接收数据帧,一旦收到失序的帧(比如期望5号帧,却收到了7号帧),会直接丢弃,并继续等待5号帧;
  • GBN采用累积确认:接收方对按序到达的最后一个帧发送确认,表示"这个序号及之前的帧我都收到了",不需要对每一帧单独确认。

最大的缺点:一步错,步步重传

正因为接收方会丢弃所有失序帧,一旦某一帧出错或丢失,发送方即使后面的帧已经发出,也必须把从出错帧开始的所有后续帧全部重传——这就是"回退N帧"名字的由来,也是GBN最大的效率浪费点。


三、选择重传协议(SR):只修复真正出错的部分

核心思路

SR协议在接收方引入了一个足够大的缓冲区,允许接收方乱序接收并缓存正确到达的帧,不再像GBN那样粗暴地把失序帧全部丢弃。

关键约束

W_T + W_R ≤ 2^n

(这个约束比GBN更宽松,因为SR的接收窗口不再固定为1,需要单独占用一部分序号空间)

处理流程

  1. 接收方为每一个落在接收窗口内的帧维护独立的帧到达状态和独立的超时计时器;
  2. 若某帧出错或丢失,接收方只需重传该帧(通过发送 NAK 指定该帧序号),而不影响其他已正确接收的帧;
  3. 已缓存的失序帧,等到缺失的那一帧补齐后,一次性按序连续提交给上层。

一个具体例子(对应教材图3.12的思路)

假设发送方连续发出了多个数据帧,其中某个中间序号的帧(比如10号帧)丢失,其余帧全部正确到达接收方。接收方会:

  • 缓存所有已经正确到达、但序号在10号之后的帧(不会像GBN那样丢弃它们);
  • 检测到10号帧缺失后,向发送方发送 NAK10,明确指出"只有10号帧需要重传";
  • 发送方收到 NAK10 后,只重传10号帧,其余帧不受影响;
  • 10号帧补齐后,接收方将10号及之后已缓存的连续帧一并提交给上层。

这正是SR相比GBN的最大优势:出错时只需要修复"坏掉的那一小块",不会连累周围已经正确送达的数据,大幅减少了不必要的重传开销。


四、三种协议对比一览

停止-等待(S-W)GBNSR
是否需要等待确认才能发下一帧是否(窗口内可连续发)否(窗口内可连续发)
接收方能否缓存失序帧不涉及不能,直接丢弃能,缓存后等待补齐
确认方式逐帧确认累积确认逐帧确认(NAK指定具体序号)
出错后的重传范围只重传该帧从出错帧开始全部重传只重传出错/丢失的那一帧
序号约束(n比特序号)1比特(0/1交替)即可1 < W_T ≤ 2^n-1,W_R=1W_T+W_R ≤ 2^n
信道利用率最低较高(视窗口大小而定)较高,且比GBN更抗误码
实现复杂度最简单中等最复杂(需要缓冲区和多个独立计时器)

一个容易被考到的结论:在相同的帧序号比特数下,GBN的发送窗口理论上可以比停止等待协议大得多,因此理想条件下信道利用率更高;但如果信道误码率较高,GBN因为"一错就大面积重传"的机制,实际利用率甚至可能反过来低于停止-等待协议。


五、信道利用率分析(重点计算考点)

先约定几个符号:

  • T_D:发送方发送一个数据帧(或分组)所需的发送时延
  • RTT:往返时延(数据帧从发出到收到对应确认帧之间,除去发送时延和处理时延的传播往返时间)
  • T_A:接收方发送确认帧的发送时延(若题目说"忽略确认帧的发送时延和处理时延",则 T_A ≈ 0)

停止-等待协议的信道利用率

U = T_D / (T_D + RTT + T_A)

发送方每发完一帧,要经过 T_D + RTT + T_A 这么长的时间才能开始发下一帧,但真正用来"有效传数据"的时间只有 T_D,所以利用率就是这两者之比。

连续ARQ协议(GBN / SR)的信道利用率

设窗口大小为 N(最多可连续发送 N 个帧/分组),分两种情况:

情况1:若 N × T_D < T_D + RTT + T_A,说明在一个"发送周期"内,N个帧全部发完后信道就空闲了,无法被完全占满:

U = (N × T_D) / (T_D + RTT + T_A)

情况2:若 N × T_D ≥ T_D + RTT + T_A,说明窗口足够大,一个周期内发不完(或刚好发完)N个帧,只要没有差错,发送方可以持续不间断发送,信道被完全占满:

U = 1

实际数据传输速率

实际数据传输速率 = 信道利用率 × 信道带宽(最大数据传输速率)

也可以直接用另一种等价算法:

实际数据传输速率 = 发送周期内发送的数据总量 / 发送周期长度

两种算法在计算题里经常可以互相验证。


六、例题演练

说明:以下例题是根据历年考纲中反复出现的考点类型(信道利用率分析、数据传输速率计算、协议机制辨析)设计的模拟练习题,用来巩固上面的公式和概念,并非逐字复刻某一年的原题。

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

某链路数据传输速率为10Mb/s,单向传播时延为5ms(即RTT=10ms),忽略确认帧的发送时延和处理时延。若采用停止-等待协议传送1000字节的数据帧,求信道利用率。

解:

T_D = (1000 × 8bit) / (10Mb/s) = 0.8ms

U = T_D / (T_D + RTT) = 0.8 / (0.8 + 10) = 0.8 / 10.8 ≈ 7.4%

可以看到,停止-等待协议在这种链路条件下,信道利用率非常低,绝大部分时间都"浪费"在等待确认上。

例题2:GBN协议信道利用率(对比例题1,体现窗口的价值)

沿用例题1的链路条件(T_D = 0.8ms,RTT = 10ms),若改用GBN协议,发送窗口 N = 8,求信道利用率。

解:先判断属于哪种情况:

N × T_D = 8 × 0.8ms = 6.4ms

由于 6.4ms < T_D + RTT = 10.8ms,属于情况1:

U = (N × T_D) / (T_D + RTT) = 6.4 / 10.8 ≈ 59.3%

相比停止-等待协议的7.4%,仅仅是引入了窗口机制,利用率就提升了约8倍。

延伸思考:如果想让信道利用率达到100%(即进入情况2),窗口 N 至少要多大?

N × T_D ≥ T_D + RTT
N ≥ 10.8 / 0.8 = 13.5

所以 N 至少要取 14,才能让发送方连续不断地发送,把信道完全占满。

例题3:数据传输速率计算

某链路数据传输速率(带宽)为10Mb/s,采用连续ARQ协议,发送窗口 N = 10,每个分组长度为1000字节,往返时延 RTT = 8ms,忽略确认帧的发送时延和处理时延,求该链路的实际数据传输速率。

解:

T_D = (1000 × 8bit) / (10Mb/s) = 0.8ms

N × T_D = 10 × 0.8ms = 8ms
T_D + RTT = 0.8 + 8 = 8.8ms

因为 8ms < 8.8ms,属于情况1:

U = (N × T_D) / (T_D + RTT) = 8 / 8.8 ≈ 90.9%

实际数据传输速率 = U × 带宽 = 90.9% × 10Mb/s ≈ 9.09Mb/s

用另一种算法验证:一个发送周期内发送的数据总量为 N × 1000字节 = 10000字节 = 80000bit,发送周期长度为 T_D + RTT = 8.8ms,所以:

实际数据传输速率 = 80000bit / 8.8ms ≈ 9.09Mb/s

两种算法结果一致,可以互相验证计算是否正确。

例题4:SR协议机制辨析(概念题)

在SR协议中,发送方连续发送了0~9号共10个数据帧,其中5号帧丢失,其余全部正确到达接收方。关于接收方的处理,下列说法正确的是:

A. 接收方会丢弃6~9号帧,因为它们不是按序到达的 B. 接收方会缓存6~9号帧,并针对5号帧发送NAK,请求发送方仅重传5号帧 C. 接收方会像GBN协议一样,通知发送方从5号帧开始重传所有后续帧 D. 接收方会立即把0~9号帧全部提交给上层,包括尚未到达的5号帧

答案:B

解析:这题的关键就是SR和GBN最本质的区别——SR的接收方拥有缓冲区,能够先缓存乱序到达的正确帧,只针对真正丢失或出错的那一帧发起重传请求。选项A是GBN的处理方式(丢弃失序帧),选项C同样是把GBN的机制错误地套在了SR上,选项D违反了"按序提交给上层"的基本原则(5号帧没到,6~9号帧不能越过它被提交)。


七、易错点总结

  1. GBN"累积确认"和SR"逐帧确认"不要记反:GBN只需要对"最后一个按序到达的帧"确认一次即可代表前面全部收到;SR则需要针对每一个正确到达的帧单独确认(或用NAK指定具体哪个序号出错)。
  2. 窗口约束公式别混用:GBN是 W_T ≤ 2^n - 1(W_R恒为1),SR是 W_T + W_R ≤ 2^n,这两个公式经常在选择题里被拿来互相替换设置陷阱。
  3. 判断信道利用率用哪个公式,先比较 N × T_D 和 T_D + RTT + T_A 的大小:这一步不能跳过,直接决定了用"比值公式"还是直接等于1。
  4. "实际数据传输速率"不等于"信道带宽":带宽是链路的最大理论速率,实际数据传输速率要乘上信道利用率才是真正跑出来的有效速率,这是计算题里最容易漏乘的一步。
  5. 误码率高时,GBN不一定比停止-等待协议好:这是一个概念辨析陷阱,窗口越大理论峰值利用率越高,但"一错就大面积重传"的代价也越大,二者要结合信道质量综合判断,不能简单认为"窗口大=一定更好"。

更多推荐