系统设计中的端到端论证

J.H. Saltzer, D.P. Reed and D.D. Clark

M.I.T. Laboratory for Computer Science

本文提出一种设计原则,用来指导分布式计算机系统中各模块之间的功能放置(function placement)。这个原则称为端到端论证(end-to-end argument),它指出,把功能放在系统低层,和在低层提供这些功能的成本相比,可能是冗余的,或者价值很小。文中讨论的例子包括比特错误恢复、使用加密实现安全性、重复消息抑制(duplicate message suppression)、系统崩溃后的恢复,以及送达确认(delivery acknowledgement)。支持这些功能的低层机制,只有作为性能增强时才有正当理由。

引言

在各种功能之间选择恰当边界,也许是计算机系统设计者最主要的工作。能够指导这种功能放置选择的设计原则,是系统设计者最重要的工具之一。本文讨论一类功能放置论证:它多年来一直被使用,却既没有得到明确承认,也没有得到充分信服。不过,随着数据通信网络成为计算机系统的一个组件,这条功能放置论证变得更加鲜明,因为相关情形及其适用理由变得更加明显。本文将这个论证明确表述出来,以便考察它的性质,并看看它究竟有多通用。该论证诉诸应用需求,并为把功能在分层系统中向上移动、移近使用该功能的应用,提供了理由。我们先考虑这个论证在通信网络中的形式。

在包含通信的系统中,人们通常会在通信子系统周围画出一个模块边界,并在它和系统其余部分之间定义一个明确接口。这样做时会发现,有一组功能,每个功能都可能以几种方式实现:由通信子系统实现,由它的客户实现,由双方共同实现,或者甚至冗余地实现,各自做一套。在推理这种选择时,应用的需求为一类论证提供了基础,其形式如下:

所讨论的功能,只有借助位于通信系统端点(end points)处的应用的知识和帮助,才能完整且正确地实现。因此,把这个功能作为通信系统本身的一项特性来提供是不可能的。(有时,由通信系统提供该功能的一个不完整版本,作为性能增强可能有用。)

我们把这种反对低层功能实现的推理称为“端到端论证”。以下各节会详细考察端到端论证,先用一个典型案例研究说明它的用法,其中所讨论的功能是可靠数据传输(reliable data transmission);然后展示同一论证可适用的功能范围。对于数据通信系统而言,这个范围包括加密、重复消息检测(duplicate message detection)、消息排序(message sequencing)、保证消息递送(guaranteed message delivery)、检测主机崩溃以及送达回执(delivery receipts)。在更广的语境中,这个论证似乎也适用于计算机操作系统的许多其他功能,包括文件系统。不过,如果先考察更具体的数据通信语境,之后考察更广的语境会更容易。

端到端照管(end-to-end caretaking)

考虑“谨慎文件传输(careful file transfer)”的问题。一个文件由文件系统存储在计算机 A 的磁盘存储中。计算机 A 通过数据通信网络与计算机 B 相连,计算机 B 也有文件系统和磁盘存储。目标是在知道沿途各处可能发生故障的情况下,把文件从计算机 A 的存储移动到计算机 B 的存储,并且不造成损坏。在这个例子中,应用程序就是文件传输程序,其中一部分运行在主机 A 上,另一部分运行在主机 B 上。为了讨论这次事务中文件完整性可能受到的威胁,我们假设其中包含以下具体步骤:

  1. 在主机 A 上,文件传输程序调用文件系统从磁盘读取文件;该文件驻留在若干磁道上,文件系统以固定大小的块把它传给文件传输程序,这些块被选择为与磁盘格式无关。
  2. 同样在主机 A 上,文件传输程序请求数据通信系统使用某种通信协议传输该文件,该协议会把数据拆分为分组。分组大小通常不同于文件块大小和磁盘磁道大小。
  3. 数据通信网络把这些分组从计算机 A 移动到计算机 B。
  4. 在主机 B 上,一个数据通信程序从数据通信协议中取出这些分组,并把其中包含的数据交给文件传输应用的第二部分,也就是在主机 B 内运行的那部分。
  5. 在主机 B 上,文件传输程序请求文件系统把收到的数据写入主机 B 的磁盘。

在这个步骤模型下,谨慎的设计者可能会关心以下事务威胁:

  1. 文件虽然最初已正确写入主机 A 的磁盘,但现在读出时可能包含错误数据,原因可能是磁盘存储系统中的硬件故障。
  2. 文件系统、文件传输程序或数据通信系统的软件,在主机 A 或主机 B 对文件数据进行缓冲和复制时,可能会出错。
  3. 在主机 A 或主机 B 进行缓冲和复制时,硬件处理器或其本地内存可能发生瞬时错误。
  4. 通信系统可能丢弃或改变某个分组中的比特,或者丢失某个分组,或者把某个分组递送多次。
  5. 任一主机都可能在事务进行到一半时崩溃,此时它已经执行了未知数量(可能是全部)的事务工作。

那么,谨慎的文件传输应用应该如何应对这组威胁?一种做法可能是在沿途每一步都加固,例如使用副本、超时与重试、精心布置的错误检测冗余、崩溃恢复等。目标是把每个单独威胁发生的概率降到可接受的小值。不幸的是,要系统性地对抗第二个威胁,就需要编写正确的程序,而这项任务相当困难,并且必须正确的程序并不全由文件传输应用程序员编写。如果我们进一步假设所有这些威胁的概率都相对较低,低到系统仍能完成有用工作,那么“所有事情都做三遍”这样的蛮力对策就显得不经济。

另一种做法可以称为“端到端检查与重试”。假设为了帮助应对第一个威胁,每个文件都随附存储一个校验和(checksum),它具有足够的冗余,能够把文件中未被检测出的错误概率降到可接受的可忽略水平。应用程序按上面的简单步骤把文件从 A 传到 B。然后,作为最后一个附加步骤,驻留在主机 B 的文件传输应用部分,从自己的磁盘存储系统中把传输后的文件副本重新读回自己的内存,重新计算校验和,并把这个值发回主机 A,在那里与原始文件的校验和进行比较。只有两个校验和一致时,文件传输应用才宣布事务已提交。如果比较失败,就说明出了问题,可以尝试从头重试。

如果故障确实相当少见,这项技术通常会在第一次尝试时成功;偶尔可能需要第二次甚至第三次尝试;如果同一次文件传输尝试发生两次或更多次故障,人们大概会认为系统的某个部分需要修理。

现在让我们考虑一个常见提议是否有用:让通信系统在内部提供可靠数据传输保证。例如,它可以通过选择性冗余来实现这种保证,如分组校验和(packet checksum)、序列号检查以及内部重试机制。只要足够谨慎,未检测出的比特错误概率可以降低到任何期望水平。问题在于,通信系统这番试图提供帮助的努力,对谨慎的文件传输应用是否有用。

答案是,第四个威胁也许已经消除,但谨慎的文件传输应用仍然必须对抗其余威胁,因此它仍应基于文件的端到端校验和提供自己的重试。如果它这样做,那么通信系统中为提供可靠数据传输保证而付出的额外努力,只是在降低文件传输应用的重试频率;它对结果的必然性或正确性没有影响,因为无论数据传输系统是否特别可靠,正确的文件传输都由端到端校验和与重试来保证。

由此得到论证:为了实现谨慎文件传输,执行传输的应用程序必须提供文件传输专用的端到端可靠性保证;在这里,就是用于检测故障的校验和,以及一套重试/提交方案。数据通信系统特意变得异常可靠,并不会减轻应用程序确保可靠性的负担。

一个过于真实的例子

最近在 M.I.T. 出现了一个很有意思的例子,说明人们可能遇到的陷阱:一个网络系统由若干通过网关连接的局域网组成,它在从一个网关到下一个网关的每一跳上使用分组校验和,假设正确通信的主要威胁是传输期间比特被破坏。应用程序员知道这个校验和,因而假定网络正在提供可靠传输,却没有意识到传输数据在每个网关中存储时并未受到保护。某台网关计算机出现了一个瞬时错误:在把数据从输入缓冲区复制到输出缓冲区时,会交换一对字节,频率大约是每经过一百万字节发生一次。在一段时间内,某个操作系统的许多源文件反复通过这个有缺陷的网关传输。其中一些源文件因字节交换而损坏,文件所有者被迫求助于最终的端到端错误检查:人工与旧清单比较并据此修正。

性能方面

然而,如果由此得出低层在获得可靠性方面不应扮演任何角色,那就过于简单化了。考虑一个有些不可靠的网络,每发送一百条消息就丢弃一条。上文概述的简单策略,即传输文件然后检查文件是否正确到达,会随着文件长度增加而表现更差。一个文件的所有分组都正确到达的概率,会随文件长度指数式下降,因此传输文件的期望时间会随文件长度指数式增长。显然,在低层投入一些努力来改善网络可靠性,可能会对应用性能产生显著影响。但这里的关键思想是,低层不需要提供“完美”可靠性。

因此,在数据通信系统内部应对可靠性措施投入多少努力,被视为基于性能的工程折中,而不是正确性要求。注意,这里的性能有几个方面。如果通信系统过于不可靠,文件传输应用的性能会因为端到端校验和失败后的频繁重试而受到损害。如果通信系统通过内部可靠性措施加固,这些措施也有性能成本,其形式包括冗余数据占用带宽,以及在递送数据之前等待内部一致性检查完成而增加的延迟。考虑到无论通信系统变得多么可靠,文件传输应用的端到端检查仍然必须实现,就没有多少理由在这个方向上推进得很远。“恰当的”折中需要仔细思考;例如,可以先把通信系统设计成只提供那些成本和工程工作量很小即可获得的可靠性,然后评估剩余错误水平,确保它与文件传输层可接受的重试频率相一致。在应用层以下的任何位置,追求可忽略的错误率大概并不重要。

用性能来证明把功能放在低层子系统(lower-level subsystem)中是合理的,必须谨慎。有时,经过彻底考察问题,同样甚至更好的性能增强也可以在高层实现。如果某个功能能够在对低层子系统已有机制造成最小扰动的情况下执行,那么在低层执行它可能更高效;但也可能正好相反,也就是说,在低层执行该功能成本可能更高,原因有两个。第一,低层子系统由许多应用共享,那些不需要该功能的应用也会为它付出代价。第二,低层子系统可能没有高层掌握的那么多信息,因此无法同样高效地完成任务。

性能折中常常相当复杂。再次考虑不可靠网络上的谨慎文件传输。提高分组可靠性的常用技术,是某种逐分组错误检查(per-packet error check)与重试协议。这个机制既可以在通信子系统中实现,也可以在谨慎文件传输应用中实现。例如,谨慎文件传输中的接收方可以定期计算迄今已接收文件部分的校验和,并把它发回发送方。发送方随后可以通过重传任何出错的部分来重新开始。

端到端论证并没有告诉我们应把这些早期检查放在哪里,因为任一层都可以完成这项性能增强工作。把早期重试协议放在文件传输应用中,会简化通信系统,但可能增加总体成本,因为通信系统由其他应用共享,而每个应用现在都必须提供自己的可靠性增强。把早期重试协议放在通信系统中可能更高效,因为它可以在网络内部逐跳(hop-by-hop)执行,从而减少纠正故障所涉及的延迟。与此同时,某些应用可能认为这种增强的成本不值得其结果,但现在它已经没有选择。 要明智地做出这种选择,需要大量关于系统实现的信息。

† 例如,实时语音传输对消息延迟的约束比对比特错误率的约束更严格。多数重试方案会显著增加延迟的可变性。

端到端论证的其他例子

递送保证

低层子系统支持分布式应用时,如果提供的某个功能本质上无论如何都必须在应用层(application level)实现,那么它提供该功能可能是在浪费努力。这个基本论证不仅适用于可靠数据传输,也适用于多种功能。也许最古老、最广为人知的论证形式涉及送达确认。数据通信网络很容易为每条送达接收方的消息向发送方返回一个确认。例如,ARPANET 每当送达一条消息时,都会返回一个称为“Request For Next Message”(RFNM)的分组[1]。虽然这个确认在网络内部作为一种拥塞控制形式可能有用(最初,ARPANET 在前一个 RFNM 返回之前,会拒绝接受发往同一目标的另一条消息),但对使用 ARPANET 的应用来说,它从未被发现很有帮助。原因在于,确切知道消息已经送达到目标主机并不很重要。应用想知道的是目标主机是否已经对消息采取行动;在消息送达之后、消息请求的动作完成之前,各种灾难都可能发生。真正需要的确认是端到端确认(end-to-end acknowledgement),它只能由目标应用发起:“我做了”,或者“我没做”。

另一种获得即时确认的策略,是让目标主机足够复杂,使其在接受消息送达时,也接受保证该消息会由目标应用处理的责任。这种方法在一些应用中可以消除对端到端确认的需要,但不是所有应用。对于那些只有在请求其他主机执行的类似动作也成功时,目标主机才应执行所请求动作的应用,仍然需要端到端确认。这类应用需要两阶段提交协议(two-phase commit protocol)[5][10][15],它是一种复杂的端到端确认。此外,如果目标应用可能失败或拒绝执行所请求的动作,因而否定确认(negative acknowledgement)是一种可能结果,那么端到端确认仍可能是一项要求。

数据的安全传输

数据加密是另一个可应用端到端论证的领域。这里的论证有三重。第一,如果数据传输系统执行加密和解密,就必须信任它能够安全地管理所需的加密密钥。第二,数据在进入目标节点并分发给目标应用时将是明文,因此是脆弱的。第三,消息的真实性仍然必须由应用检查。如果应用执行端到端加密,它就获得了所需的认证检查,可以按自己满意的方式处理密钥管理,而且数据永远不会在应用之外暴露。

因此,为满足应用的需求,通信子系统没有必要为所有流量提供自动加密。不过,通信子系统对所有流量自动加密可能是为了确保另一件事:行为不当的用户或应用程序不会故意传输不应暴露的信息。当所有数据被放入网络时对其自动加密,是系统设计者可以使用的又一道防火墙,用来确保信息不会逃出系统之外。但要注意,这与认证系统用户对数据特定部分的访问权是不同的要求。这种网络层加密(network-level encryption)可以相当简单:所有主机可以使用同一个密钥,并频繁更换密钥。没有逐用户密钥,也就不会让密钥管理问题复杂化。将加密用于应用层认证(application-level authentication)与保护是互补的。两种机制都不能完全满足这两项要求。

重复消息抑制

重复消息抑制可以适用一个更精细的论证。某些通信网络设计的一个性质是,一条消息或消息的一部分可能被递送两次,这通常是由网络内部基于超时的故障检测与重试机制导致的。网络可以提供监视并抑制任何这类重复消息的功能,也可以简单地把它们递送出去。人们可能会预期,一个应用要应对可能把同一条消息递送两次的网络会非常麻烦;事实也确实麻烦。不幸的是,即便网络抑制了重复消息,应用本身也可能在自己的失败/重试过程中意外地产生重复请求。这些应用层重复对通信系统来说看起来像不同消息,因此通信系统无法抑制它们;抑制必须由应用自己完成,并且要依靠应用知道如何检测自身的重复。

一个必须在高层处理重复抑制的常见例子是:远程系统用户因缺乏响应而困惑,于是向分时系统发起一次新的登录。另一个例子是,多数通信应用都包含一种机制,用于应对多站点事务一端的系统崩溃:当崩溃的系统重新启动后重建事务。不幸的是,可靠地检测系统崩溃是有问题的:问题可能只是一个丢失或长时间延迟的确认。如果是这样,重试的请求现在就是重复请求,而只有应用能够发现这一点。因此端到端论证再次出现:如果应用层无论如何都必须有一个重复抑制机制,那么这个机制也可以抑制通信网络内部产生的任何重复,因此该功能可以从低层省略。同样的基本推理既适用于完全遗漏的消息,也适用于重复消息。

保证 FIFO 消息递送

确保消息以发送时的相同顺序到达接收方,是另一个通常分配给通信子系统的功能。通常用于实现这种先进先出(first-in, first-out, FIFO)行为的机制,是保证同一虚电路(virtual circuit)上发送的消息具有 FIFO 顺序(FIFO ordering)。沿独立虚电路发送的消息,或者通过通信子系统之外的中间进程发送的消息,可能以不同于发送顺序的顺序到达。对于某个节点能够发起请求并在多个站点触发动作的分布式应用,它不能利用 FIFO 顺序性质来保证所请求的动作按正确顺序发生。相反,必须由高于通信子系统的一种独立机制来控制动作顺序。

事务管理

我们已经在构造 SWALLOW 分布式数据存储系统(distributed data storage system)[15]时应用了端到端论证,并由此显著减少了开销。SWALLOW 提供称为存储库(repository)的数据存储服务器,可被远程用于存储和检索数据。访问存储库中的数据,是通过向它发送一条消息完成的;消息指定要访问的对象、版本、访问类型(读/写),如果访问是写,还包括要写入的值。底层消息通信系统不抑制重复消息,因为 a) 对象标识符加上版本信息足以检测重复写入;b) 重复读请求消息的效果只是生成一个重复响应,而发起方可以很容易地丢弃它。因此,低层消息通信协议被显著简化。

底层消息通信系统也不提供送达确认。写请求发起方所需要的确认是数据已经安全存储。这个确认只能由 SWALLOW 系统的高层提供。对于读请求,送达确认是冗余的,因为包含所读值的响应已经是足够的确认。通过消除送达确认,传输的消息数量减半。这种消息减少会对主机负载和网络负载都产生显著影响,从而改善性能。同一条推理也用于开发一种实验性协议,用于远程访问磁盘记录[6]。由此降低低层协议路径长度(path length),对于维持远程磁盘访问的良好性能很重要。

识别端点

使用端到端论证有时需要对应用需求进行细致分析。例如,考虑一个承载某些分组语音连接(packet voice connection)的计算机通信网络,也就是数字电话设备之间的对话。对于这些承载语音分组的连接,端到端论证的一个特别强的版本适用:如果通信系统的低层试图实现逐比特无误的通信(bit-perfect communication),它们很可能会在分组递送中引入不可控延迟,例如,请求重传损坏的分组,并在较早分组被正确重传之前推迟较晚分组的递送。这类延迟会破坏语音应用,因为它需要以恒定速率向听者馈送数据。更好的做法是接受略有损坏的分组原样到达,或者甚至用静音、前一个分组的副本或一段噪声来替代它们。语音的天然冗余,加上高层错误校正过程,也就是一位参与者说“抱歉,有人摔了一个杯子。请你再说一遍好吗?”,将在这类丢失相对少见时处理它们。

然而,这个强版本的端到端论证,是特定应用的性质,也就是两个人实时交谈的性质,而不是比如语音一般性的性质。如果改为考虑语音消息系统,其中语音分组被存储在文件中,以便接收方稍后收听,那么论证的性质会突然改变。分组递送到存储介质时的短暂延迟并不会特别造成破坏,因此不再反对可能为了实现可靠性而引入延迟的低层可靠性措施。更重要的是,对这个应用来说,尽可能提高录制消息的准确性实际上是有帮助的,因为接收方在收听录音时无法要求发送方重复一句话。另一方面,当存储系统作为语音通信的接收端时,端到端论证确实适用于分组排序和重复抑制。因此,端到端论证不是一条绝对规则,而是一条帮助进行应用和协议设计分析的指导原则;必须谨慎识别该论证应适用的端点。

历史以及对其他系统领域的应用

本文列举的各个端到端论证例子并非原创;它们多年来逐渐积累。作者注意到的第一个可疑中间送达确认例子,是 M.I.T. Compatible Time-Sharing System 的“wait”消息,每当用户输入一条命令时,系统都会在用户终端上打印该消息[3]。(在系统早期,这条消息有一些价值,因为崩溃和通信故障如此频繁,中间确认提供了一些必要的安慰,让人知道一切正常。)

与加密相关的端到端论证最早由 Branstad 在 1973 年的一篇论文中公开讨论[2];军事安全界大概在那之前已有过保密讨论。Diffie 和 Hellman[4] 以及 Kent[8] 更深入地展开了这些论证,Needham 和 Schroeder[11] 则为此目的设计了改进协议。

Gray[5]、Lampson 和 Sturgis[10] 以及 Reed[13] 的两阶段提交数据更新协议,都使用了某种形式的端到端论证来证明其存在的必要性;它们是端到端协议,其正确性并不依赖通信系统内部的可靠性、FIFO 排序或重复抑制,因为所有这些问题也可能由其他系统组件故障引入。Reed 在其关于分散式原子动作的博士论文第二章中明确提出了这个论证[14]

端到端论证经常应用于应用系统中的错误控制(error control)和正确性(correctness)。例如,银行系统通常会把高层审计过程作为政策和法律要求来提供。这些高层审计过程不仅会发现高层错误,例如对错误账户执行取款,也会检测出低层错误,例如底层数据管理系统中的协调错误。因此,一个成本高昂、能绝对消除这类协调错误的算法,可以说不如一个成本较低、只是让这类错误非常罕见的算法合适。在航空订票系统中,可以依靠代理人在系统崩溃和延迟中不断尝试,直到预订被确认或被拒绝。因此,保证一个未确认的订票请求能在系统崩溃后存活下来的低层恢复过程,并非至关重要。在电话交换机中,可能导致单个呼叫丢失的故障被认为不值得提供显式恢复,因为如果这通电话重要,呼叫者大概会重新拨打[7]。所有这些设计方法,都是端到端论证应用于自动恢复的例子。

网络协议界关于数据报(datagram)、虚电路和无连接协议(connectionless protocol)的许多争论,都是关于端到端论证的争论。模块化论证推崇把可靠、FIFO 排序、重复抑制的数据流作为一个易于在其上构建的系统组件,这个论证偏向虚电路。端到端论证则声称,对某些应用来说,集中提供的这些功能版本都会是不完整的,而这些应用会发现,从数据报开始构建自己的功能版本更容易。

端到端论证在非通信应用中的一个版本,是 1950 年代由系统分析员发展出来的,他们的职责包括在大量磁带卷上读写文件。反复尝试定义和实现“可靠磁带子系统”,也反复失败,因为不稳定的磁带驱动器、不可靠的系统操作员以及系统崩溃共同击败了所有狭窄聚焦的可靠性措施。最终,标准做法变成每个应用都提供自己的、依赖应用的检查和恢复策略;并假设低层错误检测机制至多降低高层检查失败的频率。例如,Multics 文件备份系统[17]虽然建立在一种提供强大错误检测与纠正特性的磁带子系统格式基础之上,却仍以记录标签和每个文件的多个副本形式提供自己的错误控制。

支持精简指令集计算机(reduced instruction set computer, RISC)架构的论证,与端到端论证相似。RISC 论证认为,架构的客户通过使用原始工具实现恰好所需的指令,会获得更好的性能;计算机设计者任何试图预判客户对某个特殊功能需求的努力,都很可能稍稍偏离目标,结果客户仍会重新实现该功能。(我们感谢 M. Satyanarayanan 指出这个例子。)

Lampson 在支持“开放操作系统(open operating system)”的论证中[9],使用了类似端到端论证的论证作为理由。Lampson 反对把任何功能做成低层模块的永久固定组成部分;功能可以由低层模块提供,但它应始终可以被应用的特殊版本替换。其推理是,对于你能想到的任何功能,至少会有一些应用发现,为了正确满足自己的需求,它们必然必须亲自实现该功能。这条推理引导 Lampson 提出一种“开放”系统,其中整个操作系统由库中的可替换例程组成。这种方法直到最近才在专用于单个应用的计算机语境中变得可行。大型操作系统中常见的大量固定监督程序(supervisor)功能,可能只是经济压力的产物:这些压力要求对昂贵硬件进行多路复用,因此需要受保护的监督程序。事实上,最近多数系统“内核化(kernelization)”项目,至少部分地关注把功能移出系统低层[16][12]。虽然这种功能移动受到另一类正确性论证的启发,但它的副作用是产生一个对应用更灵活的操作系统,而这正是端到端论证的主要方向。

结论

在选择通信子系统应提供哪些功能时,端到端论证是一种“奥卡姆剃刀”。由于通信子系统常常在使用它的应用尚不清楚之前就被指定,设计者可能会受诱惑,通过承担超过必要的功能来“帮助”用户。意识到端到端论证,有助于减少这类诱惑。

如今谈论“分层”通信协议很时髦,但人们并没有明确定义把功能分配到各层的准则。这类分层有利于增强模块化。端到端论证可以被视为组织这类分层系统的一组理性原则的一部分。我们希望本文的讨论有助于让关于“恰当”分层的争论更有实质内容。

致谢

许多人阅读并评论了本文较早的草稿,包括 David Cheriton、F.B. Schneider 和 Liba Svobodova。这个主题也在 1980 年 12 月于加利福尼亚州 Fallbrook 举行的 ACM Workshop in Fundamentals of Distributed Computing 上讨论过。这些评论和讨论对澄清论证很有帮助。

References

  1. Bolt Beranek and Newman Inc. Specifications for the interconnection of a host and an IMP. Technical Report No. 1822, Cambridge, Mass., December, 1981.
  2. Branstad, D.K. Security aspects of computer networks. AIAA Paper No. 73-427, AIAA Computer Network Systems Conference, Huntsville, Alabama, April, 1973.
  3. Corbato, F.J., et al. The Compatible Time-Sharing System, A Programmer’s Guide. M.I.T. Press, Cambridge, Massachusetts, 1963, p.10.
  4. Diffie, W., and Hellman, M.E. New directions in cryptography. IEEE Trans. on Info. Theory, IT-22, 6, (November, 1976), pp.644-654.
  5. Gray, J.N. Notes on database operating systems. In Operating System: An Advanced Course. Volume 60 of Lecture Notes in Computer Science, Springer-Verlag, 1978, pp.393-481.
  6. Greenwald, M. Remote virtual disk protocol specifications. M.I.T. Laboratory for Computer Science Technical Memorandum, in preparation. Expected publication, 1984.
  7. Keister, W., Ketchledge, R.W., and Vaughan, H.E.: No. 1 ESS: System organization and objectives. Bell System Technical Journal 53, 5 (part 1), (September, 1964) p. 1841.
  8. Kent, S.T.: Encryption-based protection protocols for interactive user-computer communication.: S.M. thesis, Massachusetts Institute of Technology, Department of Electrical Engineering and Computer Science, May, 1976. Also available as M.I.T. Laboratory for Computer Science Technical Report, TR-162, May, 1976.
  9. Lampson, B.W., and Sproull, R.F. An open operating system for a single-user machine. Proc. Seventh Symposium on Operating Systems Principles, Operating Systems Review 13, Special issue (December, 1979), pp.98-105.
  10. Lampson, B., and Sturgis, H: Crash recovery in a distributed data storage system. Working paper, Xerox PARC, November, 1976 and April, 1979. Submitted to CACM.
  11. Needham, R.M., and Schroeder, M.D.: Using encryption for authentication in large networks of computers. CACM 21, 12, (December, 1978), pp.993-999.
  12. Popek, G.J., et al.: UCLA data secure unix. Proc. 1979 NCC, AFIPS Press, pp.355-364.
  13. Reed, D.P.: Implementing atomic actions on decentralized data. ACM Transactions on Computer Systems 1, 1 (February, 1983), pp.3-23.
  14. Reed, D.P.: Naming and synchronization in a decentralized computer system. Ph.D. thesis, Massachusetts Institute of Technology, Department of Electrical Engineering and Computer Science, September 1978. Also available as M.I.T. Laboratory for Computer Science Technical Report, TR-205, September, 1978.
  15. Reed, D.P., and Svobodova, L.: SWALLOW: A distributed data storage system for a local network. In West, A., and Janson, P., ed. Local Networks for Computer Communications, Proc. IFIP Working Group 6.4 International Workshop on Local Networks. North-Holland, Amsterdam, 1981, pp.355-373.
  16. Schroeder, M.D., Clark, D.D., and Saltzer, J.H.: The Multics kernel design project. Proc. Sixth Symposium on Operating Systems Principles, Operating Systems Review 11, 5 (November, 1977,) pp.43-56.
  17. Stern, J.A.: Backup and recovery of on-line information in a computer utility. S.M. thesis, M.I.T. Department of Electrical Engineering and Computer Science, August 1973. Available as M.I.T. Project MAC Technical Report TR-116, January, 1974.

End-to-End Arguments in System Design

1984 · J.H. Saltzer, D.P. Reed, D.D. Clark

lucida 翻译

标签: 分布式系统, 计算机网络, 软件架构, 经典重读