文章目录
1、TCP实现可靠性传输概述
我们一直在讲TCP是有连接,可靠的,面向字节流的传输协议,那么TCP是如何实现其可靠性呢?主要从下列三个方面来保证TCP可靠性:
- 保证数据能够到达对方:通过应答确认、超时重传保证数据的
无差错到达
,滑动窗口保证发送方发送数据和接收方速率匹配
,拥塞控制保证发送发发送数据的速率与当前网络情况相匹配
来保证。 - 保证数据不重复、不乱序:通过32位seq序列号保证,因为seq的初始值是随机生成的,在三次握手结束后,保证了通信的双方知道彼此的初始化seq,这个序列号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输问题而乱序。TCP会用这个序号来拼接数据,这样就可以保证数据的不重复,有序。
- 保证数据不失真:通过报文首部的16位校验和保证,添加12字节的伪首部进行检验,一般采取CRC冗余检验实现。
2、可靠传输的工作原理之确认应答、超时重传
当我们的网络不具备理想的传输条件时不能采取任何的措施来实现可靠传输,由此我们就要使用一些靠传输协议
。
当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的数据,即实现TCP传输时的应答确认、超时重传,主要有两种协议:停止等待协议和连续ARQ协议。
2.5停止等待协议
1、概念
从字面意思上我们就可以很好的理解,就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
在全双工通信的双方既是发送方也是接收方,我们现在假定A发送数据,B接收数据,因此A叫做发送方,B叫做接收方,传送给的数据单元都成为分组。
在使用停止等待协议时,A,B端会有以下几种情况出现:无差错情况,出现差错,确认丢失,确认迟到
。下面我们来一一讲述。
2、不同情况下的停止等待协议
2.1无差错的情况
从下图中,我们可以看到A发送一个分组过后要等待B回复确认过后才能发送下一个分组。
2.2出现差错的情况
出现差错的情况一般有两种:
- B接收M1时检测出了差错
- M1在传输的过程中丢失了
这时B就会自动丢弃有差错的分组,并不会去通知A,A只要超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,就重传前面发送的分组,这也就是我们之前所说的超时重传机制
,如下图所示:
【补充】超时重传机制
- 在每发送的一个分组设置一个超时计时器,这个时间的设置采用TCP提供的自适应算法得到,如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。
- 否则就进行重传。
【注意】
- 必须暂时保留已发送的分组副本,只有在收到相应的确认后才能清除暂时保留的分组副本
- 分组和确认分组都必须进行编号
- 超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。太长通信效率会降低,太短会产生不必要的重传。
2.3确认丢失
当B所发送的对M1确认丢失了导致A在设定的超时重传时间内没有收到确认。A会在超时计时器到期后重传M2。这时B又收到了重传的分组M2,这时会采取两个行动&