26-tcp可靠传输——停止等待协议

1. tcp可靠传输

  通过前面的学习可知,网络层传输数据时是尽最大努力传输到目的地,并不保障数据的可靠传输,对于网络拥塞,延迟,数据丢失等问题没有采取有效的措施。因此我们需要一种数据可靠传输的通信方式,即tcp来实现发送端和接收端之间的可靠通信。

  那么为了后面学习tcp可靠传输,先从最简单的可靠传输停止等待协议说起吧。

2. 停止等待协议

  什么是停止等待协议?

  A和B双方建立好tcp连接后就可以相互发送数据了,A为发送方,B为接收方。因为这里讨论可靠传输原理,所以把传输的数据单元称为分组。“停止等待”就是每发送完一个分组就停止发送,等待对方确认后再发送下一个分组。停止等待协议考虑了数据在网络中传输出现的几种情况来提供有效措施保障数据的可靠传输,下面我们就一一来介绍这几种情况。

  对于无差错情况,不会出现重传情况,那么我们直接跳过,没什么好说的。

2.1 出现差错或丢失的情况

26-tcp可靠传输——停止等待协议
图1-出现差错或丢失

  当A在发送M1分组的过程中丢失时,又或者B接收到M1分组检测到差错并丢弃了M1分组时(注意:这里B不会发送M1确认分组,而是什么也不做),可靠传输协议是这样设计的:只要A没有在规定时间内收到B的确认,就认为刚才发送的分组丢失了,并对丢失的分组进行重传,这种方式叫超时重传。要实现超时重传,就要每发送完一个分组就设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,则撤销该超时计时器。

这里注意几点:
  1. A发送完一个分组后,必须暂时存储已发送的分组的副本(发生超时重传时使用),当收到该分组的确认时就清除本地存储的分组的副本。

  2. 分组和确认分组都必须进行编号,这样才能明确哪一个已发送的分组被确认,哪一个还没被确认。

  3. 超时计时器设置的重传时间比数据分组传输的平均往返时间更长一些,在设置重传时间也是有要求的。因为重传时间设置的过长会导致重传花费的时间长,通信效率慢,但是重传时间设置的过短会导致出现不必要的重传,浪费网络资源。

  比如B发送的确认分组发生在网络中发生拥塞,传输的时间过长才到达A,但是A设置的重传时间又很短,就会出现不必要的重传。因此设置重传时间是非常复杂的,因为分组在网络传输的过程中经过哪些网络,是否会出现网络拥塞或其他问题,都是不确定的。

2.2确认丢失的情况

26-tcp可靠传输——停止等待协议
图2-确认丢失

  当B收到A的M1分组后,B发送的M1确认分组在网络中丢失了,且A在设定的超时重传时间内又没有收到B的M1确认分组,这时A无法知道是自己发送的M1分组出错丢失,还是B发送的M1确认分组丢失了,那么A会在超时计时器到期后重传M1分组。

  如果B又收到了重传的分组M1,这时B会丢弃重复的M1分组,并向A发送M1确认分组(很明显,因为A本来就没有收到过确认啊)

2.3 确认迟到的情况

26-tcp可靠传输——停止等待协议
图3-确认迟到

  假设这么一种情况:A在发送M1分组后,B发送的确认M1分组却迟到了,但是A在超时计时器规定的时间内又没有收到B的确认M1分组,那么A将会重传M1分组,根据前面所知的情况来看,B在收到重复的M1分组后会丢弃并重传确认M1分组。那么在A收到重传的确认分组后,又收到了B迟到的确认M1分组,这是A会丢弃迟到的确认M1分组。

  像上面所说的可靠传输协议通常称为自动重传请求,也就是说,重传时自动进行的,只要发送方没收到确认,就会重传。如果A不断重传分组却总是也收不到确认,这说明通信线路太差,不能进行通信。