为什么 TCP 快速重传能够检测“最多”3 个丢弃的数据包?

网络工程 通讯协议 协议理论
2021-07-28 21:27:23

Peterson & Davie 所著《计算机网络:系统方法》一书的6.3.3 节(第 512 页)中,我发现了以下陈述:

考虑到当前 64 KB 的最大通告窗口大小,TCP 的快速重传机制在实践中能够检测到每个窗口最多三个丢弃的数据包。

我的问题是:为什么“最多”3 个丢弃的数据包?

我想我可能已经勾勒了部分论点,但我仍然不确定:

  • 假设(最大?)MSS 为 1 kB
  • 假设当前有 min(congestion_wnd,adverted_wnd) = 64 kB
  • 我会根据数据包来考虑窗口大小,因此我将考虑一个数据包的大小为 1 kB,因此窗口大小为 64 个数据包。

假设 TCP 发送方当前正在传输一个大小为 64 数据包的窗口,从序列号 p 开始。假设数据包 p + d 被丢弃。如果发送方在数据包 p + d 之后还有(至少)4 个数据包要发送(即 +3 个后续数据包以生成 3 个重复的 ACK + 1 次重新传输),我们可以检测丢弃的数据包并重新传输它。这给我们留下了 64 - 4 = 60 个可以丢弃数据包的“时隙”。

丢弃数据包的成本是 5 个数据包,即 1 个丢弃数据包 + 3 个后续数据包以获得 3 个重复的 ACK + 1 次重传。这给了我们 x = 60 / 5 = 12 个要丢弃的数据包的信用,这大于 3。

我的逻辑在哪里失败?我也怀疑我关于以字节为单位的数据包和 MSS 大小的假设的有效性,但该声明似乎结合了(混淆?)数据包和字节大小,这可能会导致混淆。

谢谢!

1个回答

根据他们对快速重传算法的理解,我相信作者正在向您提供他们对期望的真实世界的想法。明白了,这是作者的想法。甚至你的论点也有一些假设,这些假设可能与作者的假设一致,也可能不一致。您可以联系作者进行澄清。简单的搜索就会找到亚利桑那大学拉里·彼得森 (Larry Peterson) 的经过验证的电子邮件地址。

RFC 2581,TCP 拥塞控制

3.2 快速重传/快速恢复

当一个乱序段到达时,一个 TCP 接收者应该立即发送一个重复的 ACK。此 ACK 的目的是通知发送方收到的段是乱序的,以及预期的序列号。从发送方的角度来看,重复 ACK 可能是由许多网络问题引起的。首先,它们可能是由丢失的段引起的。在这种情况下,丢弃段之后的所有段都会触发重复的 ACK。其次,重复 ACK 可能是由网络对数据段的重新排序引起的(沿某些网络路径 [Pax97] 并非罕见事件)。最后,重复 ACK 可能是由网络复制 ACK 或数据段引起的。此外,当传入的段填充序列空间中的全部或部分间隙时,TCP 接收器应该立即发送 ACK。

TCP 发送方应该使用“快速重传”算法来检测和修复丢失,基于传入的重复 ACK。快速重传算法使用 3 个重复 ACK 的到达(4 个相同的 ACK,没有任何其他介入数据包的到达)作为分段已丢失的指示。在收到 3 个重复的 ACK 后,TCP 会重新传输看似丢失的数据段,而无需等待重新传输计时器到期。

在快速重传算法发送看似丢失的数据段后,“快速恢复”算法将控制新数据的传输,直到非重复的 ACK 到达。不执行慢启动的原因是收到重复的 ACK 不仅表明段已经丢失,而且段很可能离开网络(尽管网络的大量段重复可以使这个结论无效)。换句话说,由于接收方只能在一个段到达时生成重复的 ACK,该段已经离开网络并在接收方的缓冲区中,所以我们知道它不再消耗网络资源。此外,由于保留了 ACK“时钟”[Jac88],

快速重传和快速恢复算法通常如下一起实现。

  1. 当收到第三个重复的 ACK 时,将 ssthresh 设置为不超过等式 3 中给出的值。

  2. 重传丢失的段并将cwnd设置为ssthresh加上3*SMSS。这人为地将拥塞窗口“膨胀”了离开网络且接收器已缓冲的段数(三个)。

  3. 对于收到的每个额外的重复 ACK,通过 SMSS 增加 cwnd。这人为地扩大了拥塞窗口,以反映已经离开网络的附加段。

  4. 如果 cwnd 的新值和接收者的广告窗口允许,则传输一个段。

  5. 当下一个确认新数据的 ACK 到达时,将 cwnd 设置为 ssthresh(在步骤 1 中设置的值)。这被称为“放气”窗口。

    这个 ACK​​ 应该是由步骤 1 的重传引起的确认,重传后一个 RTT(尽管它可能会在接收器处数据段出现明显无序交付的情况下更快到达)。此外,如果所有中间段都没有丢失,则此 ACK 应确认在丢失段和接收到第三个重复 ACK 之间发送的所有中间段。

注意:众所周知,该算法通常无法从单个数据包传输中的多次丢失中非常有效地恢复 [FF96]。在 [FH98] 中可以找到一组提议的修改来解决这个问题。