Appearance
题目
数据链路层采用后退 N 帧(GBN)协议,发送方已经发送了编号为 0~7 的帧。当计时器超时时,若发送方只收到 0、2、3 号帧的确认,则发送方需要重发的帧数是( )
错因
A
只重传 2 帧。可能误把"已确认的帧数"或"最早未确认的两帧"当成重传数。本题超时后要重传的是 GBN 窗口内所有未被(累积)确认的帧,远不止 2 帧。
B
重传 3 帧。常见错法是把 0、2、3 三个 ACK 当作"恰好确认了这 3 帧",于是数出 1、4、5、6、7 里靠后的 3 个,或漏掉某帧。根源是没用 GBN 的累积确认:ACK 3 已经把 1 一并确认了,1 不在重传之列。
D
重传 5 帧。这是把 GBN 错当成"每个 ACK 只独立确认对应那一帧"得到的结果——于是认为 1 号也未确认,凑成 {1,4,5,6,7} 共 5 帧。GBN 不存在独立确认:ACK 是累积的,收到 ACK 3 就意味着 1、2 早已被确认。按独立确认解读是把 GBN 和选择重传(SR)的确认语义搞混了。
总解析
第一步:抓住 GBN 的核心——累积确认
GBN(后退 N 帧)的接收方只按序接收,发出的是累积确认:ACK n 表示编号 n 及其之前的所有帧都已正确收到。因此每个收到的 ACK 不只确认它自己那一帧,而是确认"到该编号为止"的全部帧。
第二步:用累积确认折算真正被确认的帧
发送方收到了 0、2、3 三个确认。取其中编号最大的 ACK 3——它累积确认了 0、1、2、3 全部四帧(哪怕 1 号的单独 ACK 丢了,也已被 ACK 3 覆盖)。
| 帧号 | 是否被确认 | 依据 |
|---|---|---|
| 0 | ✅ | ACK 0 / ACK 3 累积 |
| 1 | ✅ | ACK 3 累积确认 |
| 2 | ✅ | ACK 2 / ACK 3 累积 |
| 3 | ✅ | ACK 3 |
| 4 | ❌ | 无 ACK ≥ 4 |
| 5 | ❌ | 无 ACK ≥ 4 |
| 6 | ❌ | 无 ACK ≥ 4 |
| 7 | ❌ | 无 ACK ≥ 4 |
未确认帧 = {4, 5, 6, 7} 共 4 帧。
第三步:超时重传策略
GBN 超时后从最早一个未确认帧开始,回退重传该帧及其之后已发送的所有帧。这里最早未确认帧是 4,于是重传 4、5、6、7 共 4 帧。
第四步:核对
| 选项 | 重传帧数 | 推导 |
|---|---|---|
| A | 2 | 严重少算 |
| B | 3 | 漏算 1 帧(多半误判 1 号状态) |
| C | 4 | 累积确认到 3,回退重传 4~7 |
| D | 5 | 误把 1 号当未确认(错当独立确认) |
最终答案是 C(4)。
编者注(生僻术语):GBN 的确认是累积确认(cumulative ACK)——ACK n 代表 n 及之前所有帧都已收到;而选择重传 SR 才是对每帧独立确认。本题易错点正是把两者的确认语义混淆。记住一句话:GBN 看"收到的最大 ACK 编号",它之前的全算确认。