构造可靠数据传输协议

在本篇文章中我们将逐步了解开发发送方和接收方的可靠数据传输协议的过程,它们逐渐复杂,最后会得到一个无错、可靠的数据传输协议。在这个过程中仅考虑单向数据传输但控制信息双向流动。
我们用有限状态机(FSM)来标识发送方和接收方。如下图所示:
在这里插入图片描述
实线箭头指示了协议从一个状态变迁到另一个状态。在对应的一个箭头上,有个类似分数样子的数据。横线上方表示导致状态转换的事件,横线下方是状态转换时执行的动作。接下来本文所有的图都按此理解。

一、Rdt1.0:完全可靠信道上的可靠数据传输

首先考虑最简单的情况,即在完全可靠的信道上,没有bit错误、没有分组丢失。
这时发送方与接收方的有限状态机定义如下图:
在这里插入图片描述
其中,发送方发送数据到下层信道,接收方从下层信道接收数据。发送方和接收方有各自的FSM,并且都只有一个状态,都是从一个状态返回到自身。
发送端通过rdt_send(data)事件接收来自较高层的数据,经过make_pkt(data)事件把上层的数据转换成下层可以识别的数据段,然后把data数据通过udt_send(packet)发到下层IP层。
接收方通过rdt_rcv(paclet)函数从IP层接收数据,收到信息包之后继续等待来自下层的调用,这个过程的事件主要是将数据段转换成数据,交给应用层。
对于rdt1.0总结一句话就是假设信道没有出错,只是做两个动作,一个是交付,一个是上传。

二、Rdt2.0:具有bit错误的信道

1、确认和否认机制

假设rdt2.0具有bit错误的信道,因为这个过程下层信道可能让传输分组中的bit受损。校验和将检测到bit错误。
那么当检测到错误以后如何从错误中恢复呢?这里我们采用了确认和否认的机制。
(1)确认(ACK):接收方明确告诉发送方,分组接收正确。
(2)否认(NAK):接收方明确告诉发送方,分组接收出错。
发送方在收到NAK后重发这个分组。

2、rdt新机制

在rdt2.0的新机制,即在rdt1.0中没有的主要有如下:
(1)差错检测:接收方检测到何时出现了比特差错。需要有额外的比特,这些比特被汇集在rdt2.0数据分组的分组检验和字段中。
(2)接收方反馈:接收方提供明确的反馈信息给发送方,如ACK和NAK。
(3)接收方收到有差错的分组时,发送方将重传该分组报文。

3、rdt2.0FSM规范

在这里插入图片描述
注意:如果对一个事件没有动作,或没有就事件发送而采取了一个动作,将在横线上方或下方使用符号A表示。
在这个过程中发送方首先等待来自上层的调用,做两个事情,第一个是rdt_send(data)接收上层数据。snkpkt与1.0相比加了一个校验和,可以检测到是否发送错误,之后udp_send(snkpkt)将分组发送出去。之后发送方等待来自接收方的ACK或NAK分组。如果收到一个ACK分组,则发送方知道最近发送的分组已经被正确接收,此时协议返回到等待来自上层调用的状态;如果收到一个NAK分组,则该协议会重传最后一个分组并等待接收方为响应重传分组而回送的ACK或NAK分组。
rdt2.0中接收方的FSM同样只有一个状态,当分组到达时,接收方根据接收到的分组是否受损要么回答一个ACK,要么回答一个NAK。
(1)当没有错误时整个发送方与接收方操作如图所示:
在这里插入图片描述
(2)当出现错误场景时发送方与接收方的操作如下图所示:
在这里插入图片描述
rdt2.0错误场景其实就是一个停等协议,什么是停等协议呢?就是发送方发送一个报文,然后等到接收方的响应,响应类型有ACK和NAK两种,如果是ACK则为正常数据交付,如果是NAK要进行重传。
处理受损ACK和NAK时会发生如下三种情况:
(1)发送方并不知道接收方发生了什么。例如当我们说话时接收方回答的"请重复一遍",发送方会问“你说什么?”。
(2)增加足够的检验和比特,使发送方不仅可以差错检测,还可以回复差错。对于会产生差错但不丢失分组的信道,这就可以直接解决问题。
(3)发送方收到含糊不清的ACK或NAK分组。

4、rdt2.0致命缺陷

我们考虑当ACK/NAK混淆了会发生什么?这时就会发生上面提到的发送方并不知道接收方发生了什么,使得不能正确重发数据,可能会导致数据重复。
解决方法:发送方给每个分组加一个序号,在ACK/NAK混淆时发送方重发当前分组,之后接收方会丢弃重复的分组但并不向上传递。

三、Rdt2.1:处理混乱的ACK/NAK

1、发送方处理混乱的ACK/NAK

FSM描述如下图:
在这里插入图片描述
发送方的FSM是rdt2.0的两倍,这是因为协议状态此时必须反映出目前由发送方正发送的分组或者接收方希望接收的分组的序号是0还是1。在这个过程中发送方首先等待来自上层的调用,通过rdt_send(data)接收上层数据。snkpkt与2.0相比加了一个分组序号,用以标识所发送的分组,之后udp_send(snkpkt)将分组0发送出去。然后发送方等待来自接收方的ACK或NAK回送。如果收到一个ACK分组,则发送方知道最近发送的分组已经被正确接收,此时发送方的分组序号变为1,协议返回到等待来自上层调用的状态;如果收到一个NAK分组,则该协议会重传最后一个分组并等待接收方为响应重传分组而回送的ACK或NAK分组,当接收方收到序号为0的分组时就会知道这是一次重传。

2、接收方处理混乱的ACK/NAK

FSM描述如下图:
在这里插入图片描述
接收方首先等待来自下层的调用,现在它希望收到的是一个分组0,当发送方传过来的数据有误时会回送NAK,然后等待发送方发来分组0。当确认数据无误后会将数据传递给上层。此时接收方会期望接收到分组1。

四、Rdt2.2:一个不要NAK的协议

如果不发送NAK,而是对上次正确接收的分组发送一个ACK,我们也能实现与NAK一样的效果。发送方接收到对同一个分组的两个ACK,就知道接收方没有正确接收到跟在被确认两次的分组后面的分组。通俗的来说就是假如发送方先发送分组0,之后发送分组1,这是接收方如果返回来的还是分组0的ACK,发送方接收到两个分组0的ACK,就知道分组1没有被接收方接收到。
rdt2.2同rdt2.1相比功能相同,但是只用ACK不用NAK,接收方此时必须包括一个ACK报文所确认的分组序号,而发送方也必须检查接收到的ACK报文中被确认的分组序号。
发送方、接收方FSM片段如图:
在这里插入图片描述

五、Rdt3.0:具有出错和丢失的信道

1、rdt3.0介绍

我们假设下层信道还要丢失报文、数据或者是ACK,校验和、序号、确认、重传虽然有一定的帮助,但是远远不够。
我们采用如下方法:发送者等待“合理的”确认时间。如果在这时间内没有收到ACK就重发该分组。但是如果一个分组经历了特别大的时延,即数据或ACK只是延迟但并没有丢失,发送方也会重传该分组,这就在发送方带接收方的信道中引入了冗余数据分组的可能性。幸运的是rdt2.2中的序号处理已经处理了这个问题。
从发送者的角度来看,重传就好像是”万灵药“一样。发送方并不知道是一个数据分组丢失,还是回送的ACK丢失,还是数据或ACK只是延迟但并没有丢失。以上所有的情况,发送方的动作都是重传。为了实现基于时间的重传机制,需要一个倒计数定时器。倒计数定时器的作用为在一个给定的时间量过期后可以中断发送方。
基于上,发送方要有如下功能:
(1)每次发送一个分组(包括第一次分组和重传分组)时就会启动一个定时器。
(2)采取适当动作响应定时器中断。
(3)终止定时器。
注意:等待的”合理的“时间至少是发送方与接收方之间的一个往返时延加上接收方处理一个分组所需要的时间。
下图为发送方的FSM:
在这里插入图片描述

2、rdt3.0操作

基于上图rdt3.0有四种情况,我们用图分别来讲。
(1)无丢包操作
在这里插入图片描述
这种情况很好理解,发送方发送分组0,接收方接收0分组并回送ACK0,发送方收到ACK0之后发送分组1,以此类推。
(2)分组丢失
在这里插入图片描述
发送方发送分组0,接收方接收0分组并回送ACK0,发送方收到ACK0之后发送分组1,在发送分组1的过程中分组1丢失,发送方等待接收方的回送,等待超时后定时器中断发送方重发分组1,j接收方接收分组1,回送ACK1。

(3)丢失ACK
在这里插入图片描述
发送方发送分组0,接收方接受分组0回送ACK0,发送方收到ACK0的回送后发送分组1,接收方接收分组1,但是在回送ACK1时发生丢失,当发送方等待超时后重发分组1,接收方接收分组1,检测冗余,之后回送ACK1。
(4)过早超时
在这里插入图片描述
发送方发送分组0,接收方接收分组0并回送ACK0,之后发送方接收ACK0发送分组1,接受方接收分组1并回送ACK1A(为了区别下面的ACK1我们后面分别加个A和B),这时因为过早超时,还没有等到ACK1回送过去就中断定时器重传分组1,接收方收到分组1后进行冗余检测在回送ACK1B,在这同时发送方接收到了最开始接收方回送的ACK1A,然后发送分组0。之后发送方就什么也不做了。

3、rdt3.0性能

rdt3.0能工作但是性能很差,网络协议限制了物质资源的使用!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值