发送方可以连续发送多个帧,接收方缓存失序帧。出错时发送方只重传出错的帧,而不是后续所有帧。
发送窗口 Wt: 可连续发送的帧数
接收窗口 Wr: 可接收的失序帧数(Wr > 1)
约束:Wt + Wr ≤ 2ⁿ(n 为序号位数)
通常取 Wt = Wr = 2^(n-1)
例:3 位序号 → Wt + Wr ≤ 8 → Wt = Wr = 4
| 特性 | GBN | SR |
|---|---|---|
| 接收窗口 | Wr = 1 | Wr > 1 |
| 失序帧处理 | 丢弃 | 缓存 |
| 确认方式 | 累积确认 | 逐帧确认 |
| 重传范围 | 出错帧及后续所有帧 | 只重传出错帧 |
| 实现复杂度 | 简单 | 复杂 |
发送方: [发0][发1][发2][发3]──等待──[收ACK0]──[发4]...
接收方: [收0][收1][收2][收3]──[发ACK0][ACK1][ACK2][ACK3]
逐帧确认,每个帧单独 ACK
发送方: [发0][发1][发2(出错)][发3]...
接收方: [收0][收1][2出错→缓存3][3缓存(失序)]
接收方: 发 ACK0, ACK1, NAK2(请求重传帧2)
发送方收 NAK2 后:只重传帧2(不重传帧3)
接收方收帧2后:按序提交帧2和帧3,发 ACK2 和 ACK3
接收窗口(Wr=4): [0][1][2][3]
收到帧0: 接收,提交,窗口滑动→[1][2][3][4]
收到帧2(跳过帧1): 缓存帧2,不提交
收到帧1: 接收,按序提交帧1和帧2,窗口滑动→[3][4][5][6]
NAK 的作用:
- 接收方检测到帧出错时,发 NAK 通知发送方
- NAKn 表示:请求重传帧 n
- 加速重传过程(不必等待超时)
与 ACK 的区别:
ACKn: 帧 n 正确接收
NAKn: 请求重传帧 n
假设 n=3(序号0~7), Wt=5, Wr=4
问题场景:
发方窗口[0,1,2,3,4],收方窗口[0,1,2,3]
发方发0~4,收方全部接收但 ACK 全丢失
发方超时重发0,收方窗口已滑到[4,5,6,7]
此时收方收到"序号0"的帧→无法判断是新帧还是旧帧
解决:Wt + Wr ≤ 2ⁿ = 8,Wt=4,Wr=4 → 可以区分
| 考点 | 说明 |
|---|---|
| SR 工作流程 | 发送、缓存、按序提交、选择性重传 |
| 窗口大小约束 | Wt + Wr ≤ 2ⁿ |
| 与 GBN 对比 | 缓存、确认、重传范围 |
| NAK 的作用 | 请求重传特定帧 |
↑ 站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。