可靠数据传输是网络中最为重要的问题之一。TCP所采用的许多原理,都是可靠数据传输的内容。
图1 说明了我们学习可靠数据传输的框架:
①为上层实体提供的服务抽象是:数据可以通过一条可靠的通道进行传输。借助于可靠通道,数据就不会受到损坏或丢失(如图1 的(a)所示)。
②实现这种服务抽象是可靠数据传输协议(reliabel data transfer protocol)的责任。由于可靠数据传输协议的下一层协议也许是不可靠的(如TCP的下层是不可靠的IP),所以这是一项困难的任务。
图1 的(b)说明了用于数据传输协议的接口。通过调用rdt_send()可以调用数据传输协议的发送方(rdt表示可靠数据传输协议,reliable data transfer),rdt发送方将数据封装成分组后传给下层协议进行运输。当分组从信道的接收端到达时,将调用rdt_rcv()。rdt接受方对分组进行一定的处理,然后rdt协议调用deliver_data来将可靠的数据向较高层交付。
在 本节中,考虑到底层信道模型越来越复杂,我们将不断开发一个可靠数据传输协议的发送方和接收方。
一、构建可靠数据传输协议
在开始讨论rdt前,我们需要了解一下有限状态机(Finite-State Machine,FSM)。
①FSM中的箭头表示协议从一个状态变迁到另一个状态;
②引起变迁的事件显示在表示变迁的横线上方;
③事件发生时所采取的动作显示在横线下方;
④如果对一个事件没有动作,或没有事件发生而采取一个动作,我们将在横线的上方或下方使用一个符号 A;
⑤FSM的初始状态用虚线表示;
1. 经完全可靠信道的可靠数据传输:rdt 1.0
rdt的发送端只通过rdt_send(data)事件接收来自较高层的数据,产生一个包含该数据的分组packet=make_pkt(data),并将分组发送到通道。实际上,rdt_send(data)是由较高层应用的过程调用产生的(例如:rdt_send(),图中的虚线)。图2 的(a)的FSM定义了发送方的操作
rdt的接收端通过rdt_rcv(packet)事件从底层信道接收一个分组,从分组中取出data=extract(packet,data),并通过deliver_data(data)将数据传送给较高层。实际上,rdt_rcv(packet)是由较低层协议的过程调用产生的(例如:rdt_rcv(),图中的虚线)。图2中的(b)定义了接收方的操作。
在这个简单的协议中,一个data与一个packet没有差别。而且,所有的分组是由发送方流向接收方;有了完全可靠的信道,接收方就不需要提供任何反馈信息给发送方,因为不必担心出现差错!这里也假设了接收方接收数据的速率能够与发送方发送数据的速率一样快,所以接收方不需要请求发送方慢一点!
2. 经具有比特差错信道的可靠数据传输
(一)rdt 2.0
底层信道更为实际的模型是分组中的比特可能受损。在分组的传输、传播和缓存中,这种比特差错通常会出现在网络的物理部件中。现在,仍继续假设,所有的分组(虽然比特可能受损)将按其发送顺序被接收。
由于信道可能会引入比特差错,为了让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需要重传,接收方收到的报文后,
①如果没有差错,则给发送方返回一条肯定确认(po