摘要

  • ECN Nonce 把发送端选择的随机值放进两种 ECT 标记。路由器改写为 CE 时,原来的区别消失;若接收端仍声称没有拥塞,就未必猜得出正确的累计结果。
  • 累计奇偶值只提供有边界的概率性核对。正常拥塞也会毁掉随机位,因此暂停检查和重新同步不是附带补丁,而是避免错误指控的必要部分。
  • 2018 年结束实验,并不等于证明算法失效。公开文件承认其按设计工作,却认为有限部署不足以继续独占 ECT(1) 的实验空间。

报文到了,原来的区别却没有到

一份报文完整抵达接收端,仍可能丢失一小块对核验很重要的信息。这里丢的不是应用内容,而是发送时放在 IP 首部中的随机区别:它原先是 ECT(0),还是 ECT(1)?路由器一旦把它改成 CE,接收端看到的便只有同一种拥塞标记,无法从这个结果倒推出原值。

这恰好是 RFC 3540 所利用的非对称性。2003 年 6 月,N. Spring、D. Wetherall 与 D. Ely 提出的 ECN Nonce 是一份实验性规范。发送端保留自己选择过的随机值,接收端只能汇总实际看到的值。若有人把已经发生的拥塞描述成一切正常,就要补上一块并未收到的信息。

设计不是要求另一个机构裁定谁诚实,也不是给每份报文签名。它让作出发送决定的一端拥有一项局部检查:对方给出的“干净”回报,是否与只有自己完整保留的发送记录相容?这里的力量来自信息被抹去,而非信息被加密。

两种可标记状态,原来给路由器同一种选择

背景是 2001 年 9 月的 RFC 3168。经典 ECN 用两位区分四种状态:00 表示 Not-ECT,01 是 ECT(1),10 是 ECT(0),11 是 CE。对于支持 ECN 的报文,路由器可以用拥塞标记代替丢弃来传递压力;接收端通过 TCP 的 ECE 回报,发送端以 CWR 表示自己的拥塞响应。

在这套早期语义中,两种 ECT 状态对路由器都表示报文允许拥塞标记。ECN Nonce 于是让发送端随机选择其中之一,把原本相近的两种状态用作一个随机位。路由器不必知道下一位应该是什么,也不负责验证接收端,只需继续执行原有的 CE 改写。

关键并不是 CE 自带某种秘密,而是两种不同输入变成同一输出。假如接收端想隐瞒 CE,它知道报文经历过标记,却不知道标记前选择的是哪一种 ECT。发送端则能拿自己的记录来核对其反馈。这个检验范围很窄:发送端本身若不守规则,机制并不能把它变成诚实参与者。

为什么不直接回显上一份报文的随机位

TCP 的确认不是逐份报文的收据。确认可能延迟,也可能在回程丢失;一个累计确认可以跨过多份已经按序收到的数据。如果只要求回显最后一份报文中的随机值,省掉某些确认就可能使前面的证据消失。

RFC 3540 采用累计的模二加和,也就是奇偶校验。接收端从初始值 1 开始,随着累计确认越过按序数据,把相应的随机位合并到一位结果里,再用 NS 标志返回。发送端按原始报文的末尾序列号保留预期结果,从而知道某个累计确认应当对应什么值。

这不是对正文做校验和,也不是为每一个 SACK 区块单独建立证明。乱序到达的数据,要等累计确认推进到它所覆盖的位置才贡献到累计值。确认序号、原始分段边界与随机值记录必须放在一起解释,不能把 NS 当作脱离连接历史的一位“可信”徽章。

若累计范围内有一个接收端没有看到的均匀随机位,它猜中正确奇偶值的概率是二分之一。这意味着一次猜测可能过关,不意味着一旦作弊就必然立即暴露。连续核验增加把握,也要有新的独立随机信息被抹去;围绕同一份未知信息反复出现的确认,不能机械地算成一串独立试验。

正常拥塞同样会制造“不知道”

最容易被省略的设计细节,是诚实接收端也不知道被 CE 改写掉的随机位。它不能创造已经消失的信息。规范让接收端忽略缺失的位,相当于按零处理,同时正常设置 ECE。发送端处理这次拥塞恢复时,暂停对随机和的核验。

恢复以后,需要重新建立双方共同的起点。发送端降低窗口并发出带 CWR 的新数据,等越过相关边界的确认到来,再利用接收端给出的累计值重新同步;实现可以保留一个单比特偏移。它没有倒推出被抹掉的历史,而是停止让旧缺口污染下一段能够核验的交换。

因此,在本应暂停检查的区间发现不一致,不能当作隐瞒拥塞的证据。先识别状态,才有资格解释数值。这一点把 ECN Nonce 与一种过于简单的“答错就处罚”系统区分开来:诚实的网络事件,会主动改变检查何时有效。

2003 年的规则还把重传报文设为 Not-ECT,不携带随机位。发送端主动选择不使用 ECT 的区间,也需要处理同步问题。这是当年的实验条件,不应写成今天所有 TCP 实验永远不得给重传或控制报文使用 ECN;后来的文件放宽了相关实验约束。

不一致不等于查明了作恶者

RFC 3540 把检查与反应分开,反应属于本地策略,检查本身也是可选的。若发送端据不正确的结果采取行动,规范讨论至少相当于收到 ECE 的响应,也讨论更强的窗口缩减或停止使用 ECT。这些选项不是一份统一的惩罚程序,更不是把接收端公开认定为恶意主体的依据。

报文路径并非透明玻璃管。IPv4 分片可能让一个未标记分片泄露原始随机值,使接收端有机会隐瞒另一个分片的标记;IPv6 首部位错误也可能造成错误的随机和。部分分段确认必须结合原始分段边界理解。把这些情况都解释成“对方撒谎”,会把机制的可观察范围扩张为它从未提供的责任判定。

随机序列不必达到密码学用途的强度,但不能让接收端从已见的位轻易预测下一位,也不能将同一序列挪作别的用途。规范没有增加连接完整性保证。初始握手回复中的非零 NS 可以让发送端推断对方支持该功能,文件却明确不把这称为协商;这也不是双方已经完成身份认证的意思。

一项正确实验,仍然可以结束

实验的另一半历史发生在共享码点上。RFC 4774 在 2006 年讨论替代 ECN 语义时,强调新解释如何被识别、怎样与既有路由器及其他流量共存。一个字段不会因为只有两位,就没有部署和兼容性的负担。

2015 年的 RFC 7560 讨论更精确的拥塞反馈,提到当时没有已知使用 ECN Nonce 的 TCP 栈部署。它要求关注反馈完整性与诚实合作的激励,但没有规定只能使用这一项机制。反馈的精细程度与防止隐瞒的能力,是两个不同问题:一位奇偶结果既不是拥塞数量,也不是每次标记的时间记录。

2018 年 1 月,RFC 8311 给出更明确的结论:ECN Nonce 按设计工作,在有限环境中部署过,但没有形成广泛使用。文件说明结束实验、将 RFC 3540 从 Experimental 重新归类为 Historic 的理由。正确的历史表述不是“从来没人实现”,更不是“数学原理已经被推翻”。

它转述的一项研究使用了 2014 年的数据:581,711 个受测 IPv4 服务器中,没有一个在 ECN 协商后使用两种 ECT 值;17,028 个受测 IPv6 服务器中有四个这样做,但这可能是 Nonce,也可能是错误改写。这是有时间、有样本、带歧义的观察,不能被改写成今天全网的部署清点。

当其他实验用途和反馈完整性办法出现,继续只为这项实验保留 ECT(1),便需要新的理由。释放码点也不等于谁都可以任意改写语义;RFC 8311 仍要求相应的 IETF 实验性规范,并保留拥塞控制与共存责任。

2023 年 1 月的实验性 RFC 9331 为 L4S 定义了另一种 ECT(1) 标识用途。今天的 IANA ECN 字段登记表 仍列出四种码点,并为 ECT(1) 标注相关实验文件。同一组位再次出现,已不能自动证明正在运行 2003 年的随机位实验。本篇据此说明语义的后续变化,不据此判断 L4S 的部署规模、性能或普遍适用性。

ECN Nonce 留下的不是一台完美测谎仪,而是一种克制的核验方式:利用本地保留的信息,检验一项有限主张;承认何时无法核验;也允许一项未获广泛采用的实验归还公共空间。共同规则可以很小,但它的边界不能含糊。