可靠传输-选择重传协议

本文最后更新于:2025年11月10日 下午

一、协议背景与核心目标

1. 问题起源

回退N帧协议(GBN)存在资源浪费缺陷:

  • 接收窗口尺寸 WR=1W_R = 1,仅能按序接收数据
  • 若某一数据分组误码,后续无错分组会因"失序"被丢弃
  • 导致发送方超时重传这些无错分组,浪费通信资源

2. 核心目标

  • 仅重传误码分组
  • 增大接收窗口尺寸 WR>1W_R > 1
  • 缓存"序号在接收窗口内、无错但失序"的分组
  • 待缺失分组补全后再一并提交上层
  • 提升传输效率

二、协议关键机制

1. 分组序号编码

  • 采用 nn 比特编号
  • 序号范围:02n10 \sim 2^n - 1
  • 示例:n=3n = 3,序号范围 070 \sim 7

2. 窗口尺寸规则

发送窗口 WTW_T

取值范围:1<WT2n11 < W_T \leq 2^{n-1}

关键约束:

  • WT=1W_T = 1 时:退化为停止-等待协议
  • WT>2n1W_T > 2^{n-1} 时:接收方无法区分新/旧分组

示例:取最大值 WT=4W_T = 4231=42^{3-1} = 4

接收窗口 WRW_R

取值范围:1<WRWT1 < W_R \leq W_T

关键说明:

  • WR=1W_R = 1 时:退化为 GBN 协议
  • WR>WTW_R > W_T 无意义

示例:WR=WT=4W_R = W_T = 4

3. 发送方行为规则

  1. 批量发送:连续发送序号在发送窗口内的分组
  2. 窗口滑动:
    • 仅在按序收到已发送分组确认时向前滑动
    • 收到未按序确认时,记录确认但窗口不滑动
  3. 超时重传:仅重传超时且未收到确认的分组

4. 接收方行为规则

  1. 分组接收:可接收窗口内无错但失序的分组,并缓存
  2. 确认方式:逐一确认,不使用累积确认
  3. 窗口滑动:仅在按序接收完当前窗口内分组时滑动

三、错误案例:窗口尺寸超限

问题场景

  • WT=5W_T = 5
  • WR=5W_R = 5
  • n=3n = 3(实际最大值应为 44

风险

重传计时器超时后,接收方无法区分:

  • 重传的旧分组
  • 新窗口内的新分组

四、协议对比

协议类型 接收窗口 WRW_R 确认方式 重传策略 效率
停止-等待协议(SW) 1 逐一确认 超时重传1个分组
回退N帧协议(GBN) 1 累积确认 超时重传所有后续分组
选择重传协议(SR) >1> 1 逐一确认 仅重传超时/误码分组

附:SR协议伪代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
class SelectiveRepeatProtocol:
def __init__(self, window_size):
self.window_size = window_size
self.send_window = []
self.recv_window = []

def send_packet(self, packet):
# 发送数据包逻辑
pass

def receive_packet(self, packet):
# 接收数据包逻辑
pass

可靠传输-选择重传协议
https://hellowydwyd.github.io/2025/10/08/可靠传输-选择重传协议/
作者
YuDong Wang
发布于
2025年10月8日
许可协议