本文很短,就几句话。
互联网之所以发展迅速,得益于端到端原则:
- 保持一个极简的核心,将复杂留在端。
道理很简单。
核心若不极简,互联网将无法适应变化。随着接入节点的增加,核心的负担将指数增加,互联网规模终将停滞。
全文完。以下是后序。
写在后面
网络是分布式的,要实现一个网络功能时,需要选一个部署它的位置,换言之,是在转发节点实现还是在端节点实现。
计算机技术的发展让端越发智能,各类应用的蓬勃是迟早的事,它们对网络的需求各自不一。
以可靠传输为例,若在网络中心实现逐跳可靠传输,必然需要在每一跳记录状态,随着新节点的接入,状态记录将指数增长,转发节点终将不堪重负而崩溃。在中心实现其它需求,结果亦然。
简言之,在中心实现网络需求,没有可扩展性,无法适应变化,而唯一不变的是变化本身。
拥抱变化的取向迫使端到端的需求在端到端实现。否则,互联网甚至无法起步,更别提发展。
就这一点足以确定互联网的架构,其余的都是结果。
先看成本因素,遵循端到端原则是最划算的。
网络核心实现的任何功能,其代价均是全局的。网络核心是所有通信必经之处,任何一个功能,均会对途径的所有数据包进行额外操作,哪怕改功能并不是所有应用必须的。无论该功能软硬件设施所需的金钱,还是额外操作所损耗的时间,都是净损耗。不划算。
再看完备性,遵循端到端原则最完备。
网络核心实现的所有功能,必须满足所有端到端需求的全集,但端到端需求是不断变化的,因此在任何时间点均不存在完备的全集。若实现一个子集,那么实现谁忽略谁将造成不公平。网络核心无法满足全集,又不能简化实现功能子集,端到端需求在端到端满足便是必然。
最后看透明性,遵循端到端原则是保持端到端透明的唯一方式。
网络核心实现的功能,必然涉及对数据包的写操作,比如逐跳的可靠性保证,数据包的目的地永远是下一跳,源则是当前节点,源和目标在网络传输路径上不断变化,端到端的源和目标不再保持。若将功能实现在端,对于应用而言,就好像网络根本不存在一样。因此,端到端原则保持了最佳的透明性。
最终,网络核心只保留不得已而必须的传输功能,它极简,无状态,因此只能“尽力而为”,“逐跳传输”。无论是尽力而为还是逐跳传输,都是端到端原则的必然结果,现实中,这个核心就是IP协议。IP一点也不多,一点也不少,它是系着两个罐子的那根细绳子。
简单说说TCP/IP分层。它也是端到端原则的结果。
TCP/IP一开始并不是分层协议族,它是一个端到端的TCP协议,按照端到端的原则做了减法之后,IP协议分离了出来,这个分离来自于一个减法原则:“网关在搬移数据包时是否需要这个信息,若不需要,那这个信息就不该放入IP”。
这个减法将TCP变成了一个双层协议,TCP/IP。所有使用TCP/IP的上层,便生成了TCP/IP协议族。
IP是个极简协议,它只读(TTL字段只是一个增强),无状态,路由器只看目标地址即可完成转发。
分层协议族的演化表明互联网不是设计规划出来的,而是进化出来的,这个和近乎完备的ISO/OSI完全不同。
端到端原则的核心产物便是分布式路由了。
极简的IP协议唯一特征是全局编址,互联网所有节点组成了一张图,每个节点由一个IP地址标识,所有节点通过与邻居交换信息执行分布式算法,每个节点均会生成一张路由表,节点依照这张路由表执行数据包转发,由于IP是无状态的,转发必然是逐跳的,每个节点均无全局信息,却能将数据包按照最短路径送达目标,大雅。
端到端原则似乎是绝对正确的,事实果真如此吗?
回顾从阿帕网经TCP/IP诞生到现代互联网的历史,我注意到一个转折点。我在之前的文章中也提到过:
- 让网关作为一个信使而不是一个代理是一个好主意,这使网关的工作变得简单,只需转发数据包而无需拆解它。
仔细一想,这个说法是依赖拓扑的。早期对网络的假设和现在完全不同。早期的假设是,所有节点组成一个P2P对等网络。所有节点是平等的。然而现代互联网却并非如此。
我们来看CDN,CDN网络的cache节点,它既不是源节点,也不是目标节点,逻辑上,它位于网络核心,“让网关作为一个信使而不是一个代理是一个好主意”便错了,cache节点显然要理解数据,它不仅仅要做信使,还要做代理把信拆开。
这属于对端到端原则的补充还是破坏?
早期的P2P假设将网络视为一个对等通信的场所,类似于朋友之间的交流,直到现在我们的社交应用依然符合这种假设,除此之外,人们还将网络视为获取资源的场所,类似于卖场购物,图书馆借书,CDN网络便应运而生。在CDN网络中,中间节点变复杂了,这属实是一种对端到端原则的补充。
然而如何将源站的端到端特征透明传输到客户终端,给中间cache节点带来很大的挑战。cache节点因此变得复杂无比,它需要理解各类源站的端到端特征,似乎它正朝向端到端原则的反面。
除了CDN,数据中心网络亦是端到端原则的反动。各类源抑制,反压机制在交换机上完成精细化的加速,拥塞控制,端主机反而变得简单,省下本应该处理端到端逻辑的资源用于计算业务。数据中心网络核心越发复杂,而端主机越发简单,就像一根玉米棒子两端沾着两粒玉米粒。
想多了,哪有什么普适原则。
端到端原则的最佳实践就是可扩展性,适应变化,它制造了互联网的繁荣。CDN也好,数据中心也好,均是领域网络,它们并没有全球繁荣的所需,CDN仅调度资源到用户家门口,数据中心仅局限在百米范围,与全球互联网完全不同。
因此,适应的才是最好的。
最后,我做一个对比,铁路和公路。本来我想用TCP/IP网络和传统电信网络直接说的,可最终觉得还是铁路和公路最合适。
铁路属于中心控制,复杂性在路网而不在火车,火车只保有启动,加速,刹车,鸣笛等简单功能即可。
公路属于分布式控制,复杂性在汽车而不在公路,公路只保持平整的路面即可。
试问,哪一种路更容易扩展,更适应变化?
先看铁路,新加入一列火车,或者新接入一段铁路,必须对既有牵扯到的时间表调度做完全的调整,每次铁路新增列车,提速,都伴随着巨大的调整,所谓牵一发而动全身。
再看公路,无论是经理新买了一辆新车上路,还是某处新修了一条路,什么都不用改变。汽车属于端到端逻辑,而公路只是一个极简的通道。
铁路对变化的反应是强烈的,随着列车和路网的扩张,反应烈度是指数级增加的。
公路对变化是无感的,各类新车在增加,各类旧车在淘汰,路有新修和拥堵,但几乎不会有任何感觉。
浙江温州皮鞋湿,下雨进水不会胖。