RFC 3 带读:Documentation Conventions——互联网最早的协作规则,为什么反而鼓励“不成熟”

前言

RFC 1 和 RFC 2 讨论的是一个很具体的技术问题:ARPANET 的 Host 软件应该怎样工作。

到了 RFC 3,Steve Crocker 突然没有继续设计 Link、Message、Host-to-Host checksum 或远程终端,而是停下来写了一篇只有很短篇幅的文档:

Documentation Conventions(文档约定)

如果只看标题,它似乎不像一篇“技术 RFC”。但从整个 RFC 系列的历史来看,RFC 3 反而非常关键,因为它开始回答另一个更基础的问题:

一群来自不同机构、没有完整正式组织架构、正在共同设计一套从未存在过的计算机网络的人,究竟应该怎样记录、分享和讨论他们的想法?

RFC 3 给出的答案非常反直觉。

它没有要求文档必须成熟、正式、完整,也没有要求作者先证明自己正确。相反,它明确鼓励:

  • 及时(timely)比精雕细琢(polished)更重要
  • 没有例子的哲学观点可以写;
  • 没有背景说明的具体实现建议可以写;
  • 只有问题、没有答案也可以写
  • 一篇 NWG Note 最短甚至只需要 一句话
  • 任何站点、任何人都可以产生这样的 Note;
  • Network Working Group 的成员资格 不是封闭的(Membership is not closed)

更重要的是,RFC 3 解释了为什么要这么做:

因为人们容易把“写下来的东西”误认为权威结论,而他们恰恰希望促进那些还远远谈不上权威的想法被交换和讨论;同时,人们天然不愿意发表不够完善的内容,他们希望主动降低这种心理门槛。

这其实解释了 Request for Comments 这个名字背后的工程文化。

今天的 RFC 已经拥有 Internet-Draft、Working Group、IETF Review、IESG、RFC Stream、Standards Track、BCP、RFC Editor 等完整体系,正式程度远高于 1969 年。但如果想理解 RFC 为什么不是叫“Internet Final Specification”,而是一直沿用 Request for Comments 这个名字,RFC 3 是最应该读的一篇早期文档。

它讨论的不是某个协议。

它讨论的是:

互联网协议应该以什么方式被共同创造出来。

RFC 基本信息

项目 内容
RFC RFC 3
官方英文标题 Documentation conventions
作者 Steve Crocker(S. D. Crocker)
所属机构 UCLA
工作组 Network Working Group(NWG)
RFC Editor 当前状态 Unknown
Stream Legacy
当前关系 Obsoleted by RFC 10
RFC Editor 信息页 RFC 3: Documentation conventions
RFC 原文 RFC 3 原文

关于 RFC 3 的发布日期

RFC Editor 当前元数据显示:

1
Date published: 1 April 1969

但早期 RFC 自身的归档记录并不完全一致。

1971 年的 **RFC 100《Categorization and Guide to NWG/RFCs》**在回顾 RFC 1~102 时,将 RFC 3 记录为:

1
2
3
4
RFC 3
Documentation Conventions
S. Crocker (UCLA)
9 April 1969

因此,对于这种最早期 RFC,具体日期存在历史档案差异。

比较稳妥的表述是:

RFC 3 发布于 1969 年 4 月,属于 RFC 系列诞生最初几天内的文档。

Unknown 不代表“状态不明所以可能仍有效”

RFC 3 的 Status 是:

1
Unknown

但这不是说它现在仍然是一份“待判断是否有效”的规范。

RFC Editor 对现代 RFC 状态体系的说明中明确指出:很多在正式 Status 制度出现之前发布的 RFC,后来统一被标记为 Unknown

RFC 3 还属于:

1
Legacy Stream

意味着它产生于现代 RFC Stream 和 IETF 标准流程建立之前。

更关键的是,RFC Editor 已明确记录:

1
2
3
RFC 3

Obsoleted by RFC 10

所以 RFC 3 今天应该作为历史文档阅读,而不是当前有效的 RFC 作者规范。

为什么会有这篇 RFC

要理解 RFC 3,必须先理解 1969 年初的 Network Working Group 到底是什么状态。

一、当时甚至没有今天意义上的正式工作组体系

RFC 3 开头写得非常直接:

Network Working Group 看起来由以下几个人组成:

人员 机构
Steve Carr University of Utah
Jeff Rulifson SRI
Bill Duvall SRI
Steve Crocker UCLA
Gerard Deloche UCLA

紧接着就是一句非常重要的话:

1
Membership is not closed.

即:

成员资格并不封闭。

这不是今天已经制度化的 IETF Working Group。

当时甚至连 ARPANET 的许多底层接口都还在形成过程中。

Steve Crocker 在后来的 **RFC 8700《Fifty Years of RFCs》**中回忆,最早这批人的处境大致是:

1
2
3
4
没有清晰的正式章程
没有稳定的正式领导结构
不知道是否会出现某个“真正有权负责协议设计”的组织
但协议问题已经必须开始讨论

所以他们只能继续开会、讨论、设计,并逐渐意识到:

光开会不够,必须把讨论写下来。

二、RFC 一开始就是“工作笔记”,不是“标准终稿”

RFC 3 对 Network Working Group 的关注范围定义得很宽:

1
2
3
4
5
HOST software
+
strategies for using the network
+
initial experiments with the network

也就是说,这些 Notes 不只是“协议标准”。

还可以包括:

  • Host Software 的设计;
  • 网络应该如何使用;
  • 实验设计;
  • 实现技巧;
  • 哲学讨论;
  • 尚未解决的问题。

它更像今天一个大型开源/标准项目中的:

1
2
3
4
5
6
Design Note
+ Proposal
+ Issue
+ ADR
+ Experiment Note
+ Discussion Thread

的混合体。

三、真正的问题是:大家不敢写“不成熟”的东西

这是 RFC 3 最重要的背景。

如果一篇正式流转的技术文档天然会被别人理解为:

1
2
3
“作者已经认真论证过”
“这可能是官方意见”
“写成文档说明已经比较成熟”

那么作者就会产生一个非常自然的行为:

1
2
3
4
5
6
7
8
9
10
11
等想清楚

再补背景

再找例子

再润色

再等别人确认

最后才愿意公开

问题是:

互联网协议当时根本没有时间等每个人先写成论文。

协议设计需要快速得到别人的反馈。

所以 RFC 3 做了一件非常重要的事情:

它不是提高文档准入门槛,而是主动降低准入门槛。

四、“Request for Comments”这个名字本身就是为了降低权威感

RFC 3 原文规定,每一份 NWG Note 都应该带有:

1
2
Network Working Group
Request for Comments: X

后来的 RFC 8700 中,Steve Crocker 对这个名字的来历有更明确的回忆。

他担心这些文档看起来像是在宣称一种实际上并不存在的权威,于是希望建立一种规则:

1
2
3
任何人都可以说任何东西
+
没有什么自动成为官方结论

为了强化这种意味,他采用了 Bill Duvall 的建议,把这些 Notes 称为:

1
Request for Comments

不是:

1
2
3
Final Specification
Official Network Standard
Protocol Directive

而是:

1
Request for Comments

翻成最直白的话就是:

这是一个拿出来让大家评论的东西。

RFC 这个名字后来保留了几十年,但它最初携带的心理暗示非常明确:

1
2
“我不是宣布答案。”
“我是在发起技术讨论。”

核心内容

RFC 3 本身很短,核心可以分成四部分:

1
2
3
4
1. Network Working Group 是谁
2. NWG Note 可以写什么
3. NWG Note 应该长什么样
4. 文档应该如何分发

整体关系可以画成:

flowchart TD
    A[Network Working Group<br/>开放参与]
    B[Content<br/>允许任何相关想法]
    C[Form<br/>统一最小文档元数据]
    D[Distribution<br/>固定分发 + 本地复制]
    E[Comments / New Notes<br/>继续讨论]

    A --> B
    B --> C
    C --> D
    D --> E
    E -.持续演化.-> B

RFC 3 并没有给出今天意义上的审批状态机。

它真正建立的是一个:

低门槛产生文档 + 最小格式约束 + 可追踪编号 + 固定分发

的协作框架。

一、谁可以写:任何站点的任何人

RFC 3 明确说:

1
2
Notes may be produced at any site by anybody
and included in this series.

这句话非常重要。

这里没有:

1
2
3
4
只有主席可以写
只有 ARPA 可以写
只有 UCLA 可以写
只有获得批准的协议设计者可以写

而是:

1
2
3
any site
+
anybody

当然,1969 年这里的“anybody”仍然处在一个很小的 ARPANET 研究共同体语境里,不能直接等同于今天互联网全球公众的完全开放投稿。

但作为组织设计原则,它已经非常鲜明:

技术讨论的产生权,不应该只掌握在一个中心机构手里。

二、可以写什么:几乎任何和网络相关的想法

RFC 3 对内容的要求异常宽松。

NWG Note 可以是:

1
2
3
any thought
suggestion
etc.

只要和:

1
2
3
HOST software

other aspect of the network

相关即可。

随后原文甚至专门列出几类“看起来不够完整但仍然完全可以接受”的内容。

只有哲学观点,没有例子

允许。

1
2
Philosophical position
without examples or other specifics

也就是说,你可以先讨论:

1
2
3
“网络应该保持端系统自治”
“协议应该更简单”
“网络不应该承担太多上层语义”

哪怕暂时还没有完整实现方案。

只有具体实现建议,没有背景铺垫

也允许。

1
2
3
specific suggestions
or implementation techniques
without introductory or background explication

换成今天开发团队里常见的表达:

1
2
3
“我觉得这里应该把状态从 IMP 移到 Host。”
“这个字段最好改成 16 bit。”
“我们可以直接用 table lookup。”

即使没有先写两页“问题背景”,也可以发布。

只有问题,没有尝试给答案

仍然允许。

1
2
explicit questions
without any attempted answers

这点非常值得软件开发者注意。

很多技术组织容易形成一种隐形要求:

“你提问题可以,但最好同时给解决方案。”

RFC 3 则明确说:

1
只有问题,也有价值。

因为一个尚未得到答案、但被准确表达出来的问题,本身就能推进协议设计。

三、质量要求:及时比精致更重要

RFC 3 最著名的原则之一是:

1
Notes are encouraged to be timely rather than polished.

它并不是说:

1
“文档质量不重要”

而是在早期协议探索阶段做了一个明确的优先级选择:

1
2
3
及时暴露想法
>
等到文档完美才分享

因为如果讨论对象本身还在高速变化:

1
你花一个月把方案 A 写得非常漂亮

可能一个星期以后团队已经发现:

1
方案 A 的基本假设就是错的

这种环境下,“及时”本身就是技术效率的一部分。

四、最小长度:一句话

RFC 3 明确规定:

1
The minimum length for a NWG note is one sentence.

一份 NWG Note:

最少只需要一句话。

今天看到这条规则可能有点好笑。

一篇只有一句话的 RFC?

但它其实是在传递一个极其明确的信号:

1
2
不要因为“这还不够写成正式文档”
就把有价值的问题留在脑子里。

RFC 在那个阶段首先是一种:

1
2
3
4
可引用
可编号
可分发
可讨论

的技术记录。

不一定是长篇规范。

五、为什么要故意制定这么低的标准

RFC 3 紧接着解释,这些“标准——或者说缺少标准”被明确写出来,有两个原因。

可以概括为:

flowchart LR
    A[技术人员不愿发表不成熟内容]
    B[写出来的东西容易被视为权威]
    C[降低发布门槛]
    D[弱化文档天然权威性]
    E[更多早期想法进入公共讨论]

    A --> C
    B --> D
    C --> E
    D --> E

原因 1:文字天然会制造权威感

原文指出,人们容易把:

1
written statement

视为:

1
ipso facto authoritative

也就是:

一旦写成正式文字,就仿佛天然获得了权威性。

RFC 3 希望反过来强调:

1
2
3
4
5
6
7
written

official

final

correct

文档只是讨论媒介。

原因 2:人们会因为不够完善而不愿发表

第二个原因是:

1
natural hesitancy to publish something unpolished

作者担心:

1
2
3
“这个想法还太粗糙。”
“别人会不会觉得我考虑得不完整?”
“还是等我再完善一点。”

最终导致真正需要讨论的东西迟迟没有进入公共空间。

RFC 3 希望:

1
ease this inhibition

也就是主动降低这种心理阻力。

这是一套很成熟的协作机制设计:

不是假设参与者天然会开放讨论,而是修改制度,让开放讨论变得更容易。

六、文档格式只要求四类基本信息

RFC 3 对每一份 NWG Note 的格式要求非常简单。

必须包含:

1
2
3
4
5
6
7
8
1. Network Working Group
Request for Comments: X

2. Author and affiliation

3. Date

4. Title

其中 X 是:

1
serial number

即连续编号。

RFC 3 当时规定:

1
Serial numbers are assigned by Bill Duvall at SRI

换成结构化形式:

元数据 RFC 3 的要求
Series Network Working Group
Identifier Request for Comments: X
X 连续编号
编号分配 Bill Duvall / SRI
Author 作者
Affiliation 所属机构
Date 日期
Title 标题
标题唯一性 不要求唯一

最后一条也很有意思:

1
The title need not be unique.

RFC 1 和 RFC 2 就是一个现实例子。

两篇都叫:

1
HOST Software

真正稳定标识文档的不是标题,而是:

1
RFC number

也就是:

1
2
3
4
RFC 1
RFC 2
RFC 3
...

七、RFC 编号比标题更像真正的主键

软件开发者可以把这套设计类比成:

1
2
title        = display name
RFC number = immutable identifier

类似于:

1
2
3
数据库:
id → 真正唯一
name → 可以重复

所以:

1
2
3
RFC 793
RFC 9110
RFC 8446

这些数字最终成为互联网工程中极其稳定的引用方式。

RFC 3 当时未必能预见这种编号会使用超过半个世纪,但这个最初的“serial number”设计确实成为整个系列最稳定的身份机制之一。

八、编号不是作者自己随便填的

虽然人人都可以产生 Note,但编号仍然需要集中分配。

RFC 3 中是:

1
Bill Duvall at SRI

Steve Crocker 后来在 RFC 8700 回忆,他最早还给编号增加过一个很简单的规则:

文档完成以后才分配编号,从而尽量减少编号序列中的空洞。

这说明早期 RFC 从一开始就同时追求两个目标:

1
2
3
内容开放
+
标识受控

这是一个很合理的组合。

如果每个人都随便声明:

1
“我的文档是 RFC 17。”

很快就会产生冲突。

所以:

开放投稿不等于放弃全局命名空间管理。

九、分发机制:每个作者站点只发送一份副本

RFC 3 的 Distribution 部分非常有时代感。

作者所在站点只需要向指定人员:

1
send one copy

原文列出的接收者包括:

  • Bob Kahn
  • Larry Roberts
  • Steve Carr
  • Jeff Rulifson
  • Ron Stoughton
  • Steve Crocker

随后写道:

1
Reproduction if desired may be handled locally.

也就是说:

每个站点如果需要更多副本,就自己复制。

流程大致是:

flowchart LR
    A[Author / Site]
    B1[BBN]
    B2[ARPA]
    B3[UCLA / Utah / SRI / UCSB 等联系人]
    C1[Local Reproduction]
    C2[Local Reproduction]
    C3[Local Reproduction]
    D[更多研究人员阅读与讨论]

    A -->|one copy| B1
    A -->|one copy| B2
    A -->|one copy| B3
    B1 --> C1
    B2 --> C2
    B3 --> C3
    C1 --> D
    C2 --> D
    C3 --> D

今天我们点击一个 URL 就能打开 RFC。

但 RFC 3 诞生时:

1
2
电子邮件还没有成为 ARPANET 的文档分发手段
FTP 也还没有出现

所以“每个站点发送一个副本、站点自己复制”不是形式主义,而是真正的文档分发基础设施。

这也提醒我们:

RFC 系列早于通过互联网在线分发 RFC 本身。

某种意义上,这是互联网技术史里一个很好玩的递归:

1
2
3
4
5
6
最初用纸张讨论
如何建设一个网络

后来这个网络
成为分发这些讨论文档
最重要的媒介

关键机制与工作流程

RFC 3 没有网络报文状态机,但它实际上定义了一套非常早期的技术协作工作流

一、NWG Note 的产生流程

按照 RFC 3,可以整理成:

flowchart TD
    A[产生一个和网络有关的想法 / 问题]
    B{成熟了吗?}
    C[继续写]
    D[没关系,也可以发布]
    E[形成 NWG Note]
    F[获得 RFC Serial Number]
    G[添加 Author / Affiliation / Date / Title]
    H[发送给规定的分发联系人]
    I[各站点按需本地复制]
    J[其他成员阅读与评论]
    K[后续 Note 继续讨论或修订]

    A --> B
    B -->|成熟| C
    B -->|不成熟| D
    C --> E
    D --> E
    E --> F
    F --> G
    G --> H
    H --> I
    I --> J
    J --> K

这里最特别的是:

1
“不成熟”

不是失败条件。

它是被明确允许的状态。

二、RFC 1、RFC 2、RFC 3 本身就是这套机制的演示

RFC 1:

1
2
3
4
Steve Crocker
→ 提出 Host Software 的初步设计
→ 明确大量内容仍未确定
→ 请求反馈

RFC 2:

1
2
3
Bill Duvall
→ 回应 RFC 1
→ 补充和修改 Host Software 设计

RFC 3:

1
2
Steve Crocker
→ 规定这种讨论文档以后怎么写、怎么编号、怎么发

这三篇放在一起看,比单独看 RFC 3 更容易理解 RFC 的意义:

flowchart LR
    A[RFC 1<br/>Proposal]
    B[RFC 2<br/>Response / Refinement]
    C[RFC 3<br/>Define Documentation Convention]
    D[更多 RFC<br/>继续评论、实验、替代]

    A --> B
    A --> C
    B --> C
    C --> D

RFC 系列从一开始就不是:

1
2
3
RFC 1 = 第一版标准
RFC 2 = 第二版标准
RFC 3 = 第三版标准

而是:

1
2
3
4
不同主题
不同作者
持续讨论
连续编号

三、RFC 的真正状态不是由“文档存在”决定

RFC 3 特别担心:

1
written → authoritative

所以从它的设计哲学看,必须主动拆开:

1
文档是否被写出来

和:

1
这是不是已经被共同接受

这两个概念。

用今天更熟悉的软件工程语言表达:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Proposal Created

Proposal Accepted

PR Opened

PR Merged

ADR Drafted

Architecture Approved

RFC Published

Internet Standard

这一点直到今天仍然很重要。

现代 RFC Editor 也明确提醒:

不是每一篇 RFC 都是 Internet Standard。

RFC 具有不同 Stream 和 Status,阅读 RFC 时必须同时检查:

  • Status;
  • Stream;
  • Updates;
  • Updated By;
  • Obsoletes;
  • Obsoleted By;
  • Errata。

四、早期 RFC 的版本管理方式:写新文档,而不是偷偷改旧文档

RFC 3 本身很快就被修订。

RFC Editor 当前记录:

1
2
3
4
5
RFC 3

Obsoleted by

RFC 10

RFC 10 开头直接写:

1
This note is a revision of NWG/RFC #3

后续 Documentation Conventions 又继续出现在:

1
2
3
RFC 24
RFC 27
RFC 30

等文档中。

所以早期 RFC 很快形成了一种极其重要的演化方式:

1
2
3
4
5
旧文档保留

新文档说明修改

通过编号和关系追踪演化

而不是:

1
2
把 RFC 3.doc
覆盖保存成新版

现代 RFC Series 已经把这个原则制度化:

RFC 一旦正式发布,其内容不再修改;如果规范需要改变,通过新的 RFC 进行 Update 或 Obsolete。

对软件开发者而言,这非常像:

1
2
3
4
5
append-only history
+
immutable release artifact
+
explicit version relationship

五、RFC 3 → RFC 10:规则本身也必须接受评论和修订

RFC 10 在 1969 年 7 月明确成为 RFC 3 的修订版。

核心思想依然保留:

  • Membership is not closed;
  • anyone at any site can produce a note;
  • timely rather than polished;
  • 一句话也可以;
  • 降低“文字就是权威”的误解。

但组织细节已经变化。

例如 RFC 3 规定:

1
2
Serial numbers
→ Bill Duvall at SRI

RFC 10 中则改成:

1
2
Serial numbers
→ Steve Crocker at UCLA

分发名单也扩大。

这件事本身非常符合 RFC 3 的精神:

连“我们应该怎样写 RFC”这套规则,都不是一次写死的。

六、文档制度自身成为可演化协议

如果把 RFC 3 看成一种“协作协议”,它实际上包含:

1
2
3
4
5
6
Participants
Identifiers
Required Metadata
Acceptance Threshold
Distribution Rules
Revision Mechanism

和网络协议一样,这些规则也会随着系统规模增长而变化。

最初:

1
2
3
4
5
6
7
几个人
+
几所大学
+
纸质副本
+
人工分配编号

后来逐步变成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Internet-Draft
+
Working Group
+
mailing list
+
Datatracker
+
multiple RFC Streams
+
formal review
+
RFC Production Center
+
global online archive

底层工具完全变了,但“公开记录技术讨论”的主线一直延续下来。

重点概念与术语

RFC

RFC(Request for Comments,请求评论)

在 RFC 3 的时代,它首先是一类 Network Working Group Note 的编号系列。

不要用今天的“RFC = 正式互联网标准”印象反向理解 1969 年。

更准确的是:

1
2
3
早期 RFC

公开、编号、可引用的网络技术讨论笔记

Network Working Group

Network Working Group(NWG,网络工作组)

RFC 3 所描述的早期协作群体,主要围绕:

  • Host Software;
  • 网络使用策略;
  • 初始网络实验;

开展讨论。

它不是今天制度化的 IETF Working Group。

NWG Note

Network Working Group 产生的技术笔记。

RFC 3 规定其内容可以非常自由:

1
2
3
4
5
thought
suggestion
implementation technique
question
philosophical position

最短一句话。

Timely Rather Than Polished

RFC 3 的关键原则:

1
2
3
及时
>
过度追求文档打磨

它针对的是设计探索阶段,并不意味着现代正式标准可以忽略准确性和编辑质量。

Authoritative

Authoritative(权威性的)

RFC 3 明确担心:

1
2
written statement
→ 被自动理解为权威

因此刻意把 RFC 定义为鼓励讨论的载体,而不是天然正确的最终答案。

Serial Number

连续编号:

1
2
3
4
RFC 1
RFC 2
RFC 3
...

标题可以重复,但编号负责稳定标识文档。

RFC 3 当时由:

1
Bill Duvall / SRI

负责分配编号。

Affiliation

作者所属机构。

RFC 3 要求作者信息同时携带:

1
2
3
Author
+
Affiliation

反映出当时 ARPANET 项目高度依赖各研究站点协作。

Distribution

文档分发规则。

早期 RFC 还没有在线全球分发,因此需要明确:

1
2
3
谁收到一份副本
+
谁负责本地复制

Obsoletes / Obsoleted By

现代 RFC 元数据中的文档演化关系。

RFC 3 当前明确:

1
Obsoleted By RFC 10

表示 RFC 10 替代了 RFC 3 的规则。

Legacy Stream

现代 RFC Editor 给早于正式 RFC Stream 体系的文档使用的标签。

RFC 3 属于:

1
Legacy

这提醒读者不要把现代 IETF 流程强行套在它身上。

NIL

RFC 3 最后的 Planned Notes 中出现:

1
2
The Philosophy of NIL
Specifications for NIL

RFC 3 本身并没有展开 NIL 的含义。

后来的 RFC 历史回顾 RFC 8700 说明:

1
NIL = Network Interchange Language

它是早期 DEL(Decode-Encode Language) 思路进一步发展出来的一种 Network Interchange Language 设想。

这里需要特别注意:

这个解释来自后来的官方 RFC 历史回顾,而不是 RFC 3 正文自己给出的定义。

需要特别注意的点

1. RFC 3 不是今天的 RFC Style Guide

虽然标题叫:

1
Documentation Conventions

但它不是今天那种详细规定:

  • XML 格式;
  • section layout;
  • references;
  • boilerplate;
  • normative language;
  • artwork;
  • IANA Considerations;
  • Security Considerations;

的正式 Style Guide。

RFC 3 只是在定义:

最早期 Network Working Group Notes 的最低协作规则。

2. “任何人都可以写”不能简单等同于现代 RFC 可以直接发布

1969 年的:

1
Notes may be produced at any site by anybody

是在一个规模很小的 NWG 环境里说的。

今天 RFC 的生产过程已经完全不同。

根据当前 RFC Editor 流程,准备成为 RFC 的文档通常先是:

1
Internet-Draft

随后根据所属 Stream 经过不同形式的:

  • discussion;
  • review;
  • revision;
  • approval;
  • editorial processing;

最后才正式分配 RFC number 并发布。

所以今天不能:

1
2
3
写一个 Markdown
→ 自称 RFC 12345
→ 就变成正式 RFC

3. “Timely rather than polished”也不能拿来给低质量规范找借口

RFC 3 鼓励的是:

尽早让讨论开始。

不是:

最终规范可以不严谨。

今天应该把它类比成:

1
2
早期 proposal / draft
可以快速

而不是:

1
2
最终发布版本
不需要准确

事实上,现代 RFC 发布前有比 1969 年严格得多的审阅与编辑流程。

4. “RFC”从来不自动等于“Internet Standard”

这是现代开发者最常见的误区之一。

今天 RFC 可以属于不同 Stream 和 Status。

所以:

1
RFC number

只能说明:

1
这是一篇进入 RFC Series 的文档

不能单独证明:

1
这是 Internet Standard

RFC 3 自己反对“写下来就自动权威”的思想,在这件事上依然非常有现实意义。

5. RFC 3 已经被 RFC 10 明确替代

当前 RFC Editor 元数据:

1
2
RFC 3
→ Obsoleted by RFC 10

RFC 10 又明确自称:

1
revision of NWG/RFC #3

所以如果研究 1969 年稍后时期的 NWG 文档约定,应该继续阅读 RFC 10、RFC 24、RFC 27、RFC 30 等后续文档,而不是停留在 RFC 3。

6. RFC 100 到 1971 年已经把 Documentation Conventions 当作“行政类”主题

RFC 100 对前 100 多篇 RFC 进行整理时,将 RFC 3 放入:

1
2
A. ADMINISTRATIVE
A.1 Distribution list

到那时,分发名单已经经过多轮更新,RFC 95 成为更晚的分发记录。

这说明 RFC 3 的具体分发名单很快就失效。

它真正长期有价值的是:

1
2
3
4
5
开放
低门槛
编号
最小元数据
及时讨论

这些原则,而不是 1969 年那六个收件人。

7. 原文分发名单中的机构标注与开头成员列表存在不一致

RFC 3 开头把:

1
2
Steve Carr → Utah
Jeff Rulifson → SRI

但现存文本的 Distribution 部分却出现了不同的站点标注。

对于这种 1969 年的历史档案,比较安全的处理方式是:

保留原文记录,并承认其内部存在不一致,而不是为了让文章“看起来整齐”自行静默修正历史文本。

这也是阅读老 RFC 时很实用的原则:

1
2
3
历史原文

现代数据库级干净数据

8. RFC 3 最后的 Planned Notes 不代表这些标题最终原样成为 RFC

原文计划继续写:

1
2
3
4
1. Network Timetable
2. The Philosophy of NIL
3. Specifications for NIL
4. Deeper Documentation of HOST Software

这些内容反映了当时的工作计划。

但 RFC 系列从一开始就是动态的,后续文档标题、作者和技术路线都会变化。

不要把:

1
planned

误读成:

1
official roadmap already committed

9. RFC 3 没有定义现代“共识”机制

RFC 3 强调:

1
2
3
open membership
discussion
non-authoritative ideas

这和后来 IETF 的开放协作文化很容易产生联想。

但 RFC 3 并没有定义今天 IETF 所说的:

1
rough consensus

也没有:

  • Working Group Last Call;
  • IETF Last Call;
  • IESG Review;
  • Standards Track maturity;

等机制。

这些都是后来逐渐发展出来的。

10. RFC 3 的真正创新不是 Markdown 格式,而是降低表达成本

如果把注意力全放在:

1
2
3
必须写 Author
必须写 Date
必须写 Title

就会错过 RFC 3 最重要的东西。

它真正解决的是一个组织问题:

1
2
3
4
如何让还不成熟的技术知识
尽快进入一个
可引用、可传播、可讨论
的公共空间?

这比具体格式本身重要得多。

从今天的视角重新看这篇 RFC

一、RFC 3 很像一个大型技术组织的“协作协议”

软件开发者通常把协议理解成:

1
2
3
4
TCP
HTTP
TLS
gRPC

但组织本身也需要协议。

例如:

1
2
3
4
5
6
7
谁可以提出设计?
文档叫什么?
怎么编号?
必须包含什么信息?
什么时候可以分享?
谁能够看到?
如何产生后续修订?

RFC 3 正是在给一个技术共同体定义这套“人之间的协议”。

可以表示成:

1
2
3
4
5
6
7
8
9
10
11
12
13


技术想法

标准化最小表达

稳定编号

共同分发

评论

下一轮设计

没有这层社会协作协议,再好的网络协议也很难被多个独立机构共同完成。

二、它提前解决了“完美主义阻塞协作”的问题

现代开发团队非常熟悉这种情况:

1
2
3
4
5
6
7
8
设计文档一直没发
因为还没写完整

PR 一直不开
因为代码还没完全整理

架构提案一直没讨论
因为作者想先把所有问题想明白

RFC 3 的回答非常明确:

1
2
3
先共享
再讨论
再迭代

这和现代很多高效工程实践非常接近:

1
2
3
4
5
Draft PR
Early RFC
Design Proposal
ADR
Issue Discussion

核心不是“允许烂文档”,而是:

尽早让反馈进入设计闭环。

三、把“提问题”视为一种正式技术贡献

RFC 3 允许:

1
2
explicit questions
without any attempted answers

这是一个很成熟的知识生产观。

因为技术进步经常不是从:

1
“我已经有答案”

开始,而是从:

1
“我们以前甚至没有准确意识到这是个问题”

开始。

在大型系统里,一个准确的问题可能比一个未经验证的解决方案更有价值。

例如:

1
2
3
4
“连接和 Link 是否应该解耦?”
“IMP 是否应该负责 buffering?”
“远端确认和网络层确认是不是同一个语义?”
“字符编码应该在哪一层转换?”

早期 RFC 中很多真正推动架构演化的内容,恰恰首先以这种问题形式出现。

四、稳定 ID 比漂亮标题更重要

RFC 3 明确:

1
Title need not be unique.

却要求:

1
Request for Comments: X

这是一种很经典的信息系统设计:

1
2
Human-readable name
不能承担 identity

必须存在:

1
Stable Identifier

今天的软件工程里也是一样:

1
2
3
4
5
6
7
Git commit SHA
Issue #123
PR #456
JIRA-789
UUID
Database ID
RFC 9110

名字会重复,也会变化。

稳定标识才是知识图谱和引用关系的基础。

五、“已发布内容不可静默改写”对技术知识非常重要

现代 RFC Series 明确:

1
2
published RFC
→ contents do not change

后续变化通过:

1
2
3
Updates
Obsoletes
Errata

表达。

这让任何一句:

1
“RFC X 当年到底写了什么?”

都可以被稳定回答。

对于软件工程知识管理,这一点非常值得借鉴。

设计文档如果总是原地覆盖:

1
architecture.md

半年以后你可能只看到当前结论,却不知道:

1
2
3
4
当时为什么这么决定?
原方案是什么?
哪次事故导致规则变化?
谁推翻了哪个假设?

更成熟的方法往往是:

1
2
3
immutable historical record
+
explicit supersession

六、RFC 3 和现代 GitHub 协作有惊人的结构相似性

不能说 GitHub 的设计来源于 RFC 3。

但从协作结构看,两者非常容易形成类比:

RFC 3 思路 现代软件协作中的类似形式
anybody may produce a note 任意贡献者可以提交 Issue / Draft PR
timely rather than polished Draft PR / Early Design RFC
explicit question is acceptable Issue / Discussion
serial number Issue ID / PR ID
author + affiliation author / organization
distribution repository watchers / mailing list
later note revises earlier idea follow-up PR / new ADR / superseding proposal
written ≠ authoritative PR open ≠ merged

真正相同的不是工具,而是:

把讨论从人的记忆和会议里,转移到一个可追踪的公共记录系统中。

七、今天的 RFC 已经比 RFC 3 正式得多

如果只读 RFC 3,可能会产生一个错误印象:

1
RFC = 谁都可以随便写一句话然后发布

今天当然不是这样。

当前 RFC Editor 描述的现代流程中,RFC 通常经历:

flowchart LR
    A[Idea]
    B[Internet-Draft]
    C[Discussion / Revision]
    D[WG / Stream Review]
    E[Approval]
    F[RFC Production Center]
    G[RFC Number Assigned]
    H[Published RFC]

    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    F --> G
    G --> H

对于 IETF Stream,还可能经历更广泛的技术审查和 IESG 流程。

所以 RFC 3 的精神和现代流程之间存在一种有意思的张力:

1
2
3
4
5
6
7
早期:
尽可能降低表达门槛

现代:
保持开放讨论
+
增加成熟标准所需的质量控制

两者并不矛盾。

合理的分层是:

1
2
早期讨论可以低门槛
最终归档必须高质量

八、开放参与和严格审查可以同时存在

RFC 3 写:

1
Membership is not closed.

现代 IETF 仍然强调参与开放。

但“开放”不等于:

1
2
3
所有意见自动正确
所有方案自动接受
所有文档自动成为标准

更合理的结构是:

1
2
3
4
5
6
7
8
9
开放提出

公开讨论

技术审查

形成共识

正式发布

这可能是 RFC 3 最值得现代技术团队借鉴的一点:

降低参与门槛,不代表降低最终工程标准。

九、文档不是项目结束后的副产品,而是研发过程本身

很多团队把文档理解成:

1
2
3
代码做完

补文档

RFC 3 所代表的是完全不同的模型:

1
2
3
4
5
6
7
8
9
10
11
讨论

写 Note

别人读

产生反馈

改变设计

再实现

文档不是“记录已经发生的研发”。

文档本身就在驱动研发。

这也是为什么 RFC 能够成为互联网技术史最重要的档案之一。

这篇 RFC 带来的影响

一、它定义了 RFC 系列最早的协作文化

RFC 3 最核心的几句话后来成为 RFC 文化非常有代表性的历史起点:

1
2
3
4
5
6
7
Membership is not closed.

Notes may be produced at any site by anybody.

Notes are encouraged to be timely rather than polished.

The minimum length ... is one sentence.

这些规则共同指向一种文化:

1
2
3
4
5
6
7
开放
+
低门槛
+
快速分享
+
公开讨论

后来的制度越来越正式,但 RFC 系列从一开始就不是为了塑造“不可质疑的权威文本”。

二、它让“Request for Comments”这个名字有了制度含义

在 RFC 3 之前已经有 RFC 1 和 RFC 2。

但 RFC 3 首次明确规定每份 NWG Note 都应带有:

1
Request for Comments: X

从这里开始,RFC 不只是前两篇文档偶然使用的叫法,而是成为一个明确的文档系列标识。

这个名字后来一直保留。

于是出现了一个互联网史上很有特色的现象:

1
2
3
大量互联网核心标准
最终仍然叫
“请求评论”

这个看起来有点谦逊甚至临时的名字,最后变成了全球最有影响力的技术文档系列之一。

三、连续编号成为互联网技术史的一条时间轴

RFC 3 要求的 serial number 最终形成:

1
2
3
4
5
6
7
8
9
10
11
12
RFC 1
RFC 2
RFC 3
...
RFC 793
...
RFC 2616
...
RFC 8446
...
RFC 9110
...

这些编号今天不仅是文档 ID。

它们还是互联网演化史的索引。

通过:

1
2
3
Updates
Obsoletes
References

可以从一篇 RFC 一路追踪:

1
2
3
4
5
一个想法怎样提出
怎样被反驳
怎样被替换
怎样成熟
怎样最终成为标准

四、RFC 3 自己很快被 RFC 10 替代,证明了这套机制真的在运转

RFC 3 不是“规则制定完以后永远有效”。

几个月后的 RFC 10 就明确说:

1
This note is a revision of NWG/RFC #3

随后 Documentation Conventions 又在 RFC 24、RFC 27、RFC 30 等文档中继续修订。

这恰好证明:

文档规范本身也接受 Comments。

RFC 系列不是只允许技术协议演化。

连 RFC 系列怎么运作,也可以通过 RFC 自己演化。

五、RFC 从工作笔记逐渐演化成永久技术档案

RFC 8700 对早期 RFC 的总结很明确:

最初的 RFC 真的是:

1
requests for comments

目标主要是:

1
start conversations

而不是:

1
create an archival record of a standard

但随着网络扩大、参与者增加和标准化流程成熟,RFC Series 的角色逐渐变化。

今天 RFC Editor 把 RFC Series 定义为:

Internet technical specifications and related documents 的长期归档出版系列。

也就是说:

1
2
3
4
5
6
7
8
9
10
11
1969:
conversation mechanism

后来:
conversation
+
specification
+
standardization
+
archival record

这是 RFC 3 之后几十年最重要的演化之一。

六、它影响的不只是互联网标准,也是一种软件工程协作范式

RFC 这个词后来甚至进入了大量与 IETF 完全无关的软件组织。

很多公司和开源项目把:

1
2
3
4
5
Architecture RFC
Product RFC
Engineering RFC
Design RFC
Internal RFC

作为设计协作机制。

这些内部 RFC 往往并不是 Internet RFC。

但为什么大家喜欢这个词?

因为它已经隐含了一套工程文化:

1
2
3
4
5
这是一份提案
它需要评论
它可以被质疑
它可能被修改
关键决策应该留下文字记录

这正是 RFC 3 最早试图建立的协作习惯。

七、它建立了“技术权威来自讨论过程,而不是排版正式程度”的方向

RFC 3 最有深度的一点,是主动对抗:

1
written = authoritative

这种认知偏差。

对于软件工程团队而言,这一点今天仍然极其重要。

一份设计文档写得:

1
2
3
4
20 页
图画得漂亮
术语很高级
排版像论文

并不能证明设计正确。

真正决定质量的是:

1
2
3
4
5
6
假设是否合理
边界是否清楚
是否有人挑战
是否考虑失败场景
是否有实现经验
是否经过验证

换句话说:

技术权威应该来自可检验的工程事实和公开讨论,而不是来自文档看起来有多正式。

这可能是 RFC 3 留给今天最重要的遗产。

总结

RFC 3 没有定义一个网络报文,也没有规定一个协议字段。

它做的是另一件更基础的事情:

定义一群协议设计者应该怎样交流。

它给出的原始规则非常简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Network Working Group 的成员资格不封闭。

任何站点、任何人都可以产生 Note。

只要与 HOST software 或网络有关,就可以讨论。

文档应该及时,而不是等待完美。

只有哲学观点也可以。

只有实现建议也可以。

只有问题、没有答案也可以。

最短只需要一句话。

每篇文档拥有连续 RFC 编号。

必须记录作者、机构、日期和标题。

标题可以重复。

每个站点收到副本以后可以自行复制。

这些规则看起来松散,甚至不像“标准化组织”会制定的规范。

但它们其实解决了协议设计最容易被忽略的问题:

1
2
3
4
5
6
怎样让想法尽早出现?
怎样降低参与门槛?
怎样避免文字天然获得虚假权威?
怎样让讨论可以被引用?
怎样给知识一个稳定 ID?
怎样让不同站点看到同一份讨论记录?

RFC 1 讨论 Host Software。

RFC 2 回应 RFC 1。

RFC 3 则站出来说:

既然我们要这样持续讨论,那最好先约定一下这些讨论应该怎样被记录。

这就是 RFC Series 真正开始成为“系列”的时刻之一。

后来 RFC 的生产过程越来越成熟:

1
2
3
4
5
6
7
Internet-Draft
→ Working Group / Stream Discussion
→ Review
→ Revision
→ Approval
→ RFC Production
→ Permanent Publication

RFC 3 自己也早已被 RFC 10 替代,具体的人员名单、纸质分发方式和编号负责人都成为历史。

但它最重要的原则没有过时:

1
2
3
4
5
6
7
8
不要等到所有问题都解决
才开始技术讨论。

不要因为一段话被写进文档
就把它当成不可质疑的真理。

让技术想法尽早进入
公开、可引用、可追踪的讨论过程。

站在今天的软件工程视角看,RFC 3 最像一份极早期的:

1
Engineering Collaboration Protocol

而互联网后来证明了一件事:

伟大的协议不仅需要优秀的技术设计,也需要一套允许不同人持续提出、批评、修订和淘汰这些设计的协作机制。

RFC 3 写的,就是这套机制最早的雏形。


RFC 3 带读:Documentation Conventions——互联网最早的协作规则,为什么反而鼓励“不成熟”
https://allendericdalexander.github.io/2026/08/13/rfc/rfc00003-documentation-conventions/
作者
AtLuoFu
发布于
2026年8月13日
许可协议