3.5 滑动窗口协议
目录:计算机网络-课程笔记目录
前言
- 之前所介绍的都是基于停等操作(rdt)
流水线机制
- Rdt3.0:利用L/R时间发送出去,随后等待RTT时间,故性能很差
- U sender = (L/R) / (RTT + L/R)
- 一次性发送多个,然后再等
- U sender = (n * L/R) / (RTT + L/R)
- 提高n倍
- 允许发送方在接收ACK之前连续发送多个分组
- 更大的序列号范围
- 发送方和/或接收方需要更大的存储空间以缓存分组
滑动窗口协议:实现流水线
- 英文:Sliding-window protocol
- 窗口
- 允许使用的序列号范围
- 窗口尺寸为N:最多有N个等待确认的消息
- 滑动窗口
- 滑动窗口协议:GBN,SR
GBN、SR是两种滑动窗口协议
Go-Back-N协议
发送方
-
分组头部包含k-bit序列号
-
窗口尺寸为N,再多允许N个分组未确认
- 最小的已发送未确认:send_base
- 最小的可用序列号:nextseqnum
-
采用累积确认机制 ACK(n):表示确认到序列号n(包含n)的分组均已被正确接收
- (还是返回最后一个嘛?或者最大一个)
- 可能收到重复ACK
-
为空中的分组设置计时器(timer):分组可能丢失
-
第n个分组发生超时事件:重传序列号大于等于n,还未收到ACK的所有分组
- 重发send_base到最后一个(可能没有N个,没用完)
- 潜在的资源浪费
-
状态机(花里胡哨的,看状态机就好了)
-
收到ACK之后
- base = 接收到的 + 1
- 如果base == next(全部都成功接收),停止计时器
- 否则重启计时器
-
备注
- 也就是说,在发送之后会不停地接收到ACK,每接收到一个就滑动一下,然后重启计时器,直到所有的分组都正确接收,关闭计时器。开始下一次发送,开启的时候又会开启计时器。
- 发送方可能接收到乱序的丢失的ACK,但是收到的最大的表示之前都成功接收了,如0、2、3表示0、1、2、3都被成功接收了。如果说1没有接收到,返回的ACK应该是0、0、0、0。所以ACK丢包也没关系
接收方
- ACK机制:发送拥有最高序列号的、已经被正确接收的分组ACK
- 可能产生重复ACK
- 只需要记住唯一的expectedSeqNum:期望序列号
- 乱序到达的分组:
- 直接丢弃:接收方没有缓存
- 然后重新确认序列号最大的、按序到达的分组
- 停等协议不会乱序到达
GBN的缺陷
- 重传时重传很多分组
SR协议
-
英文:Selective Repeat
-
接收方对每个分组单独进行确认
- 设置缓存机制,缓存乱序到达的分组
-
发送方只重传没收到ACK的分组
- 为每个分组设置定时器
-
发送方的窗口
- N个连续的序列号(同GBN)
- 限制已发送且未确认的分组(同GBN)
- 绿色和黄色的顺序不像GBN了
-
接收方窗口(GBN没有)
- 灰色:希望收到但是没有收到
- 红色:乱序到达
- 蓝色:可接收的序列号范围
-
接收方和发送方窗口不是同步的
发送方
- 超时:重传该分组并重置该分组的计时器
- 收到ACK(n)在窗口内 [sendBase, sendBase + N]
- 标记接收
- 如果是最小的没被接收的,现在接收到了可以滑动窗口了
接收方
- 接收到在 [rcvBase, rcvBase + N -1]
- 发送ACK
- 乱序:缓存
- 按序:把后面可以连上的一起交付给上层,然后滑动这么多窗口
- 接收到在 [rcvBase - N, rcvBase - 1],不在窗口范围(在之前)
- 发送ACK(n),这意味着之前发送的ACK丢失了,发送方不知道
- 否则,忽略掉:在右边,超过缓存
困境
疑问
- 为什么SR中接收方是rcvBase + N - 1而发送方是sendBase + N?