Appearance
选择重传协议(SR)
考情分析
SR 协议与 GBN 并列为 408 数据链路层的最高频考点。考试中经常将两者放在一起考,要求分析同一场景下 GBN 和 SR 的行为差异,或者给定序号位数推导窗口大小约束。大题概率很高。
考频:★★★★★
从 GBN 到 SR
GBN 的问题在于:一帧出错,后续所有帧全部回退重传。在误码率较高的环境下,大量正确的帧被白白丢弃再重传,效率很低。
SR(Selective Repeat)的改进思路:只重传出错的帧,正确到达的帧即使乱序也先缓存起来。
要实现这一点,接收窗口不能再是 1 了——接收方需要能够缓存乱序帧。
发送窗口与接收窗口
| 参数 | SR |
|---|---|
| 发送窗口大小 | |
| 接收窗口大小 | |
| 序号位数 |
SR 中发送窗口和接收窗口大小相等,且最大为
窗口大小约束推导
为什么
考虑最坏情况:发送方发出了窗口内的所有帧,所有 ACK 都丢失了。此时:
- 发送方超时后会重传所有帧
- 接收方已经接收了这些帧,窗口已经前移
如果
由于 SR 中
对比 GBN 的约束: GBN 的
逐个确认
SR 使用逐个确认(Individual ACK),不使用累积确认:
- ACK
只表示"第 帧已正确接收",不隐含之前帧的确认 - 接收方对每个正确接收的帧单独发送 ACK
- 发送方为每一帧维护独立的计时器
接收方行为
SR 的接收窗口 > 1,接收方可以缓存乱序帧:
- 帧落在接收窗口内 → 接收并缓存,发送对应的 ACK
- 帧落在接收窗口之前 → 已经收过了(重复帧),重发其 ACK
- 帧落在接收窗口之外 → 丢弃
当接收窗口的最左侧连续帧都收齐后,窗口整体前移,将这些帧按序交付上层。
工作过程示例
和 GBN 的关键区别:帧 3 和帧 4 没有被丢弃,而是被缓存。只有帧 2 需要重传。
窗口滑动细节
以
初始状态:
发送窗口: [0 1 2 3]
接收窗口: [0 1 2 3]
发送帧0,1,2,3,帧2丢失:
发送窗口: [0 1 2 3] (全部已发送)
接收窗口: 已收到0,1,3 等待2
收到ACK 0, ACK 1 后:
发送窗口: [2 3 4 5] (窗口前移2格,可以发帧4,5)
接收窗口: [0 1 2 3] (还在等帧2,窗口不动)
重传帧2,接收方收到后:
接收窗口: [4 5 6 7] (帧0-3全部按序交付,窗口前移4格)注意:发送方窗口和接收方窗口的滑动不一定同步。发送方收到某帧的 ACK 就可以前移,接收方需要最左侧连续帧收齐才前移。
交互可视化
易错点
1. SR 的窗口上限是
这和 GBN 不同。GBN 窗口最大
2. SR 的确认是逐个确认,不是累积确认
ACK 3 只代表"帧 3 收到了",不代表帧 0、1、2 都收到了。这是和 GBN 最容易混淆的地方。
3. 接收方收到窗口之前的帧要重发 ACK
如果收到的帧序号落在接收窗口之前(即已经接收过的帧),接收方不能忽略它——需要重新发送该帧的 ACK。因为对方之所以重传,很可能是上次的 ACK 丢了。
4.
严格来说,SR 要求
高频考点清单
- 窗口大小约束:
,默认 - 逐个确认 vs 累积确认
- 接收方缓存乱序帧,只重传丢失帧
- 给定序号位数,计算 SR 和 GBN 各自的最大窗口
- 给定帧丢失场景,分析 SR 和 GBN 各需要重传哪些帧
- 发送方和接收方窗口的独立滑动