计算机与信息 · 11/14
端到端原则End-to-End Principle
只有两端掌握完整条件时,最终正确性就必须由两端保证。
WhatsApp 自己也读不到用户的聊天了。2016 年 4 月,美国加州山景城的这家公司宣布完成一项改造。创始人扬·库姆带领的团队,让最新版应用的聊天默认加密。消息在发送者的手机上加密,到接收者的手机上才解开。服务器照样转发消息,却拿不到解密所需的密钥。如果只加密手机到服务器这段路,服务器仍能读到内容。要把转发消息的公司也挡在对话之外,保护就得从说话的人一直覆盖到听话的人。
为什么成立
网络把数据送对,接收程序仍能把文件存错。设想你把一份合同发给客户:传输毫无差错,客户电脑却在写入硬盘时损坏了文件。沿途设备都报告“我这一段没出错”,这些报告却覆盖不到最后的写入。
中间层缺少完整条件时,最终保证必须放在应用两端。这就是端到端原则。两端在哪里,由任务的完成标准决定。若目标是文件完整落盘,终点就是接收端存好的文件。若目标是订单被接受,终点就是商家的订单记录。中间层知道消息已转交,应用两端才知道什么结果算完成。
最终检查必须覆盖整条路径,并让失败触发补救。发送端先根据原文件算出校验值,作为比对依据。接收端存好文件后,再读出文件,重新计算校验值。双方比对结果,发现差错就重传,通过检查才报告完成。这轮检查能发现传输之后的存储差错,逐段检查覆盖不到那里。
中间层的检查值得保留,只要它能减少返工。链路发现坏包就立即重传,应用便能少重传整份文件。中间层因此改善效率,两端仍负责验收结果。
把应用专属的保证塞进公共网络,会让其他应用也付出成本。文件传输关心字节完整,订餐应用还关心菜品和地址。公共网络无法替每种应用判断任务是否完成。让应用保留最终检查,公共网络才能为不同任务提供共同的传输服务。
出处
端到端原则来自计算机网络与分布式系统。1981 年,杰罗姆·萨尔策、戴维·里德和戴维·克拉克提出这一论证。1984 年发表的修订版题为《系统设计中的端到端论证》。论文以可靠文件传输为经典案例:逐段传输正确,仍不足以保证接收端保存的文件正确。
换个领域看
商业
发推还不算下单
订餐内容要由顾客和餐厅核对,转发平台只能送消息。2015 年 5 月,达美乐在美国推出发披萨表情推文订餐。顾客先保存常用订单,发推后再收到达美乐的私信确认。Twitter 能证明推文已发布,达美乐和顾客才能确认这次要买什么,并完成下单。
投资
收益算到自己手里
投资结果要核对到自己实际赚到的钱。假设你年初投入一万元,年内没有追加或取出。年底基金份额值一万一千元,你还另付了一百元账户费用。基金涨了百分之十,你的净收益却是九百元。基金记录提供份额价值,你的账本补上额外支出,两头接起来才得到个人净收益。
个人生活
接到孩子才算完成
接送安排要确认到真正执行的人和实际结果。设想你请亲戚下午四点去校门口接孩子,托家人转告。家人回复“发了”,亲戚却仍以为是三点。让亲戚直接回复接送时间和地点,接到孩子后再报平安。中间人能证明自己传过话,你和亲戚才能核对安排与接送结果。
遇事时问自己
- 这件事做到哪一步才算完成,谁能直接看到结果?
- 中间层报告成功后,还有哪一步会把结果弄坏?
- 判断结果所需的信息,哪些只在发起者或最终接收者手里?
- 两端怎样核对结果,发现失败后由谁补做或重试?
- 中间层增加检查能省下多少返工,又让哪些使用者承担成本?
边界与误用
中间层缺少必要信息、或覆盖不到完整路径时,端到端原则才要求两端保留最终保证。最常见的误用是撤掉沿途检查:无线链路就地重传坏包,能减少整份文件重传。若任务只是保护某段线路,负责该线路的设备已有完整信息,就该在那里处理。两端的验证也只能保证约定的目标:手机被入侵,聊天明文会从手机泄露;原合同写错,完整传输仍会送达错误内容。跨领域使用时,应让掌握结果的人参与验收,同时保留服务方的交付责任。
练一练
公司更换员工权限系统。迁移程序已把旧配置送到新系统,并报告成功。但新系统会把某些岗位映射成权限更大的默认角色。项目约定:迁移后,每个人能访问的资料范围保持原样。
哪一步最能支持宣布迁移完成?
校验值一致能证明配置文件没有变。新系统如何解释配置,仍可能改变员工实际拿到的权限。
部门负责人熟悉人员和岗位,签字有助于发现清单错误。但清单正确不能证明系统实际授予的权限正确。
完成标准是实际访问范围保持原样。核对必须覆盖新系统解释配置后的结果,发现差异还要修正并再次验证。
账号和岗位齐全,容易让人觉得迁移没有遗漏。但同一个岗位名称,在新系统里可能对应更大的访问范围。
迁移程序知道配置已经送达,却不能据此保证员工最终拿到什么权限。端到端原则要求把原来的权限要求与新系统的实际结果接起来,差异修正并复核后才算完成。
你委托券商用一笔到期资金买入国债,目标是指定数量的债券登记到你的账户。页面显示“指令已送达”,但资金余额尚未减少,持仓也没有增加。券商提示,成交与持仓更新可能有延迟。
此时哪种判断最站得住?
购买是否完成,要核对到约定的账户登记结果。补救前还要查清原单状态,避免把显示延迟误当作失败。
明确的成功提示很容易被当作购买凭证。但它只证明指令送达,还没有证明成交和账户登记完成。
账户没有变化,看起来像什么也没发生。但更新可能延迟,直接重下单可能让两笔委托都成交。
成交通知比送达回执更接近结果。但这次目标还包括债券登记到账,成交记录没有覆盖最后这一步。
这次任务的终点是指定数量的债券登记到账,指令送达和成交都只是路径上的状态。最终核对需要覆盖这个终点;发现异常后,补救也要依据原委托的真实状态。
家中一段明管接头漏水。维修约定:更换后的这段管道,在规定压力下保持三十分钟不漏就算合格。师傅隔离该段两端,用压力表完成测试,并留下记录。你提出,必须等全家连续用水一周,才能验收这段维修。
对这个提议,哪种判断最站得住?
这次只需判断指定管段在规定条件下是否漏水,现场测试掌握了所需条件,也直接检查了结果。可以核对记录后验收。
实际使用让人更放心,也可能发现其他问题。但全家的用水情况涉及更多管段,不能替代这次约定的试压标准。
亲自检查能增加信心。但最终验收并不要求住户重复每项专业操作,覆盖约定条件的测试记录可以作为依据。
专业人员的责任和签字提供了追责依据。但责任承诺不能代替结果证据,是否合格仍应看试压是否满足约定。
端到端原则适用于中间环节缺少必要信息,或检查覆盖不到任务终点的情况。这次局部测试已经覆盖了约定目标,验收可以放在这里;把终点延伸到全家用水一周,反而改变了任务范围。