TCP下面的IP层是尽最大努力的交付,是不可靠的,所以TCP需要靠自己去完成可靠传输。下面,我们先从简单的停止等待协议来讲解可靠传输的如何实现的。需要注意可靠传输的几个特点:不丢失、不重复、按序到达。
注意,TCP并不使用停止等待协议来实现可靠传输。
停止等待协议
传输层的数据传输单元称为段。下面,为了方便,都称为分组。
停止等待协议的原理非常简单,发送一个分组后就停止继续发送,等待收到上一个分组的确认后,再继续发送后面的分组。
下面通过几个不同情况来分析:
无差错情况
无差错情况非常简单,如下图。每发送完一个分组后,就停止发送,等待收到该分组的确认后,再继续发送后面的分组。
出现差错
出现差错分两种情况,第一种是发送的分组没有交付成功到目的地址,另一种情况是传送的数据包有差错。通过图例,我们来分析两种情况
首先来看看B的操作:A发送M1分组,该分组如果是错误的,B收到后会丢弃该数分组,然后什么也不做(不会通知A收到了错误分组)。如果B没有收到M1分组,那么它什么也不知道,也不会去做任何动作。
接下来看A是如何做的:A发完分组后,迟迟收不到B对M1分组的确认后,当等待的时间超时了,那么就需要重新发送该M1分组。要实现超时重传,就需要设置一个超时计时器,当发送的一个分组在超时时间前收到了确认,那么就重置超时计时器,否则的话就需要重传分组。
有几点是需要注意的:
A在发送完一个分组后,必须还要保存该分组的副本,以便超时重传。当收到这个分组的确认后,就可以丢弃该分组的副本了。
需要给每一个分组做编号,这样才知道是各个分组的到达情况。
超时时间应该设置的比平均传输时间稍长一些,以免引起不必要的重传。
确认丢失和确认迟到
除了分组在传送过程中会出现差错,在返回确认的时候,也会出现差错——确认丢失和确认迟到。
首先看确认丢失情况,A的分组B收到了,并给A发送了确认,但该确认丢失了,A没有收到。因为A没有收到M1的确认,那么等待超过超时后,就会向B重传M1。这个时候B收到了重复的分组M1,需要做两个操作:
将重复的分组M1丢弃
向A发送M1的确认。因为既然A重传了M1,就表示A没有收到M1的分组。所以B需要继续发送对M1的确认。
再来看另一种情况,对M1的分组确认迟到了(超过超时时间后才收到)。A在收到重复的确认后,会丢弃,其他什么也不做。
通过上述的超时重传机制,就可以实现在不可靠的网络传输上实现可靠的传输。
信道利用率
上述的停止等待协议简单,但它有一个非常大的缺点——信道的利用率太低。在等待收到确认的这段时间,信道是完全空闲的,十分浪费。
为了提高信道利用率,可以使用流水线传输,流水线传输可以连续发送多个分组,这样就可以大大提高信道利用率了。
采用流水线传输的协议有连续ARQ协议和窗口滑动协议。而TCP就是采用滑动窗口协议来完成可靠传输的。
以上是一文读懂TCP的可靠传输原理的详细内容。更多信息请关注PHP中文网其他相关文章!