发布于 

RDT(Reliable Data Trasfer Protocol )可靠传输协议

本站字数:106.9k    本文字数:1.6k    预计阅读时长:5min    访问次数:

在TCP/IP网络协议簇中,IP层以及IP层以下的协议,都没有保证协议传输的可靠性,也就是不丢包、没有比特错误、不重复、不丢失,那么如何保证协议传输的可靠性是一个有趣的话题。

可靠的数据传输协议(Reliable Data Trasfer Protocol ),即数据可以通过一条可靠信道进行数据传输。由于可靠数据传输协议的下层协议也许是不可靠的,因此实现这种协议也是相当困难的。

因为下层的协议也许是不可靠的,因此底层信道是有可能损坏比特或者丢失整个分组的。RDT的可靠性,主要体现在,交付到上层的分组(Packet)是完整的,是没有分组丢失的。

尝试构造一个可靠数据传输协议

1. 经完全可靠信道的可靠数据传输:RDT 1.0

最简单的情况就是,底层信道是完全可靠的。以下就是发送者和接收者的状态图。

image-20210801144851502

上面的状态图也许有些难以理解,下面用时序图来演示一下具体的流程。

rdt1-0

接收者全盘接受来自发送者的全部分组,因为底层的信贷是可靠的,因此也不会存在数据错误,丢包的问题,而且假定收发速率是一致的。

2. 经具有比特差错信道的可靠数据传输:RDT 2.0

第一个版本属于是理想状态下的RDT,实际情况会复杂得多。基于比特差错信道,就会出现数据错误的问题,需要引进新的技术来解决这些问题:

  • 差错检测:增加额外的校验数据,例如校验和
  • 接收方的确认:肯定确认(Positive Acknowledgement, ACK)和否定确认(Negtive Acknowledgem,ent, NAK)
  • 重传:接收方反馈错误的时候,发送方可以通过重传的方式保证数据的正确,基于这样的重传机制的可靠数据传输协议叫做自动重传请求(Automatic Repeat reQuest,ARQ)协议

首先来看发送方和接收方的状态图

image-20210801150113332

image-20210801150150547

其实简单而言,这种可靠协议是通过反馈方校验返回决定是否重传的协议,可以简单来看看它是怎么工作的。

rdt2-0-1

上面这种就是正常的操作了,发送方发送消息,接收方确认消息。当然了因为是出现比特错误的不可靠的信道,因此是可能出现NAK的情况的。

rdt2-0-2

如果细心的话,可以发现,在第二次重传的时候,等了一段时间才收到接收者的ACK确认。中间发送者没有任何的动作,这也就意味着,除非发送者确信接收方已经正确接收到分组,否则不会有任何的动作。对于RDT2.0这种协议称之为停等(stop-and-wait)协议。

上面这种协议,其实已经可以适应具有比特错误的情景了。但是事情真的这么简单吗?

因为信道存在比特差错,那么ACK和NAK的确认信息也是可能存在比特差错的。这也就意味着,发送方和接收方都必须进行一定的比特校验,否则错误的确认信息,发送方就只能“停等”了。

3. 经具有比特差错信道的可靠数据传输:RDT 2.1

修复ACK或者NAK信息受损的问题。

为了解决这个问题,最简单的办法就是使用标序号(sequence number)和冗余分组的方法。

首先来看发送方和接收方的状态图:

image-20210801153255866

Receiver

上面的状态图虽然复杂,但是实际上是对称的,也就是0和1序号的状态,发生各种情况的动作。实际上可以简单理解有三种情况。

  • 正常通信
  • 接收方数据错误
  • 发送方数据错误

首先,来看正常通信的例子。

rdt2-1-1

上面就是一个正常通信的例子,在完成了序号为0的数据的传输以后,发送者和接收者的状态全都发生的转变。

然后,再来看第二种情况:接收方数据错误

rdt2-1-2

这种情况下,接受方出现的错误,其实和之前的2.0版本工作是一样的。

最后!也是最重要的情况,接收方的确认信息错误,也就是RDT2.1版本想要去解决的问题。

rdt2-1-3

最后的两种错误情况,简单而言,不管是接受方回复NAK还是回复的信息含糊不清,发送方全部重传处理。接收方发现自己要的信息并不是发送方的信息,回复ACK。

发送方接收到对同一个分组的两个ACK(即接收冗余ACK(duplicate ACK))后,就知道接收方没有正确接受到跟现在被确认两次的分组后面的分组。因此可以对rdt2.1进行改进,出现rdt2.2版本。

4. 经具有比特差错信道的可靠数据传输:RDT 2.2

取消了NAK的使用,而是使用ACK附带序号来实现

image-20210801160659564

对于RDT2.1的三种情况:

  • 正常通信

rdt2-2-1

  • 接收方数据错误

rdt2-2-2

  • 发送方数据错误

rdt2-2-3

5. 经具有比特差错的丢号信道的可靠数据传输:RDT3.0

引入丢包的概念,使用定时器来进行重发

信道可能造成比特差错的同时,也有可能会造成,数据分组的丢失。如果真的数据发生了丢失,rdt2.2可以解决吗?显然不行,rdt2.2协议出现这种情况就会卡死,无法进入下一步,因此,为了解决这种问题,接受方和发送方都应该使用定时器来进行重发。

发送方需要做到:

  1. 每次发送一个分组时,启动一个计时器
  2. 响应定时器中断
  3. 终止定时器

下面是信息发送者的状态图:

image-20210801162424873

因为分组序号在0和1之间,因此rdt3.0协议有时被称为比特交替协议(alternating-bit protocol)

rdt3.0一共会出现四种情况:

  • 无丢包操作

image-20210801162836652

  • 分组丢失

image-20210801162903061

  • 丢失ACK

image-20210801162926573

  • 过早超时

image-20210801162948927