RTT:发送TCP报文段到收到ACK的时间。
RTO:TCP决定重传的超时时间,这是一个基于RTT的统计时间。
TCP超时重传分为基于计时器的重传和快速重传。
失序数据:序列号高于空缺的数据成为失序数据,因为这些数据和之前接收到的序列号不连续。
1.基于计时器的重传:
TCP根据基于时间动态变化的RTT测量值得到RTO,发送报文段时应确保重传计时器设置合理。在设置定时器前,需要记录被计时的报文段的序列号,若等待时间没有超过RTO就收到了该报文段的ACK,那么计时器被取消。之后发送端发送一个新的数据报时,需设定一个新的计时器,并记录新的序列号。因此,每一个TCP连接的发送端不断地设定和取消一个个报文段的重传计时器,如果没有数据丢失,则不会发送计时器超时。若在设定的RTO内,TCP没有收到被计时的报文段的ACK,将会触发该报文段的超时重传。
若发生超时重传,TCP将降低当前数据发送的发送速率来减少网络压力,有2种方法:第一种方法是基于拥塞控制机制减小发送窗口的大小;另一种方法是每当一个重传报文段被再次重传时,则增大RTO退避因子,使发送间隔时间呈指数增长,有效减轻网络压力。
2.基于接收端的反馈信息的快速重传:
当接收端接收到失序的报文段时,TCP需要立即生成确认信息(重复ACK),并且失序情况表明在后续数据到达前出现了丢段,即接收端的缓存出现了空缺的报文段。发送端应该尽快补发该报文段。当失序数据到达时,重复ACK应该立即返回,不能延迟发送,原因在尽快使发送端尽早知道有失序报文段,并告知发送端缺失的报文段的序列号。当采用SACK时,重复ACK通常包含SACK信息,利用SACK信息可以一次告知多个缺失的报文段。由于接收端收到当前期盼的序列号报文段之后的分组时,无法知道当前期盼的报文段是丢失了,还是延迟达到,所以,发送端等待一定数量的重复ACK(称为重复ACK阈值或者dupthresh)来决定数据是否丢失并触发快速重传。dupthresh一般取3。
所以,TCP发送端在收到至少dupthresh个重复ACK后,即重传可能丢失的数据段,而不必等到重传计时器超时,当然也可以同时发送新的数据。根据重复ACK推断的丢包通常与网络拥塞有关,因此快速重传一般会触发拥塞控制机制。不采用SACK时,在接收到有效ACK前至多只能重传一个报文段。采用SACK,ACK可以包含额外的信息,使得发送端可以在每个RTT时间内重传多个缺失的报文段。