第十四章 TCP超时重传

14.1 引言

TCP提供可靠的数据传输服务,为了保证数据传出的正确性,TCP重传其认为已丢失的数据包(或是SACK确认的丢失数据包),TCP根据接收端返回值发送端的一些列ACK来确认是否出现丢包。
当出现丢包,再适合的时候,TCP启动重传,重传肠胃确认的数据。
TCP有两套独立的机制来完成重传:基于时间基于信息构成,第二种更加高效。

TCP发送数据是,会设置一个计时器,若计时器超时未收到数据包的ACK,则会引发相应的超时或基于计时器的重传操作,计时器超时称为重传超时RTO
另一中重传方式称为快速重传,通常发生在没有延时的视情况,若ACK累计无法确认返回新的ACK(返回的可能是重复ACK),或是包含选择确认信息SACK,快速重传会推断出现丢包。

14.2 简单的超时与重传

每次重传间隔时间加倍称为二进制指数退避
TCP拥有两个阈值来决定如何重传一个报文段,R1表示TCP在想IP层传递消极建议前(例如重新评估当前IP路径),愿意重传的次数(或等待的时间)。R2(大于R1)指示TCP应放弃当前连接的时机。
R1通常为3次,R2冲肠胃3分钟。

14.3 设置重传超时

TCP超时和重传的基础是怎么根据连接的RTT里设置RTO。
TCP在收到ACK时,根据数据报中携带的数据来测量该确认信息所需的时间。每个这样的测量结果称为RTT样本

14.3.1 经典方法

指数加权移动平均
SRTT=a(SRTT) + (1-a)RTT
也就是,每次的SRTT根据得到的RTT更新,a是一个平滑因子,一般为0.8~0.9.

经典方法
RTO=min(max_value,max(min_value,(SRTT)*b))
其中max_value和min_value是超时等待的上限和下限。b是一个时延离散因子去1.2~1.3

缺点:无法适应大规模的变动,因为新旧RTT的比重不同,因此变化会有延迟。

14.3.2 标准方法

在测量的时候同时测量均值和方差,
再看

14.3.2.1 时钟粒度与RTO

14.3.3 Linux采用的方法

14.4 基于计时器的重传

14.5 快速重传

基于ACK

ACK分组的ACK值,永远是已收到连续数据的最后一个字节的偏移量+1。也就是出现第一个空洞的位置。

当失序数据到达时,ACK立即返回,不能延时发送。因此发送端会连续收到ACK值相同的ACk分组。当发送端收到相同ACK分组的次数达到重传的重复ACK阈值(dupthresh),就会重传对应的分组。

快速重传算法概括为:TCP发送端在观测到至少dupthresh个重复ACK后,即重传可能丢失的数据分组,而不必等待计时器超时。当然也同时发送新的数据。不采用SACK时,在接收到有效ACK(ACK值不在是重复的)之前只能重传一个报文段。

NewReno算法

统计|流图

小竖杠是发送端发送的数据报的Seq值。下面的连续梯形是发送端接收到的数据报的ACK值。

如果连续观测到超过dupthresh个重复ACK,开吃重传,当前已发送数据报的Seq最大值成为恢复点。发送丢失数据,同时还继续发送新的数据。以后,当收到新的ACK,如果ACK值小于恢复点,那么立即重传新的丢失的数据,直到ACK超过恢复点,重传结束。

14.6 带选择确认的重传

TCP选择确认选项

TCP接收端提供SACK功能,通过头部累计ACK号字段来描述收到的数据。
ACK号与接收端缓存中其他数据之间的间隔成为空缺。Seq高于空缺数据成为失序数据。
每个SACK信息包括4字节开始位置,4字节结束为止(表示收到数据的起始值最后一个序列号+1),2字节填充。因此一个SACK为10个字节。SACK还会与TSOPT一起使用,又用掉10字节。
所以每个ACK中只能包含3个SACK块。(选项一共40字节)。
第一个SACK块为最新收到的数据,也就是最后的那段,其余两端为从头开始收到的两端连续数据。因此这就有两个空洞了。

tcptrace

发送端在收到SACK以后,不能因为SACK块标记的已接收到数据而清空字节的重传缓存中的数据,必须等待ACK才清除。
这是因为接收端变更:食言。不过很少发生。

14.7 伪超时与重传

14.8 包失序与包重复

每个包可以选择各自的传送路径。某些高级路由器的采用多个并行数据链路,不同的处理演示也会导致包的离开顺序和到达顺序不匹配

包的失序会造成重传,很近单嘛,前面一个小号的Seq没到达,后面的先到达,那么ACK就会 重复

14.9 目的度量

14.10 重新组包

当TCP超时重发是,循序执行重新租宝,发送送一个更大的报文段提高性能,不超过MSS和MTU。
出现在每次传送的包较小,又丢包的情况

推荐阅读更多精彩内容

  • 21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。T...
    张芳涛阅读 2,332评论 0 8
  • 14.1 引言 域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换...
    张芳涛阅读 1,445评论 0 8
  • 24.1 引言 TCP已经在从1200 b/s的拨号SLIP链路到以太数据链路上运行了许多年。在80年代和90年代...
    张芳涛阅读 1,128评论 0 3
  • 18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将...
    张芳涛阅读 2,928评论 0 13
  • 第一次作业: 一、思维导图作业 二、作业完成思路 1、创意思维学习的本质 2、怎么学收益最大? 3、基础学习 三、...
    易查理阅读 237评论 0 0
  • 自我教育是人生最重要的事情(之一?),自我教育之所以如此重要,是因为它是我们个体进化的途径。 原始的生物进化,是通...
    alabiubiubiu阅读 101评论 0 3
  • 大家好,我是IT修真院上海分院第02期学员,一枚正直善良的java程序员。 今天给大家分享一下,修真院官网task...
    idiot丶伟伟阅读 2,688评论 0 7
  • 下雨了,滴滴答答的,一解酷热的暑气,变得清爽和怡人。打开微信,高中同学竟建立了微信群,高中时单纯,青涩的记忆竟...
    风竹禅玉阅读 63评论 1 2
  • 你还在庆幸自己未老 你还在忧郁自己懒惰 你互相矛盾 你自我折磨 你问自己为什么 是的 为什么 还记得很多年前...
    花小又阅读 392评论 1 4