摘要

  • XOVER 与后来的 OVER 把逐篇取头部变成按范围返回的制表符分隔摘要,固定共同字段,并允许声明额外字段。
  • LIST OVERVIEW.FMT 不得公布未存储或覆盖不一致的列;只有列已经一致,内部空格才能证明对应头部或元数据确实不存在。
  • 索引结构变更时,停止存储的字段要先退出格式,新字段则要等旧记录回填或自然过期、数据库重新一致后才能加入。

空白不能自己解释空白

客户端看到的是位置:主题、作者、日期、Message-ID、引用关系,以及后续字段。某一位置没有值,后面的列仍然排列正确。仅凭这一行,客户端无法知道空白发生在文章里,还是发生在索引里。

两种情况的业务含义完全相反。若服务器对全部相关记录都采集该字段,空白意味着文章没有它;若服务器只从某一天开始采集,旧记录的空白意味着未知。把后者当成“没有”,会让索引迁移伪装成内容历史。

RFC 3977 因而把“一致”定义得很具体:数据库必须为适用文章记录字段内容或字段缺席。若一些含有该头部的文章被记录,另一些却没有,数据库对这一字段就是不一致的。

最初只能逐篇查看

RFC 977 中的 HEAD 可以按 Message-ID 或服务器本地文章号选定一篇文章,并返回它的头部。检查单篇文章很直接;要画出一个大型新闻组的列表,则需要反复选取和请求。

RFC 2980 记录的 XOVER 改变了取数单位。客户端给出文章号范围,服务器从预先建立的概览数据库一次返回多行。每行先是文章号,再依次放主题、作者、日期、Message-ID、References、字节数和行数,之后还能追加可选字段。

效率来自两件事:头部抽取提前完成,许多摘要一次传输。代价是字段不再自带标签,位置必须稳定。头部值内部的换行要展开,制表符要换成空格,否则一个内容字符就会冒充分隔符,把后面整行推错。

固定核心与可声明的尾部

RFC 3977 将命令标准化为 OVER,并固定前八个位置:文章号或零、Subject、From、Date、Message-ID、References、:bytes、:lines。内部缺值仍要保留位置,所以会出现相邻制表符;只有末尾连续空字段可以省略。

LIST OVERVIEW.FMT 按实际顺序公布格式。前七条说明 OVER 的第二至第八列;此后的元数据可直接命名,额外头部则用 :full 表示返回值中保留头部名称。共同核心不漂移,扩展部分也不靠猜测。

格式并非永久不变。规范允许同一会话中两次查询得到不同结果。客户端读取的是此刻服务器愿意承担的一组字段承诺。

为什么新增一列不能立刻上线

假设运营者今天决定索引某个新头部。从今天以后到达的文章都能填这一列,昨天以前的概览记录却没有。除非服务器重新读取旧文章并重建数据库,否则新列天然只覆盖一部分历史。

若立即公布列名,旧行中的空白便同时承担“原文没有”和“尚未回填”两种含义。RFC 3977 要求 LIST OVERVIEW.FMT 不得列出覆盖不一致或根本未存储的字段。新列要等数据库恢复一致后再公布:可以完成重建,也可以等旧文章按保留策略退出,只剩新规则下产生的记录。

删除一列也有顺序。服务器在停止存储之前,必须先从公布格式中移除它。否则格式仍在对未来记录作出已经无法兑现的承诺。

因此,迁移期间少公布一列不是失败,而是撤回尚未具备的证据权力。服务器可以掌握部分值,却不能把部分值包装成整列事实。

可信空白来自一致覆盖

当字段确实出现在格式中,且数据库对它一致时,某篇文章的对应格为空才可推断该头部不在文章里。空格的意义来自一种反事实保证:如果字段存在,同一套采集规则就会记录它。

反过来,格式未公布字段,只说明概览没有做一致承诺,不能说明所有文章都没有这个头部。服务器索引边界与作者内容边界必须分开。

服务器计算也有测量边界

以冒号开头的 :bytes 和 :lines 是服务器元数据,不是照抄文章中可能出现的同名头部。服务器必须自行计算。这样可以区分文章声明与本地测量。

但本地计算并不自动等于精确无误。RFC 3977 列出历史实现对 :bytes 的多种计数差异,并明确要求客户端不要依赖绝对准确。来源清楚与数值可靠仍是两项不同判断。

范围结果也只包含仍存在的文章,删除项不应继续出现,文章号之间可以有洞。概览数据库是一份当前索引,不是正文保管证明,更不能恢复已经过期的内容。

IANA 的 NNTP 参数注册表 把 OVER 登记为概览支持能力。它确认互操作名称,不证明当代部署率或具体性能。

加速的前提是少说一句假话

概览数据库把许多客户端都会重复做的头部解析集中到服务器。真正困难的不是把表做宽,而是确保每个空格都只有一种可辩护的解释。

NNTP 的办法是在不一致时缩小承诺。迁移未完成就不公布新列,停止维护前先撤下旧列。等覆盖重新一致,空白才不再是“不知道”,而能成为“没有”。这项负证据不是表格天然赋予的,而是服务器用完整历史覆盖赢得的。

来源