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 的具体算法, 但只要这些增强算法遵循上述四个基本算法的一般原则, 就隐含地允许使用.
必需行为
-
当检测到某个数据窗口中的第一次丢失时, ssthresh 必须设置为不超过公式 (4) 给出的值
-
在相关数据窗口中的所有丢失 segment 都被修复之前, 每个 RTT 中传输的 segment 数量必须不超过检测到丢失时 outstanding segment 数量的一半
-
在给定 segment 窗口中的所有丢失都已成功重传之后, cwnd 必须设置为不超过 ssthresh, 并且必须使用 congestion avoidance 进一步增加 cwnd
多个丢失窗口
两个连续数据窗口中的丢失, 或一次重传的丢失, 应视为两次拥塞指示. 因此, 在这种情况下 cwnd (以及 ssthresh) 必须降低两次.
建议
我们 RECOMMEND TCP 实现者采用某种能够处理一个数据窗口中多次丢失的 advanced loss recovery.
[RFC3782] 和 [RFC3517] 中详述的算法符合上述一般原则. 我们注意到, 虽然它们不是仅有的两个符合上述一般原则的算法, 但这两个算法已经过社区审查, 并且当前位于 Standards Track.