一、 选择重传协议 ( SR ) 引入

后退 N N N 帧协议 ( GBN ) 弊端 : 累计确认 机制 , 导致的批量重传 , 这些重传的帧 , 可能已经传输成功 , 就是因为之前的帧出错 , 导致传输成功的帧被丢弃 ;


上述弊端 解决方案 : 设置 单个帧确认机制 , 加大 接收窗口 , 设置接收缓存 , 可处理乱序到达的帧 ;





二、 选择重传协议 ( SR ) 帧分类

发送方 帧 分类 :

① 发送窗口外 , 发送完毕 , 被确认的帧 ; 滑动窗口已经划过的位置 ;

② 发送窗口内 , 发送完毕 , 被确认的帧 ;

③ 发送窗口内 , 发送完毕 , 等待确认的帧 ; 此时该数据帧需要被缓存 ;

④ 发送窗口内 , 还能发送的帧 ;

⑤ 发送窗口外 , 还不能发送的帧 ; 滑动窗口还没有滑到的位置 ;



接收方 帧 分类 :

① 接收窗口外 , 已经成功接收的帧 ;

② 接收窗口内 , 希望收到 , 但是未收到的帧 ;

③ 接收窗口内 , 希望收到 , 刚收到的帧 ;

④ 接收窗口内 , 不希望收到 , 却提前收到的帧 , 已经缓存下来 ;

⑤ 接收窗口内 , 等待接收的帧 ;





三、 发送方 事件 ( 确认帧、超时事件 )

上层调用事件 : 上层发送数据时 , 先检查 发送窗口 ;

① 如果 发送窗口 未满 : 则 生成 数据帧 , 发送数据 ;

② 如果 发送窗口 已满 : 发送方将该信息通知上层 , 让 上层 延迟发送 ;



A C K ACK ACK 确认帧 事件 : 逐一确认 ;

① 接收确认帧 : 接收方收到 ACK 确认帧 ;

② 标记已接收 : 发送窗口 将该 帧序号 对应的帧 标记为 已接收 ;

③ 移动发送窗口 : 如果 该 帧序号 是 发送窗口 的下界 ( 最左侧窗口 ) , 将 发送窗口 移动到 最小序号的 没有确认 的帧位置 ; 可能移动 一个位置 , 也可能移动多个位置 ;

④ 发送未发送帧 : 发送窗口 移动完毕后 , 如果发现 该 发送窗口 中有没有发送的帧 , 就将这些帧发送出去 ;



超时事件 : 每个帧 都有 自己的定时器 , 如果 某个 帧出现了定时器超时事件 , 重传该单个帧 ;





四、 接收方 事件 ( 接收帧 )

接收方 事件 :

① 接收正确帧 : 接收方 接收 正确的帧 , 不管其帧的顺序 ;

② 失序处理 : 失序的帧 , 将会被缓存起来 , 并向 发送方 发送该 失序帧 的 ACK 确认帧 ;

③ 移动接收窗口 : 如果 接收到的 帧序号 是 接收窗口 的下界 ( 最左侧窗口 ) , 将成功接收到的连续数据交付给上层 , 将 接收窗口 移动到 最小序号的 没有接收到 的帧位置 ; 可能移动 一个位置 , 也可能移动多个位置 ;





五、 滑动窗口长度

发送窗口 与 接收窗口 大小相等 , 便于流量控制 ;


使用 n n n 比特 对 帧进行编号 , 发送窗口的尺寸 W T W_T WT 和 接收窗口尺寸 W R W_R WR满足如下公式要求 :

W T = W R = 2 n − 1 W_T = W_R = 2^{n - 1} WT=WR=2n1





五、 选择重传协议 SR 重点

选择重传协议 SR 重点 :

① 数据帧 逐一确认 , 接收方收到一个帧 , 就会单独发送该帧的确认帧 ;

② 重传 出错 的 单个帧 ;

③ 接收方 有缓存 ;

④ 滑动窗口大小 : W T = W R = 2 n − 1 W_T = W_R = 2^{n - 1} WT=WR=2n1 ;





六、 选择重传协议 SR 计算示例

数据链路层 使用 选择重传协议 SR , 发送方发送了 0 , 1 , 2 , 3 0 , 1, 2,3 0,1,2,3 帧 , 当前时刻 , 收到了 1 1 1 号确认帧 , 0 , 2 0, 2 0,2 号帧出现超时 , 则需要重发哪些帧 ? ? ?


SR 协议是收到一帧 , 确认一帧 ;

1 1 1 号帧 已经确认 , 不用重发 ;

0 , 2 0 , 2 0,2 帧 超时 , 必须重发 ;

3 3 3 号帧 等待确认 , 当前时刻不用管 , 如果超时 , 就需要重发 , 当前没有超时 , 等待即可 ;

因此最终只需要重发 0 , 2 0 , 2 0,2 数据帧 ;