TCP和OSI
CYCLADES和X.25之争并非是70年代的个例,自70年开始到90年代TCP/IP最终胜利,计算机网络领域经历了旷日持久的Protocol War,这中间出现了大量曾经风靡一时但如今鲜为人知的网络协议,X.25只是其中的一个有点显眼的注脚而已。在讨论TCP和OSI之前,我感到比较疑惑的一个点是:为什么电信公司都要设计这样的网络设备,为什么如此强调线路的可靠性,为什么不在一开始采用网络拓扑?
如果我们在以往的电信网络设计中,传统上长途电话会先打到电话局,然后电话局之间交换要传递的信息,最终把信息交到我们的最终用户手上,因此每一条通话都有着明确且固定的路线。所谓的专线电话,就是各个电话局中你和目的地接口始终连接在一起,这样子你就在物理上独占了一个路线,这根电线可以从你家一直连接到几百公里之外一路畅通无阻。更重要的事情是,整个网络中具有计算能力的实际上只有电话局而不是你的电话机,这就默认了一个无法计算的终端机和一个有强大交换功能的交换中心——在小型机兴起之前,边缘设备一般都无法承担网络通讯的重任,因此端到端网络基本上不可能。
1960年代兴起的分组交换技术打破了这一点。分组交换好比是,一份电报可以分成多份,每份都可以经由不同的路线,这样就可以绕开一些过于繁忙的交换中心而利用那些虽然绕远路但是算力充裕的交换中心的设备,另外一点则是这种设计不需要设备有太大的存储需要。1960年代美国国防部的ARPANET试图让前线部队也可以和后方的数据中心保持联系,前线的美军不可能拿着可以充满一个房间的大型机到处跑,因此最多可以拉着台电台大小的小型机——1969年的ARPANET就已经成功实现了分组交换,通过分组交换实现了斯坦福和加州大学洛杉矶分校之间的通讯。他们使用的设备为Honeywell DDP-516,体积相当于一台家用冰箱,内存只有24KB,每台造价约8万美元,专门用作实验室大型机外接专门处理网络信息的设备(相当于大型机外接小型机充当网卡);这也是因为但是网络十分不可靠,如果大量网络错误涌入大型机则会导致昂贵的大型机崩溃,因此小型机充当了这中间的缓冲。作为大型机的网络管家,小型机拿到24KB的信息之后立即去检验,检验不成功机会丢弃要求重传,成功了才会去查询维护路由表,等待线路有空后转交给所制定的大型机。然而,这个实现远远达不到美军的目标:美军在前线不仅缺乏计算机,还有这多样化的网络连接方式,不仅仅是无线电还有早期的卫星网,一个实验室显然无法控制美军如何使用无线电和卫星,也无法控制中间网络的可靠性,那么只能在网络本身不可靠的基础上建立可靠性。
CYCLADES所使用的也是一种称之为Mitra II的小型机,这种机器相较DDP-516更小,但是CPU频率和内存容量更大,因此这个网络系统也被称作Mitranet。Mitra II不会去检验设备收到的信息到底是不是可靠的,传入的数据不会在缓冲区内检验,它的缓冲区的作用在于等待线路有空之后立即转发,如果缓冲区满了就要立即丢弃数据(没有多余的动作)。这种思路和现代的路由器思路一致,存储的大部份只需要用来维护路由表,算力也不需要用来校验临时存储的数据而是像接着烫手山芋一样急忙查找路由表直接扔出去。同时,我说了防止网络拓扑的环路,这种数据包也加入了类似TTL的跳数限制机制。这种小型机让边缘节点的计算变为可能,而分组交换、端对端检验的设计也令计算机网络的计算、存储负担降低,实际上如今的家用路由器其实也就是运行者定制化操作系统的电脑而已。1972年ARPANET团队和CYCLADES团队齐聚华盛顿举办的第一届国际计算机通信会议(ICCC),主导ARPANET网络技术的Cerf和Kahn则对CYCLADES的网络设计印象深刻,从而启发了ARPANET的TCP技术研发。
TCP协议取代OSI协议
1974年Cerf和Kahn发表了开创性论文《分组网络互联协议》(A Protocol for Packet Network Intercommunication),这篇论文奠定了TCP协议的基础。1976年开始,TCP协议被用于SATNET、PRNET和ARPANET的三网胡同协议。这几个网络有着不同的特征,ARPANET是其中最稳定的,PRNET则是湾区的高丢包率无线网络,SATNET则是跨大西洋的卫星通讯网络,单程延迟可以达到0.25秒。由于三网MTU不匹配,每次传输之后在路由设备重组极大拖累了设备处理效率;TCP的超时重连也导致了卫星通讯的不稳定,如果TCP超时时间太短则会导致卫星不断收到重连的指令,拖累之后数据的传输。三网互通后,军方对于数字加密通话提出了新的问题:基于TCP通讯的网络通讯不流畅,如果丢失了语音包之后就会出现巨大的滞后——所以TCP的重传机制被剥离,形成了只包含寻址信息的IP协议,而基于IP协议UDP协议成为了语音通讯的主要手段。同时,IP协议也正式从TCP协议中剥离出来,TCP只需要管理控制,而IP专门用于寻址。
OSI协议的历史则要更加复杂。自1974年德斯坦当选法国总统以来,CYCLADES这个项目受到了政府的冷落,德斯坦政府更加青睐于基于X.25的国家工程而不是研究所中的不可靠协议,因此普赞和齐默尔曼都在尝试为CYCLADES寻找出路。1974年开始,CYCLADES团队和ARPANET团队合作希望协商决定将来的OSI协议的细节,齐默尔曼对于最初的TCP协议不满意的地方在于MTU应该如何切分,他强调MTU应该只有在终端的时候重组,运输过程中不需要重组。这场协商的结果是INWG96提案,由于提案超过了CCITT(国际电报电话咨询委员会)的1975年最后提案期限,委员会中的各国代表也不在意这个“不可靠的”协议而是转向了X.25,ARPANET的Bob Kahn则对提案投了弃权票——虽然同情这个提案,但是ARPANET并不指望一个遥遥无期的国际共识,将会没有国际协商的情况下自己制定TCP协议,促进端对端网络项目的落地。由于会议是4年一次,齐默尔曼等人认为再等4年是不太可能的,于是找到了ISO组织促进这个电信行业标准的制定——CCITT也不得不参与进来。
如何提出问题则是比如何解决问题更为重要的技能。如果这个时候齐默尔曼直接提出OSI的设想,那么CCITT则完全可以拿既有标准搪塞——一个微不足道的科学家如何面对欧洲各国的电信利益集团的官僚机构?既然一个人挑战不可行,那么就必须要有盟友和共同利益——齐默尔曼的分层架构成功的将计算机网络这件事和电信厂商、计算机厂商联系在一起,这件事不再是电信运营商一个行业的事情,甚至也不是欧洲自身的问题,而是涉及到电信运营商和计算机厂商之争、美国计算机产业和欧洲计算机产业之争、IBM和反IBM的计算机厂商之争——这也决定了这个标准的制定不可能平静。OSI对计算机厂商承诺,OSI将会提供非私有的、通用的接口标准,这样大量非IBM设备厂商也可以在共同的标准下和IBM共同竞争。OSI也对欧洲各国的政府有着极强的吸引力,如果支持OSI的标准则可以帮助本国的计算机厂商对抗如日中天的IBM及其代表的美国计算机产业。作为回应,IBM也不得不派出庞大的代表团参与OSI的每一个层级,极力在OSI中维护自己的标准,激烈的斗争客观上扩大了OSI的影响力。可以说,齐默尔曼等人拼接一己之力将一个电信行业内部的简单技术问题转化为一个复杂的政治经济问题,并为OSI标准的普及奠定了基础。
在围绕OSI的混战之后,ISO最终在1980年推出了OSI的最初方案,这个时候已经距离TCP协议出现过了6年,这个时候TCP/IP协议已经经过了4个版本的迭代,并应用在美国国防部以及跨国学术网络中。1984年,UNIX系统将TCP/IP协议集成到系统中,极大扩大了这个协议的影响力。也正如Bob Kahn所预料,OSI模型这个伟大的工程经过了各方利益博弈之下一直难以落地,与其相信欧洲人的开放民主而又遥遥无期的共识,不如自己先干出一个垃圾出来再逐步改进。欧洲人曾经相信一个基于OSI的欧洲网络系统,可以和TCP/IP协议所支持的Internet相抗衡,直到1989年ISO仍然是没有落地的协议,最终随着基于Internet的万维网的爆发,欧洲人的OSI也就失去了最后的机会。
