• 可靠数据传输中为上层实体提供的服务抽象是:数据可以通过一条可靠的信道进行传输。借助于可靠信道,传输数据比特就不会受到损坏(由0变成1,或者相反)或丢失,而其额所有数据都是按照其发送顺序进行交付。这恰恰就是TCP向调用它的因特网应用所提供的服务模型。
  • 我们现在一步步研究一系列协议,他们一个比一个更为复杂,最后得到一个无错、可靠的数据传输协议。
  • 底层信道使分组中的比特可能受损。在分组的传输、传播或缓存的过程中,这种比特差错通常会穿线在网络的物理部件中。我们先假设所有发送的分组将按其发送顺序被接收。
  • 肯定确认与否认确认。这些控制报文使得接收方可以让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需要重复。在计算机网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求协议。
  • 差错检测。需要一种机制以使接收方检测到何时出现了比特差错。
  • 接收方反馈。在口述报文情况下回答的“肯定确认“(ACK)和”否定去人“(NAK)就是这种反馈的例子。我们的协议将从接收方向发送方回送ACK与NAK分组。理论上,这些分组只需要一个比特长;如用0表示NAK,用1表示ACK。
  • 重传。接收方收到了有差错的分组时,发送方将重传该分组。
  • 注意到下列事实很重要:当发送方处于等待ACK或NAK的状态时,它不能从上层获得更多的数据;这就是说,rdt_send()事件不可能出现;仅当接收到ACK并离开该状态时才能发生这样的事件。因此,发送方将不会发送一块新数据,除非发送方确信接收方已正确接收当前分组。由于这种行为,这样的协议称为停等协议。
  • 以上方式存在一个致命的缺陷,没有考虑ACK或NAK分组受损的可能性。解决这个新问题的一个简单方法(几乎所有现有的数据传输协议中,包括TCP,都采用了这种方法)是在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号放在该字段。于是,接收方只需要检查序号即可确认接收到的分组是否一次重传。对于停等协议这种简单情况,1比特序号就足够了,因为它可让接收方知道发送方是否正在重传前一个发送分组(接收到的分组需要与最近收到的分组序号相同),或是一个新分组(序号变化了)。因为目前我们假设信道不丢失分组,ACK和NAK分组本身不需要指明他们要确认的分组序号,发送方知道锁接收的ACK和NAK分组(无论是否是含糊不清的)是为响应其最近发送的数据分组而生成的。
  • 发送方需要等待多久才能确定已丢失了某些东西呢?等待一个最坏情况的时延可能意味着要等待一段很长的时间,知道启动差错恢复为止。因此实践中采取的方法是发送方明智地选择一个时间值,以判断可能发生了丢包(尽管不能确保)。如果在这个时间内没有收到ACK,则重传该分组。注意到如果一个分组经历了一个特别大的时延,发送方可能会重传该分组,即使该数据分组及其ACK都没有丢失。这就在发送方到接收方的信道中引入了冗余数据分组的可能性。前面已经通过序号来处理冗余分组情况。
  • 从发送方的观点来看,重传是一种万能灵药。发送方不知道是一个数据分组丢失,还是一个ACK丢失,或者只是改分组或ACK过度延时。在所有这些情况下,动作是同样的:重传。为了实现基于时间的重传机制,需要一个倒计时定时器,在一个给定的时间量过期后,可中断发送方。因此,发送方需要能做到:1每次发送一个分组(包括第一次分组和重传分组)时,便启动一个定时器。2响应定时器中断(采取适当的动作)3终止定时器。
  • 现在我们归纳一下数据传输协议的要点。在检验和、序号、定时器、肯定和否定确定分组这些技术中,每种机制都在协议的运行中起到了必不可少的作用。
  • 以上是一个功能正确的协议,但并非人人都对它的性能满意,特别是在今天的高速网络中更是如此。核心问题在于它是一个停等协议。~~~~~~~~~~下回分解