由于下层网络层(IP)可能出现丢失、重复或失序包的情况,TCP协议提供可靠数据传输服务。为保证数据传输的正确性,TCP重传其认为已丢失的包。TCP根据接收端返回发送端的一系列信息来判断是否出现丢包。当数据段丢失或确认信息丢失,TCP启动重传操作,重传尚未确认的数据。TCP拥有两套操作来确认重传,一是基于时间的,而是基于确认信息的构成。
一、超时重传
超时重传是指,发送数据包在一定的时间周期内没有收到相应的ACK,超过设定的等待时间后就认为这个数据包丢失,就会重新发送,这个等待时间称为重传超时时间(RTO,Retransmission TimeOut)。
1.重传超时时间
RTO(Retransmission TimeOut)即重传超时时间。TCP超时与重传中一个很重要的部分是对一个给定的连接的往返时间(RTT)的测量。由于网络流量的变化,这个时间会相应地发生变化,TCP需要跟踪这些变化并动态调整超时时间RTO。
RTT(Round Trip Time)由三部分组成:链路的传播时间、末端系统的处理时间、路由器缓存中的排队和处理时间。其中,前两个部分对于一个TCP连接相对固定,路由器缓存中的排队和处理时间会随着整个网络的拥塞程度的变化而变化。所以RTT的变化在一定程度上反映了网络的拥塞程度。
TCP超时和重传的基础是怎样根据给定连接的RTT设置RTO。RTO的值被设置过大过小都会对协议造成不良影响。如果RTO设置过大将会使发送端经过较长时间的等待才能发现报文段丢失,降低了连接数据传输的吞吐量;RTO设置过小,则会造成不必要的重传,浪费网络资源。
2.怎样根据RTT设置RTO
对一个连接而言,如能够了解端点间的传输往返时间(RTT,Round Trip Time),则可根据RTT来设置一个合适的RTO。显然,在任何时刻连接的RTT都是随机的,无法事先预知。TCP通过测量来获得当前RTT的一个估计值,并以该RTT估计值为基准来设置当前的RTO。
RTO=srtt+4*sttvar
rttvar :平均偏差
srtt:平滑的RTT估计值
3.重传二义性与Karn算法(RTT的精确估值测量)
当接收到重复传输(即至少重传一次)数据的确认信息时,不进行该数据包的RTT测量,可以避免二义性问题。另外,对该数据之后的包采取退避策略,仅当接收到未经重传的数据时,该SRTT才用于计算RTO。
二、快速重传
在超时重传中,定时器超时后才会认为发送的数据包丢失了。快速重传机制实现了另外的一种丢包评定标准,即如果连续收到三次ACK,发送方就认为这个包丢失了,需要重新传递。这个机制不需要等到重传计时器溢出,所以叫做快速重传。它可以避免发送端因等待重传计数器的超时而空闲较长时间,以此增加网络吞吐量。而重新传递以后,因为走的不是慢启动而是拥塞避免算法,所以这又叫做快速恢复算法。