TCP/IP卷一:74---TCP超时与重传之(快速重传(重复ACK))
发布日期:2021-06-29 22:33:31 浏览次数:2 分类:技术文章

本文共 2394 字,大约阅读时间需要 7 分钟。

一、快速重传介绍

  • 快速重传机制基于接收端的反馈信息来引发重传,而非重传计时器的超时。 因此与超时重传相比,快速重传能更加及时有效地修复丢包情况。典型的TCP同时实现了两者

重复ACK

  • 在详细讨论快速重传前,首先需要了解当接收到失序报文段时,TCP需要立即生成确认信息(重复ACK),并且失序情况表明在后续数据到达前出现了丢段,即接收端缓存出现了空缺。发送端的工作即为尽快地、高效地填补该空缺
  • 当失序数据到达时,重复ACK应立即返回,不能延时发送。原因在于使发送端尽早得知有失序报文段,并告诉其空缺在哪
  • 当采用SACK时,重复ACK通常也包含SACK信息,利用该信息可以获知多个空缺

二、重复ACK阈值

网络中出现失序分组时也会产生重复ACK

  • 重复ACK(不论是否包含SACK信息)到达发送端表明先前发送的某个分组已丢失
  • 在后面“包失序与包重复”文章中我们会更详细地讨论到,重复ACK也可能在另一种情况下出现即当网络中出现失序分组时——若接收端收到当前期盼序列号的后续分组时,当前期盼的包可能丢失,也可能仅为延迟到达
  • 通常我们无法得知是哪种情况,因此TCP等待一定数目的重复ACK(称为重复ACK阈值或dupthresh),来决定数据是否丢失并触发快速重传。通常,dupthresh为常量(值为3),但一些非标准化的实现方法(包括Linux)可基于当前的失序程度动态调节该值(见后面“包失序与包重复”文章)

四、快速重传总体概述

  • 快速重传算法可以概括如下:
    • TCP发送端在观测到至少dupthresh个重复ACK后,即重传可能丢失的数据分组,而不必等到重传计时器超时,当然也可以同时发送新的数据

五、网络拥塞对重复ACK的影响

  • 根据重复ACK推断的丢包通常与网络拥塞有关,因此伴随快速重传应触发拥塞控制机制(详见后面“TCP拥塞控制”文章)

六、SACK采用与否对重传的影响

  • 不采用SACK时:在接收到有效ACK前至多只能重传一个报文段
  • 采用SACK:ACK可包含额外信息,使得发送端在每个RTT时间内可以填补多个空缺
  • 下面描述一个基本快速重传算法的例子之后,我们在后面一篇文章讨论在快速重传中SACK的用法

七、演示案例

  • 在下面的例子中,我们建立一个与前面文章中“RTTM对丢包和失序的鲁棒性”演示案例中类似的连接,但这次丢弃报文段23801和 26601,并且禁用SACK。我们将看到TCP怎样利用基本的快速重传算法来填补空缺。发送端为Linux 2.6系统,接收端为FreeBSD 5.4系统。下图可通过Wireshark的“统计或TCP流图或时间序列图”功能得到,该图显示了快速重传行为

  • 该图y轴表示相对发送序列号,x轴表示时间。黑色的Ⅰ形线段表示传输报文段的序列号范围。wireshark中的蓝色(图中的浅灰色)线段为返回的ACK号。约1.0s时刻,序列号23801发生了快速重传(初始传输不可见,因为被发送端TCP下层丢弃)。第三个重复ACK的到达触发了快速重传,图中表现为重叠的浅灰色线段。通过Wireshark的基本分析窗口也可以观察到重传过程(见下图)
  • 下图的第一行(40号)为ACK 23801首次到达。wireshark标示出了(红色,在下图中看来是黑色)其他“有趣的” TCP包。这些包与其他没有丢失或异常的包不同。我 们可以看到窗口更新、重复ACK和重传。0.853s时刻的窗口更新为带重复序列号的ACK(因为没有携带数据),但包含了TCP流控窗口的变动。窗口由231616字节变为233016字节。 因此,它并没有等到三个重复ACK来触发快速重传。窗口更新仅是提供了窗口通告的一个 副本。我们将在第15章中详细讨

  • 0.890s、 0.926s以及0.964s时刻到达的均为序列号为23801的重复ACK。第三个重复ACK的到达触发了报文段23801的快速重传,时间为0.993s。该过程也可通过Wireshark的 “统计或流图”功能来观测(见下图)

  • 现在我们换个角度来看0.993s时刻的快速重传过程,也可以看1.326s时刻发生的第二次快速重传,该重传是由1.322s时刻达到的ACK触发的
  • 第二次重传与第一次有所不同。当第一次重传发生时,发送端在执行重传前已发送的 最大序列号为(43401 + 1400 = 44801),称为恢复点。TCP在接收到序列号等于或大于恢复点的ACR时,才会被认为从重传中恢复。本例中,1.322s和1.321s时刻的ACK并不是44801,而是266010该序列号大于之前接收到的最大ACK值(23801),但 不足以到达恢复点(44801)。因此这种类型的ACK称为部分ACK。当部分ACK到达时,TCP发送端立即“发送可能丢失的报文段(这里是26601 ),并且维持这一过程直到到达或超过恢复点。如果拥塞控制机制允许(见后面的“TCP拥塞控制”),也可以同时发送新的数据
  • 这里的例子并没有采用SACK,不论是快速重传,还是基于“NewReno”算法 [RFC3782]恢复阶段执行的其他重传。由于没有SACK,通过观察返回的ACK号的增长情况,发送端在每个RTT内只能获知至多一个空缺
  • 在恢复阶段的具体行为根据TCP发送端和接收端的类型和配置差异有所不同。这里描述的是无SACK.发送端采用NewReno算法的例子,这种配置比较常见。根据NewReno算法,部分ACK只能使发送端继续处于恢复状态。对较旧的TCP版本(单纯的Reno算法)来说,没有部分ACK这个概念,任何一个可接受的ACK(序列号大于之前接收到的所有ACK)都能使发送端结束恢复阶段。这种方法可能会使TCP出现一些性能问题,我们在“TCP拥塞控制”会详细讨论。下面讨论NewReno和SACK,它们有时也被称为“高级丢失恢复”技术,以此来区别旧的方法

转载地址:https://dongshao.blog.csdn.net/article/details/104093881 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:TCP/IP卷一:75---TCP超时与重传之(带选择确认选项(SACK)的选择性重传)
下一篇:TCP/IP卷一:73---TCP超时与重传之(基于计时器的重传)

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月10日 18时43分56秒