超时重传
重传机制会设定一个定时器
,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据,这就是超时重传
。
超时重传时间RTO
假设在重传的情况下,超时时间 RTO 过长或过短时,会发生什么事情呢?
- 当超时时间 RTO 较大时,重发就慢,丢了老半天才重发,没有效率,性能差;
- 当超时时间 RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
所以精确的测量超时时间 RTO 的值是非常重要的,这可让我们的重传机制更高效。
那RTO该如何设置最高效呢?
设置成略大于报文往返时间RTT
具体做法:取多个RTT的取平均值
比如第一次 RTT 为 500ms,第二次 RTT 为 800ms,那么第三次发送时,各让一步取平均值 RTO 为 650ms。
重传二义性
重传必然会有重传二义性
重传二义性:当重传一方收到重传请求中的某个请求的应答时,它不能区分该应答对应哪一次请求。
- 如果算作对第一次的应答,就会出现如下图 1 和图 2 中的问题,RTT 时间明显是大于实际值
- 如果算作对第二次的应答,,就会出现图 3 中的问题,RTT 时间明显小于实际值
那么如何解决呢?
在TCP头加入重传序列号
,用序列号来唯一标识这次请求。
如果多次超时呢?——超时时间间隔加倍
如果超时重发的数据,再次超时的时候,TCP 的策略是超时时间间隔加倍
。
也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍
。两次超时,就说明网络环境差,不宜频繁反复发送。
快速重传
超时重传
最大的问题就是太慢了,需要一直等到超时了才重传,
「快速重传」可以解决超时重发的时间等待问题。
快速重传机制是如何工作的?
快重传要求,接收者如果接收到一个乱序的分组
的话,就返回对前一个正确分组的确认应答,
当发送方连续收到三个冗余ACK
,就会马上快速重传丢失数据
,不必等到超时时间再重传。
图示如下:
超时重传和快速重传的对比
超时重传缺点是太慢了,RTO的设置不好把握
快速重传解决了超时重传的慢速缺点,但是多发了好几个ACK会导致网络更加拥塞