重传方式
- 回退方式
- 选择重传
什么时候要重传了?
- 超时重传
- 快速重传
回退方式
如果采用回退方式处理接收到的不连续的字节流,它会把丢失那个序号以后的字节数据全部重传,不管之后的数据是否成功接收。
选择重传
当出现需要重传时候,只需要在重传队列中寻找那些未传输成功是数据,然后,重新传输那些丢失的数据。
超时重传介绍
超时重传需要一个辅助的工具:重传定时器。当发送方把一个TCP报文段交给了网络层后,首先将该报文的副本放入到重传队列中,同时启动一个重传定时器。该重传定时器会被设定一个初值,然后,开始倒计时,如果在重传定时器的值为0时,还没有收到该报文段的确认报文,则会准备重传该报文。
重传定时器值的设置
我们把重传定时器的值称为:RTO(Retransmission TimeOut);而为确定RTO,我们还需要一个参考值,它就是RTT(数据报发送和确认信息的往返时间)。如果发生了超时重传,我们把RTO=i X RTT,其中i为一个大于1的正整数,在《计算机网络:自顶向下》的第165页就是把i设置为:2。如果没有发生数据报丢失的话,那么我们也要更新该TCP连接的RTT的值,公式为:RTT=j X 旧RTT+(1-j) *最新测量的RTT 。因为在网络的环境是千变万化的,所以我们需要不断的更新RTT以适应新的的网络环境,j在[RFC 6289]中的给出的参考值是:0.125。
为啥:RTO=i * RTT
在出现超时的时候,我们需要重传数据并且会重启重传定时器,该定时器的值会被设置为:RTO。那为啥不能像设置普通重传计时器一样,设置为最新的RTT了?这个主要是因为定时器过期很可能由于网络拥塞引起的,造成分组丢失或长时间排队时延。所以如果源总是在很短的时间内,持续的重发分组,会让拥塞加剧。
最大重传次数取决于发送操作系统的配置值。默认情况下,Windows主机默认重传5次。大多数Linux系统默认最大15次。两种操作系统都可配置。
快速重传
超时重传有一个最大的缺点就是超时周期可能相对较长。当一个报文丢失后,这种长超时周期迫使发送方延迟重传丢失的分组,因而增加了端到端的时延。幸运的是,发送方可在超时之前通过注意是否出现了冗余ACK来较好的检测是否发送了丢包。
什么是冗余ACK
因为TCP不使用否认确认,所以接收方不能向发送方发回一个显示的否认确认,它只对已经成功接收的最后一个按序字节数据进行重复确认。发送方收到的多余的对某个序列的确认报文,我们就叫多余的ACK为冗余的ACK,如果冗余ACK的数量达到了三个(换句话说,就是发送方收到了四个同样的ACK报文)。这个时候就会启动快速重传机制,对丢失的报文进行重传。
总结
重传机制是TCP可靠传输的一个保障机制。超时重传机制和快速重传机制在一个系统是同时存在,其中快速重传和快速恢复,会应用在拥塞控制中,这个将会在后续介绍