摘要
- RFC 3018 把网络节点组织成 128 位分布式地址空间,允许虚拟机执行远端读写、内存分配、对象操作以及
JUMP、CALL等控制转移指令。 - 事务可以要求所有指令同时执行或全部不执行,但规范明确不支持执行后的取消,并指出控制转移可能根本无法撤销。因此,原子释放不是回滚证明,也不是安全或业务结果证明。
接收端已经拿到完整指令包,却还没有执行。此时,发送一条 EXEC_TR 可以放行它,发送 CANCEL_TR 则可以把它删除。
这是一条清楚的边界。
然而一旦包内的远端 CALL 已经开始,边界就变了。新线程可能写入别处,调用对象过程,发出消息,甚至把控制权继续交给下一段代码。RFC 3018 对这一刻没有含糊其辞:执行之后的事务取消不在规范之内;如果需要补偿,必须由虚拟机层实现,因为控制转移等指令可能无法取消。
这句限制,比“统一内存空间”这个宏大名字更值得记住。
2000 年 12 月发布的 Unified Memory Space Protocol Specification 是一份 Experimental RFC。它设想的不只是远程过程调用,而是让一个任务拥有跨节点的 128 位地址空间。用户程序不必感知网络原语;虚拟机看到远端地址后,把读、写、比较、分配、释放、代码移动、对象调用或控制转移翻译成 UMSP 网络指令。
网络从编程接口里退场,却没有从失败模型里退场。
地址统一了,保管责任没有统一
UMSP 把计算分成 job、task 和控制线程三层。job 是分布式应用;它在每个节点最多有一个 task;task 内可以有多个线程。Job Control Point(JCP)集中跟踪任务的初始化和结束,并分配控制标识。
看起来,所有节点被一张地址图连接起来。实际上,权力仍然分散。JCP 管协调;各节点管本地内存;虚拟机管指针、资源和执行顺序;传输层管字节;用户代码发起可能在远端产生后果的操作。
RFC 明确说,协议不控制 job 的本地内存,也不跟踪用户控制线程。任务结束后,相关 128 位指针必须由 VM 作废。连续代码段不能跨节点分布,尽管跳到远端地址会在目标节点创建新线程。
所以,一个 16 字节地址可以统一命名,却不能统一时钟、日志、恢复负责人或观察位置。它告诉系统“往哪里做”,并不自动告诉审计者“谁保留了旧状态”“哪个版本被写过”“远端是否真的完成”。
这种差异在指令面上非常实际。UMSP 不只读取数据,还能 WRITE、MEM_ALLOC、FREE、MVCODE、MVRUN、JUMP、CALL,也能创建、删除对象和执行对象过程。一次错误可能不是坏消息,而是远端资源、代码或控制流已经改变。
一个事务至少经历四种证据状态
RFC 3018 定义了不同类型的指令链。sequence 表示依赖顺序:前一条未成功,后续指令取消。transaction 则可以包含彼此不相干的指令,但它们必须一起执行,或者完全不执行。
要做到这一点,接收端首先必须知道事务长度,因为完整包可能需要缓存。第一条指令带 _BEGIN_TR,最后一条带 _END_CHAIN。
完整到达之后,事务才进入“已准备、未执行”的状态。如果 TRR=1,接收完最后一条就立即执行;如果 TRR=0,必须等待单独的 EXEC_TR。在开始之前,CANCEL_TR 可以删除此前传来的事务指令,而且被删除的内容不提供恢复。
TRE 又引入了异常路径。对已完整传输但尚未执行的事务,TRE=1 可以要求它在寿命到期或会话异常结束时仍然执行;TRE=0 则要求取消。寿命计时从完整接收后才开始,零表示没有时限。
因此,“连接断了”并不是一个足够精确的事故描述。它可能发生在半包状态,可能发生在完整缓存状态,可能发生在显式放行之后,也可能反过来触发了异常结束时的执行规则。
可靠记录至少要分开四件事:完整事务的标识和指令摘要、接收端的准备状态、放行或取消的原因、每项有后果指令的执行与外部观察。把它们压成一个 committed=true,正好丢掉恢复所需的信息。
原子进入执行,不等于原子回到过去
“事务”容易让人联想到数据库的完整语义。RFC 3018 的承诺更窄:这组指令应一起执行或全部不执行。它没有承诺执行后的世界必然存在通用逆操作。
远端写入可能马上被另一个线程读取。FREE 可能让别处持有的指针失效。移动和运行代码可能创造新的行为主体。对象过程可能修改协议之外的系统。远端 JUMP 或 CALL 会创建控制流,而这些控制流可以继续产生效果。
即使事务的起跑线完全原子,跑出去的结果也可能不可逆。
设想一组指令先分配内存,再装入代码,最后把控制权交给它。UMSP 可以避免只做其中一半。但新线程若随后发布数据、驱动设备或改变另一个服务,删除原始指令包不会把外部行动收回。
这就是“取消”与“补偿”的区别。取消发生在执行前,对象是待执行的事务。补偿发生在执行后,对象是已经改变的应用状态,而且必须知道具体效果。协议无法从操作码推导出每一种业务逆操作。
EXEC_TR 因此只证明某个链被要求执行。它本身不证明每一条 VM 行为完成,不证明所有下游影响只发生一次,也不证明最终任务达成了人的目标。
TCP 收到字节,不等于 VM 已经行动
UMSP 要求实现提供 TCP,用于可靠的数据交换;对不需要确认的数据则允许 UDP。RFC 793 的 TCP 合同很重要:它提供有序、可靠的字节流,处理丢失、重复、损坏和乱序。RFC 768 的 UDP 则更薄,只提供数据报接口。
但 TCP 确认属于传输层。它说明接收端 TCP 接受了相应字节,不说明 UMSP 解析成功,不说明指令进入正确事务,不说明正确主体放行,也不说明 VM 在预期内存版本上执行完毕。
相邻的 ONC RPC 规范 RFC 1831 把这种不确定性说得很清楚。在其模型中,通过 TCP 收到回复可以支持一次执行的推断;没有回复,却不能推断没有执行。服务器可能先执行,随后连接才失败。远程调用还必须面对本地调用没有的失败、侧作用、性能和认证问题。
UMSP 把远程操作伪装得更像 CPU 指令。这让编程模型更整洁,也让证据分层更重要。接口越像本地,越容易忽视“回复丢了,但远端也许已经做了”的现实。
JCP 是协调中心,不是全知观察者
JCP 为分布式 job 提供中心。它分配全局 job 标识,跟踪 task 的启动和结束,还可以承担集中用户识别与攻击防护。
中心位置有利于关联日志,却不会自动生成它没有看到的事实。VM 仍然掌握本地内存与指针。远端线程可能产生 JCP 没有直接观察的外部效果。执行后、回复前发生的故障会留下不确定性。节点重启还要求区分旧会话片段。
所以,“task 已结束”是生命周期事实,“目标写入已持久化”是内存事实,“外部动作只发生一次”是应用事实。即使 “job completed” 也不能代替这些证明。
初始机制明确没有装入完整安全合同
RFC 3018 的安全章节开门见山:为了降低初始复杂度,安全问题没有纳入本文的最小功能;随后内容是未来扩展建议。
文档提出可以使用 TCP/IP 的防护,可以让特殊处理链承载顺序完整性控制或加密,也可以在扩展头里传递认证参数。它设想通信节点与 JCP 之间的多种认证组合。针对中间人,它建议 A–B、A–G、G–B 路径不要重合,并承认共同网关会削弱这种防护。
它也识别到 JUMP 和 CALL 可能造成拒绝服务,资源分配需要 VM 判断。客户端加载服务器主动代码时,客户端风险更高;服务器执行客户端代码时,服务器必须加强保护。
这些文字识别了攻击面,却没有给出完整算法、密钥、授权规则、防重放、撤销或审计协议。不能把“将来可通过扩展头实现”误读为“当前已经得到保护”。
后来发布的 RFC 3552 提供了回看时的对照:其 Internet 威胁模型假设攻击者几乎可以控制通信通道,能够读取、删除、修改或注入报文。这不是强加给 2000 年文档的追溯规则,但它提醒我们,路径分离建议和未定义扩展不能充当安全完成凭证。
Experimental 保存的是设计,不是部署结论
RFC 2026 把 Experimental 放在非标准轨道,并明确这类文档不是 Internet Standard。它们可以保存研究或开发工作。RFC 2119 提供规范性关键词,RFC 2234 提供 ABNF;RFC 793、RFC 768 和 RFC 1831 则界定相邻的传输与调用语义。
这批来源证明 RFC 3018 写下了怎样的系统。它们不证明 UMSP 被采用、实现、互通,也不证明发生过真实事故或成功部署。历史文章不能从协议的详细程度推导出运行事实。
真正能从文本中确认的是,它把一个极强的抽象推到了边界。地址可以统一,保管权仍然分散;指令可以完整到达,是否放行仍是另一事实;事务可以原子开始,已经产生的效果仍可能无法撤回;job 可以结束,人的目标仍需要外部观察。
Lu Heng 的三条思想在这里适合作为公开的分析镜头。Running-Code Primacy 要求区分写在协议里的动作与运行系统里的事实。Reality Layers 不让编码、缓存、放行、执行和结果互相借用证明。Minimum Initial Specification 可以解释薄核心为何保留未来选择,但同时要求把安全、补偿和观察合同的缺席明确写出来。
这些镜头不是对 RFC 作者动机的猜测。
指令包可以一次性跨过门槛。门槛另一侧的世界,没有统一撤销键。
Sources
- RFC 3018 的 RFC Editor 记录
- RFC 3018:Unified Memory Space Protocol Specification
- RFC 3018 纯文本存档
- RFC 1831 的 RFC Editor 记录
- RFC 1831:RPC Remote Procedure Call Protocol Version 2
- RFC 793 的 RFC Editor 记录
- RFC 793:Transmission Control Protocol
- RFC 768 的 RFC Editor 记录
- RFC 768:User Datagram Protocol
- RFC 2026 的 RFC Editor 记录
- RFC 2026:The Internet Standards Process
- RFC 2119 的 RFC Editor 记录
- RFC 2234:Augmented BNF for Syntax Specifications
- RFC 3552:Guidelines for Writing RFC Text on Security Considerations
- Lu Heng:Running-Code Primacy
- Lu Heng:Reality Layers
- Lu Heng:Minimum Initial Specification
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
