TCP超时重传

TCP通过超时重传定时器确保数据可靠性,当无ACK响应时会在预设的超时时间后重传数据。RTT(往返时间)的测量与平滑估算用于确定重传超时时间RTO,一般设定为RTT的两倍。在网络条件变化大时,引入均值偏差来改进计算。指数退避策略在多次重传未收到ACK时,每次重传的等待时间呈指数增长,但会有一个上限,超过一定时间后不再重传。
摘要由CSDN通过智能技术生成
我们通常说T C P是一种可靠的传输层协议。那么什么叫可靠呢?这里引用RFC的定义:确保一个进程从其接收缓存中读出的数据流是无损坏,无间隔,非冗余和按序的数据流;即字节流与连接的另一方端系统发送出的字节流是完全相同的。简单来讲就是说要确保接收方收到的消息是对的,正确的,发的时候是什么样收到的时候就是什么样,不能有数据错误,乱序等。对于数据错误我们可以通过tcp报文段的校验和checksum字段来校验;而对于乱序问题,可以通过发送序号和确认序号ack来保证。等等,这里似乎已经漏掉了一个很重要的问题,可靠性,我们第一步应该是要保证接收方能收到这条消息,然后才能检查数据是否正确,消息有可能丢失,接收方压根没收到。那么发送方是如何确保消息没有被截胡已经成功发送了呢?如果消息半路丢失了怎么办?这就需要本文的主题超时重传来保证!
对于上面这个问题,T C P是通过在发送时设置一个定时器来解决的,这个定时器就是超时重传定时器。因为如果接收方已经收到了消息(报文包)正常是会回复一个ack的。如果没回,很有可能就是数据丢了,或者数据错了接收方选择忽略。所以如果发送方一直等到超时定时器溢出都还没有收到接收方的回复,它就会重传数据,再发一次。那么下一个问题就是,多久才能算是消息丢了?或者说要等多久才重发?如果一直没收到是不是要一直发,直到地老天荒海枯石烂?
显然重发太快或者太慢都不好,重发太快可能造成无用功,可能只是距离比较远要花多点时间。或者是网络拥堵了,如果重发太多可能会进一步加剧网络拥堵。如果重发太慢,消息可能是真的丢了,等太久了就会浪费时间。这个问题的关键就是要确定一个重传超时时间。
 
根据爱因斯坦相对论,快和慢,是相对的。意思是我们首先要知道在正常情况下,发送方发送消息,接收方收到消息并回复,最后接收方收到回复,这个过程总共要花多长时间,才能确定超时重发时间,这个过程就是一个往返。一个往返所需的时间就是RTT.
对一个给定连接的往返时间( RT T )的测量是T C P超时与重传中最重要的部分。这主要是由于路由器和网络流量是会变化的,因此这个RTT可能经常会发生变化, T C P应该跟踪这些 变化并相应地做一些调整改变其超时时间。
首先 T C P 必须测量在发送一个带有特别序号的字节和接收到包含该字节的确认之间的 RT T。《TCP/IP详解卷一:协议》

 一般发送方和接收方的消息都是你来我往,眉来眼去的,因此我们可以通过这些你来我往的数据包来测量RTT.下图是一个根据来往的报文测量RTT的例子。图中共有14个来往报文,共进行了三次RTT测量。

如果仅仅根据某次测量的RTT来计算超时时间,那么毫无疑问这个误差会比较大。我们很容易就能想到可以使用多次统计的数据来减少误差,就像算平均值那样。在TCP早期的规范,RFC文档里边是使用低通过滤器来更新一个被平滑的 RT T估计值

这里的 \aa是一个推荐值为 0 . 9 的平滑因子。每次进行新测量的时候,就去更新这个RTT估算值 。每个新估计的9 0 %来自前一个估计,而 1 0 % 则取自新的测量。举个例子,上次估算的RTT值为10s,本次测量的RTT为12s,那么就更新RRT估算值为10.2s.
10\times 0.9+12\times 0.1=10.2
这个算法在给定这个随 RT T 的变化而变化的平滑因子的条件下, RFC 793 推荐的重传超时时间RTO Retransmission Ti m e O u t )的值应该设置为

公式里的 \beta是一个推荐值为 2 的时延离散因子。也就是说超时重传时间RTO推荐为2倍的RTT估计值。

 这种算法在一般情况下是比较可行的,但是如果网络状况变化比较大,也就是 RT T变化范围很大时,这种方法就会有问题,使用这个方法无法跟上这种变化, 从而引起不必要的重传。当网络已经处于饱和状态时,不必要的 重传会增加网络的负载,对网络而言这就像在火上浇油一样。这个时候我们就需要对上面的公式进行修正,既然问题的根源是公式不能反映RTT的比较的波动,在概率论里边我们是用方差来衡量数据样本的波动,那我们就给上面的公式加一个方差。为了方便计算使用均值偏差来代替标准方差。

在往返时间变化起伏很大时, 基于均值和方差来计算 RTO,将比作为均值的常数倍数来计算 RTO能提供更好的响应。均值偏差是对标准偏差的一种好的逼近,但却更容易进行计算 (计算标准偏差需要一个平方根)。这就引出了下面用于每个 RT T测量M的公式。

 计算公式如下,计算比较复杂,我们可以先简单地理解为一个均值加上一个4倍的均值方差。

指数退避 

假设我们现在已经 计算出了一个RTO,那么可能会出现这种场景:第一次超时重传之后,如果接收方还是没有回复ack。这时候我们就需要进行第二次重传,如果还是没有回ack,可能还需要多次重发。这时候就需要用到指数退避 (exponential backoff )。意思是假如需要多次重发,那么本次的重发超时时间是上一次上一次重发超时时间的倍数,这个倍数就是指数退避系数。比如,第一次RTO为1,那么第二次RTO为2,后续依次为4,8,16,32......。但是,RTO并不是一直退避下去,而是增加到某个值之后就保持不变,不在退避。

 

上图这个例子中,我们检查连续重传之间不同的时间差,它们取整后分别为 1 3 6 1 2 2 4 4 8 和多个 6 4 秒。第一次发送后所设置的超时时间实际上为 1 . 5秒,此后该 时间在每次重传时增加1 倍并直至 6 4 秒。而且这个重发也不算一直执行下去。
首次分组传输(第 6 行, 2 4 . 4 8 0 秒)与复位信号传输(第 1 9 行, 5 6 6 . 4 8 8 秒)之间的时间差 约为9 分钟,该时间在目前的 T C P 实现中是不可变的。这个例子中,重传到大概九分钟之后就停止重传。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值