摘要

  • 累积 ACK 只承诺一件强而清楚的事:确认号之前没有缺口。首个片段丢失时,后续数据即使已经排队,确认号也不能越过去。
  • SACK 经握手协商后报告若干不连续区间,使发送方看见“哪些已到、哪些像是缺口”,却不改变普通 ACK 的含义。
  • 报告容量有限,也可能被撤回。发送方仍保存原数据、遵守拥塞窗口,并以累积 ACK 的推进作为最终交付凭据。

一个数字遮住了七个片段

假设接收方下一步等待字节 5000。包含 5000 的片段没有到,后面七个片段却连续填满了 5500 到 9000。TCP 头部里的确认号仍是 5000。它不是说“我什么都没收到”,而是说“我还不能证明从起点到这里已经连续”。

这句话对可靠字节流足够严谨,对修复却不够具体。发送方看见一串重复的 5000,不知道只有第一段丢了,还是后面的数据也散落各处。把整个发送窗口重传,会重复搬运已经到达的数据;每经过一个往返才发现下一个缺口,又会让长时延路径付出成倍时间。

RFC 793 把累积语义写得很明确:ACK X 表示 X 以前的所有字节都已收到,X 是下一个期待值。这个承诺让双方最终可以释放缓冲和前移窗口。它的盲点正来自它的强度——接收方不能用零散到达冒充连续完成。

先有方案,后有可部署的共识

1988 年的 RFC 1072 已提出选择性确认。双方在 SYN 中用 SACK-Permitted 协商,连接建立后,接收方可以在 ACK 里描述已经收下的不连续数据块。若对端不认识选项,基本的累积确认仍能工作。

但这版方案没有按原样进入互联网的共同实现。RFC 2018 记载,当时对它与窗口扩展如何组合存在分歧。标准文本提供了讨论对象,却不能凭发布日期制造兼容代码。真正的采用还要依靠实现、测试和相互接受。

1996 年的修订保留了握手协商,改用完整的 32 位左右边界。左边界是块中第一个字节,右边界是最后一个字节之后的位置。于是同一份 ACK 可以继续确认 5000,同时用 SACK 表示 [5500, 9000)。连续承诺没有被改写,缺口后的观察也不再被隐藏。

四十字节装不下整条队列

TCP 选项区最多 40 字节。SACK 的类型和长度占两字节,每个块再占八字节;单独使用时最多四块,与时间戳一起时通常只剩三块。如果接收队列被切成更多“岛屿”,一个 ACK 不可能完整公开它们。

因此 RFC 2018 要求优先放入最近到达片段所属的块,并在后续 ACK 中重复较新的块。反向路径也会丢包,重复不是浪费,而是在多个短报告中保住信息。发送方把这些观察合并,形成自己的状态表。

共同协议只传必要的边界,不要求公开接收方的内存布局、队列实现和全部历史。各系统可以在内部完全不同,只需同意如何表达一个序号区间。这正是薄协调的价值:共享可互操作的事实格式,而不是统一所有执行细节。

提示不等于收据

SACK 在规范中是 advisory,也就是建议性信息。接收方之后可能因内存压力等原因丢掉已经报告的数据,这叫 reneging。发送方可以暂时跳过被标记的范围,却不能只凭 SACK 删除自己的副本;只有累积 ACK 真正越过该范围,交付义务才算结束。

若重传计时器到期,发送方必须考虑旧 SACK 状态已失效,从左边界重新保证数据。这个保守退路维护了证据等级:瞬时观察可以优化行动,但不能自动升级为不可撤销的证明。

执行面也留在发送方。它保存重传队列、合并区间、推断缺口并选择下一段。RFC 6675 后来把发送方的这份记录称为 scoreboard,并给出估计网络中尚存字节与选择重传片段的保守算法。接收方贡献视角,不控制发送器。

看清缺口并不增加带宽权利

SACK 也没有替代拥塞控制。RFC 2018 明确要求保留既有算法:一个乱序 ACK 不能单独证明丢失,恢复期间的发送仍有限制,遇到拥塞信号时仍需缩小拥塞窗口。

这与 1986 年拥塞崩溃的历史边界不同。拥塞窗口回答“最多能向共享路径放多少”;SACK 回答“在这个额度内,哪些字节最值得补”。地图更精确,不会让道路变宽。

2000 年的 D-SACK 又让接收方报告重复片段。发送方由此可以怀疑重排序、ACK 丢失、网络复制或过早超时。RFC 2883 刻意没有规定唯一反应,还提醒发送方不能天然相信接收方的陈述。更好的证据扩大了诊断空间,没有建立服从关系。

来源与证据边界

累积确认来自 RFC 793,早期选项方案见 RFC 1072,修订格式及限制见 RFC 2018。RFC 2883 定义 D-SACK,RFC 5681 给出拥塞控制边界,RFC 6247 记录旧方案转为历史状态,RFC 6675 描述保守的 SACK 恢复算法。

这些文档证明规范、演进与已知限制,不证明全球同时部署,也不能从一个 SACK 块确定某个包在哪里、为什么丢失。它报告的是接收方在某一刻声称持有的序号范围,不是身份认证。