跳到主要内容

4.3. 丢失恢复机制 (Loss Recovery Mechanisms)

概述

TCP 研究人员已经提出了若干增强 fast retransmit 和 fast recovery 的 loss recovery 算法, 并在 RFC 系列中进行了规定.

基于 SACK 的算法

一些算法基于 TCP Selective Acknowledgment (SACK) option [RFC2018], 例如:

  • [FF96]
  • [MM96a]
  • [MM96b]
  • [RFC3517]

非 SACK 算法

另一些算法不需要 SACK, 例如:

  • [Hoe96]
  • [FF96]
  • [RFC3782]

非 SACK 算法使用 "partial acknowledgments" (覆盖此前未确认数据,但未覆盖检测到丢失时所有 outstanding data 的 ACK) 来触发重传.

一般原则

虽然本文档不标准化任何可能改进 fast retransmit/fast recovery 的具体算法, 但只要这些增强算法遵循上述四个基本算法的一般原则, 就隐含地允许使用.

必需行为

  1. 当检测到某个数据窗口中的第一次丢失时, ssthresh 必须设置为不超过公式 (4) 给出的值

  2. 在相关数据窗口中的所有丢失 segment 都被修复之前, 每个 RTT 中传输的 segment 数量必须不超过检测到丢失时 outstanding segment 数量的一半

  3. 在给定 segment 窗口中的所有丢失都已成功重传之后, cwnd 必须设置为不超过 ssthresh, 并且必须使用 congestion avoidance 进一步增加 cwnd

多个丢失窗口

两个连续数据窗口中的丢失, 或一次重传的丢失, 应视为两次拥塞指示. 因此, 在这种情况下 cwnd (以及 ssthresh) 必须降低两次.

建议

我们 RECOMMEND TCP 实现者采用某种能够处理一个数据窗口中多次丢失的 advanced loss recovery.

[RFC3782] 和 [RFC3517] 中详述的算法符合上述一般原则. 我们注意到, 虽然它们不是仅有的两个符合上述一般原则的算法, 但这两个算法已经过社区审查, 并且当前位于 Standards Track.