计算机网络学习(十八)—— 可靠传输的工作原理

339 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

前言

TCP 发送的报文段是交给 IP 层传送的。但 IP 层只能提供尽最大努力服务,也就是说,TCP 下面的网络所提供的是不可靠的传输。因此,TCP 必须釆用适当的措施才能使得两个传输层之间的通信变得可靠。

理想的传输条件有以下两个特点:

  1. 传输信道不产生差错。
  2. 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。

在这样的理想传输条件下,不需要釆取任何措施就能够实现可靠传输。然而实际的网络都不具备以上两个理想条件。但我们可以使用一些可靠传输协议,当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速度。这样一来,本来不可靠的传输信道就能够实现可靠传输了。下面我们来看一看常见的可靠传输协议。

停止等待协议

全双工通信的双方既是发送方也是接收方。下面为了讨论问题的方便,我们仅考虑 A 发送数据而 B 接收数据并发送确认。因此 A 叫做发送方,而 B 叫做接收方。

无差错情况

停止等待协议最简单情况是无差错情况。A 发送分组 d1,发完就暂停发送,等待 B 的确认。B 收到了 d1 就向 A 发送确认。A 在收到了对 d1 的确认后,就再发送下一个分组 d2。同样,在收到B对M2的确认后,再发送 d2。

差错情况

当 A 发送完分组 d1 之后,B 接收 d1 时检测出了差错,就丢弃 d1,其他什么也不做,有可能在 d1 传输过程中丢失了,这时 B 当然什么都不知道。在这两种情况下,B 都不会发送任何信息。

可靠传输协议是这样设计的:A 只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了, 因而重传前面发送过的分组。这就叫做 超时重传。要实现超时重传,就要在每发送完一个分 组时设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。

这里有几点需要注意:

  1. A 在发送完一个分组后,必须暂时保留已发送的分组的副本(在发生超时重传时使用)。只有在收到相应的确认后才能清除暂时保留的分组副本。
  2. 分组和确认分组都必须进行编号。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认。
  3. 超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。显然,如果重传时间设定得很长,那么通信的效率就会很低。但如果重传时间设定得太短,以致产生不必要的重传,就浪费了网络资源。然而,在传输层重传时间的准确设定是非常复杂的,这是因为已发送出的分组到底会经过哪些网络,以及这些网络将会产生多大的时延(这取决于这些网络当时的拥塞情况),这些都是不 确定因素。

确认丢失和确认迟到

另一种情况。B 所发送的对 d1 的确认丢失了。A 在设定的超时重传时间内没有收到确认,并无法知道是自己发送的分组出错、丢失,或者是 B 发送的确认丢失了。因此 A 在超时计时器到期后就要重传 d1。

假设现在 B 又收到了重传的分组 d1。这时应采取两个行动:

  1. 丢弃这个重复的分组 d1,不向上层交付。
  2. 向 A 发送确认。不能认为已经发送过确认就不再发送,因为 A 之所以重传 d1,就表示 A 没有收到对 d1 的确认。

另外一种情况就是传输过程中没有出现差错,但 B 对分组 d1 的确认迟到了。A 会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃。B 仍然会收到重复的 d1,并且同样要丢弃重复的 d1 并重传确认分组。

通常 A 最终总是可以收到对所有发出的分组的确认。如果 A 不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信。

使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。 像上述的这种可靠传输协议常称为 自动重传请求 ARQ (Automatic Repeat reQuest)。意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。

优缺点

停止等待协议的优点是简单,但缺点是信道利用率太低。

连续 ARQ 协议

滑动窗口协议比较复杂,是 TCP 协议的精髓所在。滑动窗口孕育同一时间内位于窗口的多个分组都可以连续发送过去,而不需要等待对方的确认,这样,信道利用率就提高了。

连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。

接收方一般都是釆用累积确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了。

累积确认有优点也有缺点。优点是:容易实现,即使确认丢失也不必重传。但缺点是不能向发送方反映出接收方己经正确收到的所有分组的信息。

例如,如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做Go-back-N(回退 N),表示需要再退回来重传巳发送过的 N 个分组。可见当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。

参考文档

  • 《计算机网络》—— 谢希仁

往期文章