我们分为几种讨论情况
- 经过完全可靠信道的可靠数据传输
- 经过具有比特差错信道的可靠数据传输
- 经过具有比特差错的丢包信道的可靠数据传输
经过完全可靠的可靠数据传输rdt1.0协议
因为信道是完全可靠的传输信道,所以不需要进行确认。 发送端 只需要接收上层数据,并产生一个包含该数据的分组,将分组发送到信道中。 接收端 接收端将接收的分组取出数据,交给上层。
经过具有比特差错信道的可靠数据传输rdt2.0
在rdt1.0的协议上增加了数据确认的回传,还要进行差错检测,重传等。
发送方
发送方将上层的数据进行计算,计算出校验码,并将需要传递的数据和检验和一并打包进行发送,发送之后,并不能发送下一个分组,需要等到接收方回传确认的字段,才能继续发送(也就是说,在发送完分组,并且在接收方回传确认字段之前,不能发送下一个分组,被称为停等协议)。 发送分组之后有三种可能
- 接收端回传字段为肯定确认,则发送端可以发送下一个分组
- 接收端回传字段为否定确认,发送端需要重传该分组
- 接收端回传字段,但是发送端没有接到,判定为超时,发送端需要重传字段。
接收方
接收方接收到分组数据之后,通过校验码验证数据正确或者错误,如果错误,返回NAK,如果正确,返回ACK。
该协议存在的问题:如果接收端回传的确认字段在传输中出现差错,会导致错误重传,或者缺少重传。
经过具有比特差错信道的可靠数据传输rdt2.1
由于rdt2.0问题在,回传的确认数据不能保证其准确性,所以在rdt2.1协议中添加了确认的分组号
发送端
从上层中获取数据之后,将数据和校验和、分组序号(分组需要由1比特表示,所以只能表示0,1,循环使用),进行打包发送。 发送后有三种可能
- 接收端回传的数据为ACK和0(假设第一次传输数据,为0,回传的确认字段也为0,如果分组序号为1,则回传的确认字段也为1),则发送端发送下一个分组。
- 接收端回传的数据为ACK和1(假设同上),因为发送的分组为0,但是回传的确认字段为1,则表明该分组没有传输成功,需要重传分组为0的分组。
- 接收端回传的数据为NAK和0或1(假设同上),说明传递的数据出现差错,需要重传分组。
- 发送端未接收到回传的确认分组,(在此讨论情况下不成立,因为该信道有比特差错,并没有分组丢失)也会重传。
接收端
接收端收到分组时,将数据计算和校验码进行校验,如果出现错误,则返回NAK并返回该分组序号,如果不出现错误,返回ACK和该分组序号
经过具有比特差错信道的可靠数据传输rdt2.2
rdt2.2协议与rdt2.1相比,不同在于没有NAK确认字段,只有ACK字段。
发送方
rdt2.2的发送方与rdt2.1的发送方相似,由于确认字段没有NAK,所以不会判断确认字段,只会判断回传确认分组的分组序号。 当发送端发送分组之后,(假设第一个分组序号为0)
- 如果返回的是ACK和0,则表示确认收到分组。
- 如果返回的是ACK和1,则表示该分组没有被正确接收到,需要重传。
接收方
接收方接收到分组之后,将数据和校验和进行校验,如果正确返回当前确认分组的确认字段ACK0,如果分组出现差错,则返回上一个分组的确认字段ACK1,发送方接收之后,就会重传该分组。
经过具有比特差错信道的可靠数据传输rdt3.0
rdt3.0在rdt2.2协议上增加了倒计数定时器和重传,因为在该信道中,可能会丢失分组。
发送方
发送方每发送一个分组,便启动一个定时器,如果接收到确认字段的回传会终止计时器,如果长时间接收不到确认分组,会触发重传。
接收方
接收方接收到分组之后,将数据与校验码进行校验,如果正确会返回ACK0,如果错误,返回ACK1。(与rdt2.2协议相同)
|