TCP面试系列停止等待协议

TCP 面试系列第三弹,可靠性传输之停止等待协议。

我们知道,理想的传输条件有以下两个特点:

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

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

下面从最简单的停止等待协议讲起。

停止等待协议

因为全双工通信的双方既是发送方也是接收方,下面为了讨论问题的方便,我们仅考虑 A 发送数据而 B 接收数据并发送确认。因此 A 叫做发送方,而 B 叫做接收方。这里是讨论可靠传输的原理,因此把传送的数据单元都称为分组,而并不考虑数据是在哪一个层次上传送的。

“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

如上图(a)所示,表示无差错情况下:

  1. A 发送分组 M1,发完就暂停发送,等待 B 的确认。
  2. B 收到了M1就向 A 发送确认。
  3. A 在收到了对 M1的确认后,就再发送下一个分组 M2。
  4. 同样,在收到 B 对 M2 的确认后,再发送 M3。

如上图 (b)所示,是传输过程中出现了差错的情况下的超时重传机制。

出现差错分为两种:

  1. M1在传输的过程中丢失了
  2. B 接收 M1 时检测出了差错,直接丢弃 M1

上面两种情况下,B 都不会发送任何消息给 A。

为了解决上述场景遇到的问题,可靠传输协议是这样设计的:A 只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这就叫做超时重传。

要实现超时重传,就要在每发送完一个分组设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。

下面再考虑两种更负载的情况,确认丢失和确认迟到。

确认丢失。

如上图中的(a)所示,假设 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内没有收到确认。原因有很多,可能是 A 自己发送的分组出错、丢失,或者是 B 发送的确认丢失了。 因此 A 在超时计时器到期后就要重传 M1。现在应注意 B 的动作。假定 B 又收到了重传的分组 M1。这时应采取两个行动:

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

确认迟到。

如上图(b)所示,假设传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了。A 会收到重复的确认。 对重复的确认的处理很简单:收下后就丢弃。 B 仍然会收到重复的 M1,并且同样要丢弃重复的 M1,并重传确认分组。