摘要

  • RFC 3940 给传输中的 NormObject 配置了发送者范围内的编号,用来把数据、丢失请求和修复对应起来,而不是给内容颁发永久身份。
  • 编号字段只有 16 位,长会话中可以回绕并再次出现;需要跨会话存续的名称必须由应用放进 NORM_INFO 或内容本身,并在传输结束后继续保存。

一群沉默的接收者仍然需要秩序

把同一个大文件送给成千上万台机器时,最直观的可靠性办法反而会制造灾难:如果每台机器都为每个分组发回确认,反馈流量可能压倒发送本身。NORM 反过来设计。收到数据的接收者保持沉默,发现缺口的接收者发送否定确认;前向纠错生成的冗余片段还可以同时帮助不同接收者弥补不同损失。

这种节制并没有消除一个基本问题:每个数据片段、修复请求和冗余片段到底属于哪一个正在发送的对象?2004 年 11 月以实验性 RFC 发布的 RFC 3940 使用 object_transport_id 来回答。发送者按顺序分配编号,同一对象的初始发送和后续修复沿用同一个值。把它与协议携带的发送者标识合在一起,接收者便能在当前会话状态中辨认一个 NormObject。

这个答案足以让运输继续,却没有回答对象离开运输之后是谁。协议解决的是“这块碎片属于哪次在途工作”,不是“这些字节在档案、缓存或业务系统里应当永远叫什么”。

容器类型没有替内容下定义

NORM 把对象分为三种:放在内存中的静态数据、文件,以及没有预定终点的连续流。名称听起来像内容分类,实际边界要窄得多。NORM_OBJECT_DATA 与 NORM_OBJECT_FILE 的主要区别只是给接收者一个存储提示:前者可以分配内存,后者可以准备非易失存储。除此之外,它们都是有限大小的可靠传输单元。应用甚至可以自行选择用流来承载静态内容。

所以,FILE 并不附赠文件名、路径、版本或出处。接收端可以完整恢复一张地图,却仍不知道它是本月有效版本、已经撤回的副本,还是恰好采用同一种格式的另一张地图。纠错机制证明某些片段能组成协议期待的传输对象,并不证明该对象应该继承某条业务记录的标题、权限或保留期限。

这正是容易被遗漏的层次。存储提示控制资源分配,传输编号控制修复关联,应用身份控制长期记忆。三者彼此相邻,却没有谁自动获得下一层的权威。

十六位计数器最终会回到原点

object_transport_id 只有 16 位,而且每个发送者独立分配自己的序列。单看“817”这样的数字,既不知道来自哪个发送者,也不知道属于哪个发送者实例、哪一段会话状态,更不知道计数器已经绕过多少圈。RFC 3940 明说,在非常长或没有期限的会话中,这个字段可能重复;接收者看到明显偏离当前状态的对象序号时,应与服务器重新同步。

规范随后把权力边界写得非常直接:NORM 报文头不提供全局或应用级的数据内容标识。传输标识只在发送者传送或修复给定对象期间有效。单调递增只是有限范围内的排序工具,不是永久唯一性的承诺。

2009 年 11 月,RFC 5740 取代 RFC 3940,并把 NORM 带入标准轨道。它没有删除这条边界,反而把原来“可能重复”的表述变得更明确:长会话里的字段会回绕并再次使用。实验成为标准,运输规则更成熟,但短编号并没有因此升级为内容目录中的主键。

应用可以夹带一张说明卡

协议没有禁止内容携带自己的名字。NORM_INFO 可以为一个对象附上一小段由应用定义的带外上下文,MIME 类型是规范给出的例子。接收者可以先看这张说明卡,再决定是否值得投入资源参加可靠接收。INFO 若在途中丢失,也可以单独请求修复。

然而这张卡不是身份登记机关。它是可选的,字段语义由应用自行约定,而且必须完整装进发送者的一个有效载荷之内。原子性让它容易快速补发,也限定了容量。规范没有要求里面一定出现永久标识、版本号、摘要、签名或文件名。应用可以把自己的全局身份写进 INFO,也可以写进对象内容;无论选哪一种,命名规则、验证方法和长期保存责任都没有转交给 NORM。

INFO 与数据对象共享同一个传输编号,这能在传输期间把说明卡挂到正确的包裹上。修复窗口关闭以后,若档案只留下这张临时取件号,却丢掉发送者实例、会话代际和应用身份,那么未来编号再次出现时,协议并没有制造重复身份;是档案把编号的作用域忘了。

完整收到,也可能归错档

设想一个缓存长期使用协议的发送者标识与 16 位对象号作为键。它中断连接、丢失会话代际状态,等到计数器回绕后重新加入。新对象的每一个片段都属于当前传输,缺失部分也被正确修复;但缓存看见熟悉的键,便把旧标题、旧权限或旧过期时间贴到新字节上。可靠性使错误对象变得完整,而不是使身份判断变得正确。

这是从规范边界推导出的风险场景,不是对某次事故的声称。它说明证据必须分层保存。传输日志可以说明某片段服务于哪个在途对象。应用若提供内容摘要,可以比较字节。持久应用标识可以把交付连接到某个版本化记录。发布资格与访问授权还需要各自的决策证据。一次成功不能顺着数据链自动变成所有后续判断的许可。

RFC 3940 的历史价值,恰好在于它没有越界。它创造了大规模修复所需的最小身份,然后停下来。协议协调移动,应用承担记忆。可以重用的编号不是应当被掩盖的瑕疵,而是一句清楚的设计提醒:凡是必须活得比传输更久的意义,都需要自己的名字。