运输层要为上层(应用层)提供一种服务:数据可以通过一条可靠的信道进行传输,在该信道中传输的数据不会受到损坏或者丢失。
实现这种服务的是可靠数据传输协议。
要实现这种服务并不简单,因为无法保证在运输层下的各层可以实现可靠传输,所以可靠数据传输协议的实现方式要在运输层下的各层都不可靠的前提下进行。
上图为可靠数据传输协议的实现过程,rdt为可靠数据传输,udt为不可靠传输
先假设底层信道完全可靠,这种情况下的可靠传输协议成为rdt1.0.
上图表示了rdt1.0的实现方式,用有限状态机的方式表示
先学习一下有限状态机的表示方式
⚪表示一个状态,箭头表示状态转换过程,将头上的信息为:横线上面为发生转换的条件,下面为转换过程中的操作,如果条件或者操作为空,则用Λ表示,虚线箭头指向的为初始状态
如上图,rdt1.0发送端被上层调用函数rdt_send()时,rdt1.0将数据变成分组后传到下层进行传输,然后接受方的运输层的下层调用rdt_rcv()来将传输的数据传到接收方运输层的rdt1.0,rdt1.0将该数据传到上层应用层,从而实现数据的可靠传输。
因为该情况下不需要考虑下层的传输丢失等问题,所以可以实现可靠性传输。
该情况下运输层下层的数据传输可能会发生差错,但是依然按照顺序发送。
为了防止发送的数据产生错误,接收方要进行差错检验,然后回应发送方是否有问题,正确回应(ACK),错误回应(NAK),发送方要是收到NAK则重新发送,这种方式称为自动重传请求协议(ARQ)
为此需要加入的功能包括
发送方发送数据后进入等待回应状态,接收方得到数据后会反馈信息,发送方得到信息后,若为NAK则重传并保持原状态,若为ACK则回到等待调用状态
在该过程中存在发送发等待回应的过程,所以rdt2.0又称停等协议
但是该情况下可能存在反馈信息出错的情况,所以引入rdt2.1
反馈信息出现错误,那么可以采用冗余分组的方式,即只要反馈信息为NAK或者初选错误的反馈信息,发送方就重新发送。
但是这样还会出现一个问题,那就是接收方不知道自己发给发送方的反馈信息是否出错,假如出现错误,发送方重传,接收方并不知道是不是重传的信息,所以为了解决这个问题,我们需要给他们编一个序号。
具体方法:
大前提为发送信息的顺序不会出现错误,所以可以设置0和1两个序号。
发送方和接收方处于0号状态。发送方发出0号信息,接收方检查信息序号是否和自己状态号相同。序号不同,说明已经接收过正确的该信息,则接收方发送ACK。序号相同,说明之前没有接收过该信息或者接收到的信息是错误的,接收方再检查该信息是否有错。如果正确,就向上传该信息,并且变为1状态,还要反馈ACK。错误的或就反馈NAK,状态不变。
发送方收到NAK或者损坏的反馈信息,就重传,状态保持不变。如果收到ACK,就转变为另一个状态。
接收方和发送方处于1号进程时情况类似,不再赘述。
除了这种方式,还有rdt2.2的解决方法,反馈信息只需要ACK,去除了NAK。
因为接收方和发送方总是会在信息正确发送后处于相同的状态,所以反馈信息不再使用ACK和NAK两种,而是使用(ACK,1)(ACK,0),给ACK加上序号这种方式。用ACK加上与两状态号相同的序号来表示ACK,而加上相反的序号来表示NAK。
过程如下:
前提:数据可能丢失或者损坏,但是数据是按照顺序传送的。
数据丢失问题在rdt2.2已经解决,现在要解决的时数据丢失问题。数据丢失问题带来两个要达到的要求,一个是怎么发现数据丢失,另一个数据丢失时候的解决方法。数据丢失时可以采用重传的方法,即使用rdt2.2即可解决。怎么发现数据丢失则让发送方来解决。
具体解决方法时:设置一个计时器,发送信息后就开始计时,如果超时,就认定为数据丢失。
这里看一下rdt3.0的工作过程
至此,我们完成了一个完整的可靠数据传输协议
rdt3.0协议为停等协议,效率过低,为了提高效率,引入了流水线方式,即在收到反馈信息之前发送一系列而不是一个分组。
流水线技术带来的影响:
基本方法:
如图为发送方需要的序号范围。
设置一组编号,每个要发送的信息使用一个编号。
基序号(base)和下一个序号(nextseqnum)为两个变量,分别指向第一个已发送且还未接收的信息序号和第一个未发送的信息序号。
设置一常量窗口长度(N)
rdt_sent:上层调用该函数进行数据发送,如果可以发送数据就发送数据,如果已满则缓存该数据。还可能会有同步机制,如果已满则不允许调用该方法
timeout:从base开始的信息重传
接收到正确的信息:停止原先base指向的信息的计时器,base+1,开始新的base指向的计时器
接收到错误的信息:无操作
注意:
这里的关键为定时器,base开始,往后N个信息传到接收端。只有base指向的信息使用计时器,如果该信息得到正确反馈则停止该计时器,base+1,开始这个新信息的计时器。如果到时间没有收到base指向的信息的计时器,重传base指向的信息及之后的信息。
接收方:
设上一个收到的正确信息并且反馈的序号为n,则如果收到序号为n+1的正确信息,则发送反馈信息并且上传该信息。如果序号为n+1之后或者错误信息,就丢弃该信息。
直接丢弃而不缓存
GBN缺陷:一个信息的错误可能导致导量信息的重传
SR的解决思路:为每一个信息设置定时器,超时则重传这一个信息。并且接收方将接收到的n+1之后的信息缓存,知道接收到n+1的信息时,将这一信息和后面缓存的信息一起上传到应用层
注意点: