TCP发送的报文段是交给IP层传送的,但IP层只能提供尽最大努力服务,也就是说,TCP下面的网络所提供的的是不可靠的传输。因此,TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。
全双工通信的双方既是发送方也是接收方,为了讨论问题的方便,我们仅考虑A发送数据,B接收数据并发送确认。因此A叫做发送方,B叫做接收方。为讨论可靠传输的原理,所传送的数据单元都称为分组。
停止等待就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
停止等待协议可用下图来说明,这是最简单的情况。A发送分组M1,发完就暂停发送,等待B的确认。B收到了M1就向A发送确认。A在收到对M1的确认后,就再发送下一个分组M2。同样,在收到B对M2的确认后,就发送M3。
如下图所示:
B接收M1时检测出了差错,就丢弃M1,其它什么也不做(不通知A收到有差错的报文)。也可能是M1在传输过程中丢失了,这时B当然什么都不知道。在这两种情况下,B都不会发送任何信息。可靠传输协议是这样设计的:A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组,这就叫做超时重传。要实现超时重传,就要在每发送完一个分组时设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。注意一下三点:
A在发送完一个分组后,必须暂时保留已发送的分组的副本(超时重传时使用)。只有在收到相应的确认后才能清除保留的分组副本
分组和确认分组都必须进行编号。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认
超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。上图的虚线表示如果M1正确到达B,同时A也正确收到确认的过程。可见重传时间应设定为比平均往返时间更长一些。如果重传时间设定得很长,那么通信的效率就会很低。如果重传时间设定得太短,以致产生了不必要的重传,就浪费了网络资源。
下面两幅图中,左边的图表示确认丢失。B所发送的对M1的确认丢失了。A在设定的超时重传时间内没有收到确认,并无法知道是自己发送的分组出错、丢失,或者是B发送的确认丢失。因此,A在超时计时器到期后就要重传M1。假定B收到了重传的分组M1,这时应采取两个行动:
(1)丢弃这个重复的分组M1,不向上层交付
(2)向A发送确认。不能认为已经发送过确认就不再发送,因为A之所以重传M1,就表示A没有收到对M1的确认。
右边的图表示确认迟到。传输过程中没有出现差错,但B对分组M1的确认迟到了。A就会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃。B依然会收到重复的M1,并且同样要丢弃重复的M1,并重传确认分组。通常A最终总是可以收到对所有发出的分组的确认。如果A不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信。
停止等待协议的优点是简单,但缺点是信道利用率太低。
假定A发送分组需要的时间是T1,显然T1等于分组长度除以数据率。再假定分组正确到达B后,B处理分组的时间可以忽略不计,同时立即发回确认。假定B发送确认分组需要时间T2。如果A处理确认分组的时间也可以忽略不计,那么A在经过时间(T1 + RTT + T2)后,就可以发送下一个分组,RTT是往返时间。因为仅仅是在时间T1内才用来传送有用的数据,因此,信道的利用率可用下式计算:U = T1 / T1 + RTT + T2
当往返时间RTT远大于分组传送时间T1时,信道的利用率就会非常低。为了提高传输率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断的在传送。显然,这种传输方式可以获得很高的信道利用率。
当使用流水线传输时,就要使用下面介绍的连续ARQ协议和滑动窗口协议。
滑动窗口协议比较复杂,是TCP协议的精髓所在,这里先介绍连续ARQ协议的基本概念。
下图表示发送方维持的发送窗口,它的意义是:位于发送窗口内的5个分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了。
连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。如下图所示,表示发送方收到了对第一个分组的确认,于是把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组,那么现在就可以发送窗口内的第6个分组了。
接收方一般都是采用累积确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,表示:到这个分组为止的所有分组都已正确收到了。累积确认有优点也有缺点。优点是:容易实现,即使确认丢失也不必重传。缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息。例如,发送方发送了前5个分组,而中间的第三个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,只好把后面的三个分组都再重传一次。这就叫做Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。可见当通信线路质量不好时,连续ARQ协议会带来负面的影响。