跳到主要内容

4.3. 丢失恢复机制

概述​

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.