可靠数据传输原理
实现可靠传输是靠可靠数据传输协议来完成的,而该协议却建立在不可靠的下层协议上。就好比TCP提供可靠传输,而TCP却是建立在IP协议这个不可靠协议的基础上。
以下的讨论都是单向数据传输,而且暂且只考虑损坏比特或者整个报文段丢失的情况,而不考虑乱序到达的情况。
rdt1.0:经完全可靠信道传输
该协议只考虑最简单的情况,即底层信道完全可信。
因为默认信道传输可信,那么它的发送端只等待来自上层的调用,接受端只等待来自下层的调用,发送端将数据发送出去之后,就不需要再管,默认一定会到达接收端。
而且这里也假定了接收方的接受速率和发送方的一致。
rdt2.0:具有比特差错信道的可靠数据传输
在该协议中,我们只假定发送的比特可能会受损,而不考虑它们可能存在乱序到达或者丢失的情况。
这里可以类比打电话,我们说一句,对方听到后就会对其进行响应,如果没听清,一般会说让我们再说一边。
在该协议中,使用了肯定确认和否定确认,发送方收到肯定确认意味着接收方成功收到了数据,而否定确认意味着接收方收到的比特有误,需要重传。基于这种机制的协议叫做自动重传请求协议。
它最主要的是三点:
1、差错检测。它需要能够检测出传送的比特流是否有误。
2、接受方反馈。接收方收到比特后,如果有误,需要给发送方反馈。
3、重传。发送方收到接收方的否定确认后,需要重新传送刚刚发送的比特。
一个更具体地例子,发送方发送数据后,需要等待接收方返回一个确认分组。该分组可以是ACK或者NAK。收到ACK说明接收方正确收到分组,而受到NAK则说明有误,需要重传。而发送方发送数据后,只能等待接受对方响应的分组,这种设计也叫做停等协议。
致命缺点:没有考虑ACK或者NAK分组受损的情况。
简单的解决办法:发送方将发送的数据分组编号,接收方只需要根据序号就可以确定该数据分组是否被重发。这样一来,发送方接受到的AKC或者NAK由于受损而表意不明确时,直接重新发送即可。
rdt3.0:具有比特差错的丢包信道的可靠传输
到这里,就不仅要考虑比特受损的情况,还要考虑比特丢失的情况。
在该协议下,我们让发送方负责检测和恢复丢包工作。假如发送方发送的数据分组丢了,那么接收方就无法响应该分组的ACK确认(因为发送的数据分组都有序号),发送方在未收到ACK时,不论是ACK丢失还是数据分组丢失,直接重传数据即可。
但是这个等待的时间也有要求,最低为一个数据分组从发送方到接收方以及从接收方返回发送方的时间和。这里就需要引入一个计时器,超过时间需要重传。
这里还要求发送方和接收方信道中引入冗余数据分组,这里面要存储已经发送了但是还没收到确认帧的数据。
该协议解决问题的核心点在于:
1、差错检测
2、数据分组增加编号
3、接收方的响应
4、一个计时器
5、冗余数据分组