3.4.1 构造可靠数据传输协议
1.经完全可靠信道的可靠数据传输
首先,我们考虑最简单的情况,即底层信道时完全可靠的,我们称该协议为rdt1.0,该协议本身是简单的。
rdt的发送端只通过rdt_send(data)时间接受来自较高层的数据,产生一个包含该数据的分组。并将分组发送到信道中。
在接收端,rdt通过rdt_rcv(packet)时间从底层信道接收一个分组,从分组中取出数据,并将数据上传给较高层。
在这个简单的协议中,一个单元数据与一个分组没什么差别。而且,所有分组是从发送方流向接收方;有了完全可靠的信道,接收端就不需要提供任何反馈信息给发送方。因为不必担心出现任何差错。
2.经具有比特差错信道的可靠数据传输:rdt2.0
控制报文使用“肯定确认”和“否定确认”可以让发送方知道哪些内容被正确接收,那些内容接受有无并因此需要重复。在计算机网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求协议(ARQ)。
ARQ协议中还需要另外三种协议功能来处理存在比特差错的情况
- 差错检测
- 接收方反馈
- 重传
停等协议:发送方确认接收方收到正确的分组的时候在发送一块新的数据
rdt2.1
发送方获得来自上层的数据后,封包(编号为0)发送至接收方,接收方接收到分组后:
1、如果没有损坏,回送ACK分组,并等待编号为1的分组
2、如果损坏,回送NAK分组,并继续等待编号为0的分组
发送方接收到回送分组后:
1、如果没有损坏,且为ACK分组,无任何动作,等待上层协议
2、如果没有损坏,且为NAK分组,重发编号为0的分组
3、如果损坏,无论是ACK还是NAK,重发编号为0的分组
接收方收到分组后(接收方不知道自己的ACK或NAK分组在传输过程中是否损坏):
1、如果没有损坏,且为编号1的分组,回送ACK分组,且等待编号为0分组(循环)
2、如果没有损坏,且为编号0的分组,回送ACK分组,且等待编号为1分组
3、如果损坏,回送NAK分组,等待编号为0分组
rdt2.2
发送方获得来自上层的数据后,封包(编号为0)发送至接收方,接收方接收到分组后:
1、如果没有损坏,回送ACK0分组,并等待编号为1的分组
2、如果损坏,回送ACK1分组,并继续等待编号为0的分组
发送方接收到回送分组后:
1、如果没有损坏,且为ACK0分组,无任何动作,等待上层协议
2、如果没有损坏,且为ACK1分组,重发编号为0的分组
3、如果损坏,无论是ACK1还是ACK0,重发编号为0的分组
接收方收到分组后(接收方不知道自己的ACK分组在传输过程中是否损坏):
1、如果没有损坏,且为编号1的分组,回送ACK1分组,且等待编号为0分组(循环)
2、如果没有损坏,且为编号0的分组,回送ACK0分组,且等待编号为1分组
3、如果损坏,回送ACK1分组,等待编号为0分组
3. 经具有比特差错的丢包信道的可靠数据传输:rdt3.0
3.4.2 流水线可靠数据传输协议
不以停等方式运行,允许发送方发送多个分组而无需等待确认。
- 必须增加序号范围,因为每个输送中的分组必须有一个唯一的序号,而且也许有多个在输送中的未确认的报文
- 协议的发送方和接收方两端也许不得不缓存多个分组
- 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失,损坏及延时过大的分组。
3.4.3 回退N步
基序号:最早未确认分组序号
下一步序号:最小的未使用的序号
已被发送但还未被确认的分组的许可序号范围可以被看成是一个在序号范围内长度为N的窗口。随着协议的协议的运行,该窗口在序号空间向前滑动。N被称为窗口长度。GBN协议也被称为滑动窗口协议。
GBN发送方必须响应三类事件:
- 上层的调用。当上层调用的时候,发送方首先检查发送窗口是否已满,即是否有N个已发送但未被确认的分组。
- 收到一个ACK。在GBN协议中,对序号为n的分组的确认采取累计确认的方式。
- 超时事件。定时器将用于恢复数据或者确认分组丢失。
3.4.4 选择重传(SR协议)
SR发送方的事件与动作
- 从上层收到数据。当从上层收到数据以后,SR发送方检查下一个可用于该分组的序号。
- 超时。定时器再次被用来防止丢失分组。
- 收到ACK。如果收到ACK,倘若该分组序号在窗口内,则SR发送方将那个被确认的分组标记为已接收。如果该分组的序号等于send_base,则窗口基序号向前移动到具有最小序号的未被确认分组处。
SR接收方的事件与动作
- 序号在 [rcv_base, rcv_base+N-1] 内的分组被正确接收。在此情况下,收到的分组落在接收方的窗口内,一个选择 ACK 被回送给发送方。如果该分组以前没收到过,则缓存该分组。如果该分组的序号等于接收端的基序号(rcv_base),则该分组以及以前缓存的序号连续的(起始于 rcv_base 的)分组交付给上层。然后,接收窗口按向前移动分组的编号向上交付这些分组。
- 序号在 [rcv_base-N, rcv_base-1] 内的分组被正确收到。在此情况下,必须产生一个 ACK,即使该分组是接收方以前确认过的分组。
- 其他情况。忽略该分组。