这里,我们在一般场景下考虑可靠数据传输的问题。因为可靠数据传输的实现问题不仅在传输层出现,也会在链路层及应用层出现。

    下图说明了我们学习可靠数据传输的框架。为上层实体提供的服务抽象是:数据可以通过一条可靠的信道进行传输。借助可靠信道,传输数据比特就不会受到损坏或丢失(传输的是01比特流),而且所有数据都是按照其发送顺序进行交付。这恰好就是 TCP 向调用它的因特网所提供的网络服务模型。

    实现这种服务抽象是可靠数据传输协议(reliable data transfer protocol)的责任。

    ♦ 可靠数据传输协议 - 图1

    实现这种服务抽象是可靠数据传输协议(reliable data transfer protocol)的责任。由于可靠数据传输协议的下层协议也许是不可靠的,因此这是一项困难的任务。例如,TCP 是在不可靠的(IP 协议)端到端网络层之上实现的可靠数据传输协议。

    更一般的情况是,两个可 靠通信端点的下层可能是由一条物理链路(如在链路级数据传输协议的场合下)组成或是由一个全球互联网络(如在运输级协议的场合下)组成。然而,就我们的目的而言,我们可将较低层直接视为不可靠的点对点信道。

    在本节中,考虑到底层信道模型越来越复杂,我们将不断地开发一个可靠数据传输协议的发送方一侧和接收方一侧。例如,我们将考虑当底层信道能够损坏比特或丢失整个分组时,需要什么样的协议机制。这里贯穿我们讨论始终的一个假设是分组将以它们发送的次序进行交付,某些分组可能会丢失;这就是说,底层信道将不会对分组重排序。

    上图 3.8b 说明了用于数据传输协议的接口。通过调用 rdt_send() 函数,上层可以调用数据传输协议的发送方。它将要发送的数据交付给位于接收方的较高层。(这里 rdt 表示可靠数据传输协议,_send 指示 rdt 的发送端正在被调用。开发任何协议的第一步就是要选择一个好的名字!)

    在接收端,当分组从信道的接收端到达时,将调用 rdt_rcv()。当 rdt 协议想要向较高层交付数据时,将通过调用 deliver_data() 来完成。后面,我们将使用术语 “分组” 而不用运输层的 “报文段”。因为本节研讨的理论适用于一般的计算机网络,而不只是用于因特网运输层,所以这时采用通用术语 “分组” 也许更为合适。

    在本节中,我们仅考虑单向数据传输 (unidirectional data transfer) 的情况,即数据传输是从发送端到接收端的。双向数据传输 (bidirectional data transfer) (即全双工数据传输) 情况从概念上讲不会更难,但解释起来更为单调乏味。

    虽然我们只考虑单向数据传输,注意到下列事实是重要的,我们的协议也需要在发送端和接收端两个方向上传输分组,如上图 3.8 所示。我们很快会看到,除了交换含有待传送的数据的分组之外,rdt 的发送端和接收端还需往返交换控制分组。rdt 的发送端和接收端都要通过调用 udt_send() 发送分组给对方 (其中 udt 表示不可靠数据传输)。