可靠数据传输(rdt)
rdt可靠数据传输,在应用层,传输层和数据链路层都很重要。
rdt主要保证数据传输过程中:不出错,不重复,不丢失。
基础的rdt发送和传输模型
- 发送方一次发送一个数据分组
- 接收方接收到发送方分组数据,返回一个分组确认
- 发送方得到分组确认,再次发送下一个分组数据。
流水线协议
流水线协议是指在rdt的数据发送和接收模型中,允许发送方在未得到接收方确认的情况下一次发送多个分组。
- 必须增加序号的范围:用多个bit表示分组的序号
- 在发送方/接收方要有缓冲区
发送方缓冲区: 未得到确认的分组数据,可能需要重传。
接收方缓存区:上层用户取用数据的速率不等于接收到的数据速率;接收到的数据可能乱序,排序交付(可靠)。
两种通用的流水线协议:回退N步(GBN) 和选择重传(SR)
滑动窗口协议 (side window)
滑动窗口协议的主要目的是为了更高效的动态的保证数据的可靠传输。
由于存在各种异构网络信道,网络流量环境,需要一种协议,能够根据当前复杂网络环境,根据数据传输双方(发送方,接收方)的数据发送,数据接收能力的不同,能够动态调整数据在传输过程中大小,速率,重传,控制等等。
所以,滑动窗口是数据传输端对端,双方实体都本地存在的窗口:发送窗口和接收窗口。
- 发送方本地窗口(sending window)
发送缓冲区:
形式:内存中一个区域范围,落入缓冲区的分组可以发送。
功能:用于存放已发送,但是没有得到确认的分组。
必要性:需要重发时候可用。发送缓冲区的大小:一次最多可以发送多少个未经确认的分组
a. 停止等待协议,SW= 1
b. 流水线协议,SW > 1, 设置合理的缓冲区大小值。发送缓冲区中的分组
a. 未发送的: 落入发送缓冲区的分组,可以连续的发送出去。
b. 已经发送出去的,等待对方确认的分组: 发送缓冲区的分组只有得到确认的才能删除。发送方窗口的结构表示(相对移动方式表示)
a. 一开始,没有发送任何一个分组;后沿=前沿,发送窗口大小=0
b. 每次发送一个分组成功,前沿向前移动一个单位
c. 发送窗口收到老分组的确认,后沿向前移动。
- 接收方本地窗口
也是与发送窗口一致,本地有个接收缓冲区,落入缓冲区的数据是未经确认的分组。
- 接收窗口的滑动:
a. 低序号的分组到来,接收窗口移动。
b. 高序号分组乱序到,进行缓存,但不交付(rdt,不允许失序), 不滑动窗口 - 发送确认:
a. 接收窗口尺寸RW=1 : 发送连续收到的最大的分组确认。(累计确认)
b. 接收窗口尺寸RW >1: 收到那个分组,发送那个分组的确认。(非累计确认)
- 两个窗口互动
正常交互情况:
发送窗口:
a. 有新的分组落入发送缓冲区范围,发送分组,前沿向前滑动。
b. 来了老的低序号分组的确认,后沿向前滑动,新的分组可以落入发送缓冲区范围。
接收窗口:
a. 收到分组,落入到接收窗口范围,接收分组
b. 分组是低序号,发送确认给对方
发送端上来了分组数据 -> 发送窗口滑动 -> 接收窗口滑动 -> 发送确认;确认后,重复发送流程。
异常交互情况:
X: GBN类型(RW=1)
发送窗口:
- 新分组落入发送缓冲区范围,发送->前沿滑动
- 超时重发机制让发送端将发送窗口中的所有分组发送出去
- 来了老分组的重复确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围(此时如果发送缓冲区有新的分组可以发送)
接收窗口:
- 收到乱序分组,没有落入到接收窗口范围内,抛弃
- (重复)发送老分组的确认,累计确认;
Y: SR模型下的异常窗口情况:
发送窗口:
- 新分组落入发送缓冲区范围,发送->前沿滑动
- 超时重发机制让发送端将超时的分组重新发送出去
- 来了乱序分组的确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围(此时如果发送缓冲区有新的分组可以发送)
接收窗口:
- 收到乱序分组,落入到接收窗口范围内,接收
- 发送该分组的确认,单独确认;
GBN 与SR(选择重传) 的比较
- GBN的运行发送流程示例
- SR运行发送示例
GBN和SR的使用场景