可靠数据传输协议rdt
可靠数据传输协议(rdt)
rdt在应用层、传输层和数据链路层都很重要,信道的不可靠特点决定了可靠数据传输协议( rdt )的复杂性。
Rdt1.0: 在可靠信道上的可靠数据传输
本层只需要直接将数据进行上下传输:
- 发送方将数据发送到下层信道
- 接收方从下层信道接收数据
Rdt2.0:具有比特差错的信道
本层需要采用差错控制编码进行差错检测。
- 发送方差错控制编码、缓存(以备检错重传 )
- 接收方使用编码检错
- 接收方的反馈:控制报文(ACK,NAK):接收方–>发送方
- 发送方收到反馈相应的动作
- 出错重传
改进一:为了防止ACK/NAK的信息丢失出错,引入了序号的新机制:
发送方:
- 必须检测ACK/NAK是否出错
- 在分组中加入序列号,因为 一次只发送一个未经确认的分组,两个序列号(0,1)就足够了
接收方:
- 必须检测接收到的分组是否是重复的
改进二:为了节省空间带宽,省去了NAK,只适用ACK;上一个ACK表示NAK。
Rdt3.0:具有比特差错和分组丢失的信道
首先基于Rdt2.0上解决了比特差错的问题,但是有可能分组会丢失,如果分组丢失,这样不但接收方等待发送方的数据,而且发送方等待接收方的ACK确认,造成了死锁。
解决方案:引入超时重传机制:如果到时没有收到ACK->重传(同样用序号保证数据不重复)
自此Rdt3.0依靠各种机制已经能够提供可靠的数据传输,但是由于需要等待确定导致性能不太理想。
性能优化:
利用流水线协议(两种通用的流水线协议:回退N步(GBN)**和选择重传(SR)**),提高链路的利用率。
允许发送方在未得到对方确认的情况下一次发送多个分组
- 必须增加序号的范围:用多个bit表示分组的序号
- 在发送方/接收方要有缓冲区
具体实现:
回退N步:
- 发送端最多在流水线中有N个未确认的分组
- 发送端拥有对最老的未确认分组的定时器
- 接收端只是发送累计型确认(按顺序依次接收,发送累计确认)
选择重传:
如果下一个可用于该分组的序号可在发送窗口中,则发送,并且每个分组有自己的定时器(只有收到该序号的ACK才会清除)。
接收端发送相应的ACK(n);该分组及以前缓存的序号连续的分组交付给上层,然后将窗口移到下一个仍未被接收的分组。
总结:
滑动窗口(slide window)协议:
一种缓冲区的具体协议,分为发送方缓冲区和接收方缓冲区(窗口即是缓冲区内容的一个范围,根据某种条件滑动),根据大小不同可以把传输协议分为:
- 停止等待协议:发送方缓存区(SW)为1,接收方缓存区(RW)为1
- 回退N步协议:发送方缓存区(SW)> 1,接收方缓存区(RW)为1
- 选择重传协议:发送方缓存区(SW)> 1,接收方缓存区(RW)> 1
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 goMars的学习随记!
评论