可靠数据传输协议(rdt)

rdt在应用层、传输层和数据链路层都很重要,信道的不可靠特点决定了可靠数据传输协议( rdt )的复杂性。

Rdt1.0: 在可靠信道上的可靠数据传输

本层只需要直接将数据进行上下传输:

  • 发送方将数据发送到下层信道
  • 接收方从下层信道接收数据

Rdt2.0:具有比特差错的信道

本层需要采用差错控制编码进行差错检测。

  • 发送方差错控制编码、缓存(以备检错重传 )
  • 接收方使用编码检错
  • 接收方的反馈:控制报文(ACK,NAK):接收方–>发送方
  • 发送方收到反馈相应的动作
    • 出错重传

改进一:为了防止ACK/NAK的信息丢失出错,引入了序号的新机制:

  • 发送方:

    • 必须检测ACK/NAK是否出错
    • 在分组中加入序列号,因为 一次只发送一个未经确认的分组,两个序列号(0,1)就足够了
  • 接收方:

    • 必须检测接收到的分组是否是重复的

改进二:为了节省空间带宽,省去了NAK,只适用ACK;上一个ACK表示NAK。

image-20230414104218193

Rdt3.0:具有比特差错和分组丢失的信道

首先基于Rdt2.0上解决了比特差错的问题,但是有可能分组会丢失,如果分组丢失,这样不但接收方等待发送方的数据,而且发送方等待接收方的ACK确认,造成了死锁。

解决方案:引入超时重传机制:如果到时没有收到ACK->重传(同样用序号保证数据不重复)

自此Rdt3.0依靠各种机制已经能够提供可靠的数据传输,但是由于需要等待确定导致性能不太理想。

性能优化:

利用流水线协议(两种通用的流水线协议:回退N步(GBN)**和选择重传(SR)**),提高链路的利用率。

允许发送方在未得到对方确认的情况下一次发送多个分组

  • 必须增加序号的范围:用多个bit表示分组的序号
  • 在发送方/接收方要有缓冲区

具体实现:

  • 回退N步:

    • 发送端最多在流水线中有N个未确认的分组
    • 发送端拥有对最老的未确认分组的定时器
    • 接收端只是发送累计型确认(按顺序依次接收,发送累计确认)
  • 选择重传:

    • 如果下一个可用于该分组的序号可在发送窗口中,则发送,并且每个分组有自己的定时器(只有收到该序号的ACK才会清除)。

    • 接收端发送相应的ACK(n);该分组及以前缓存的序号连续的分组交付给上层,然后将窗口移到下一个仍未被接收的分组。

  • 总结:

    image-20230415152219406

滑动窗口(slide window)协议:

一种缓冲区的具体协议,分为发送方缓冲区和接收方缓冲区(窗口即是缓冲区内容的一个范围,根据某种条件滑动),根据大小不同可以把传输协议分为:

  • 停止等待协议:发送方缓存区(SW)为1,接收方缓存区(RW)为1
  • 回退N步协议:发送方缓存区(SW)> 1,接收方缓存区(RW)为1
  • 选择重传协议:发送方缓存区(SW)> 1,接收方缓存区(RW)> 1