可靠数据传输协议,即rdt(reliable data transfer protocol)。rdt有较多一步步改进的版本,有时候总是记混,傻傻分不清,所以记录总结一下。
一.rdt 1.0
也叫经完全可靠信道的可靠数据传输。
该方法考虑得很简单,认为底层信道完全可靠(无比特差错、无分组丢失、分组按序到达)。
并且假定了接收方与发送方的数据传输率一致。
有限状态机(Finite-State Machine)如下:
解释:发送方rdt_send()接受上层的数据,产生一个分组发送到底层信道上;接收方rdt_rcv()从底层信道接收一个分组,从分组中取出数据,之后将数据传输到较高层。
二.rdt 2.0
也叫经具有比特差错信道的可靠数据传输
相比于rdt 1.0,新增:
①差错检测(可以使用检验和)
②接收方反馈(ACK,NAK)
③重传(接收方收到有差错的分组时,发送方将重传该分组)
有限状态机(Finite-State Machine)如下:
解释:发送方rdt_send()接受上层的数据,产生一个分组(带有检验和checksum)发送到底层信道上,就等待接收方的ACK或NAK分组,如果接收到一个NAK分组,就重传最后一个分组并等待接收方对该重传分组响应的ACK或NAK;如果接收到一个ACK分组,代表最近发送的分组被正确接收,协议返回等待来自上面调用的状态。
对于接收方,rdt_rcv()从底层信道接收一个分组,若分组受损则回送发送方一个NAK分组,若没有受损,则从分组中取出数据,之后将数据传输到较高层并回送发送方一个ACK分组。
由于发送方发出1个分组,等待接收方响应后再继续发送,所以rdt 2.0也可以被称为停等协议。
缺陷:如果接受方发送的ACK/NAK受损,首先发送方就不知道接收方发生了什么情况。如果发送方进行重传,那么就引入了冗余分组,使得接收方不知道该分组是新的还是重传的。
三.rdt 2.1
在2.0的基础上新增:
①在数据分组中添加一个新字段,让发送方对其数据分组编号,称为序列号。(也就是说接收方接收到相同序号的分组就丢弃重复的分组),以此来解决2.0的缺陷。
有限状态机(Finite-State Machine)如下:
有限状态机的直观变化:
状态数量翻倍,状态需要记住当前分组序列号。
例如发送方发送一个序列号为0的分组,进入等待ACK/NAK 0的状态,若接收到NAK或者确认消息损坏就重传分组,如果接收到ACK且确认消息未损坏,则改变序列号,从0变为1。
现在假设情景发送方向接收方发送0号数据包,如果接收方接收到0号数据包,返回ACK,但是ACK受损,接收方处于等待1号数据状态,发送方重复发送0号数据,接收方会丢弃0号数据,避免重复。
四.rdt 2.2
即无NAK消息协议
跟rdt2.1的功能相同,但是只使用ACK,在ACK的信息上加上了期望的序列号
实现:
1)接收方通过ACK告知最后一个被正确接收的分组
2)在ACK消息中显式地加入被确认分组的序列号
3)发送方收到重复ACK后采取与收到NAK消息相同的动作,即重传当前分组。
有限状态机(Finite-State Machine)如下:
现在假设情景发送方发送0数据包给接收方,接收方接受0数据包并返回ACK0,状态变为等待来自下层的1,然而ACK0损坏,则发送方重传0数据包,此时接收方接收到之后仍然回送ACK0并丢弃该数据。
五.rdt 3.0
即经具有比特差错的丢包信道的可靠数据传输。
考虑信道即可能产生运输误差,也可能发生分组丢失(如果分组直接丢失,前面的协议就会一直等下去,明显不行)。需要引入倒计数定时器(等待一个“合理”的时间,如果没收到ACK则重传),但性能不太好。
有限状态机(Finite-State Machine)如下:
接收方仍然可以使用rdt 2.2的
这个协议相当于在rdt2.2的基础上增加了一个定时器实现超时重传。例如,发送方发送0数据包且开启定时器,若分组受损,则接收方回送ACK1,此时发送方接收到后什么都不做,超时后重传0数据包。