Apache源代码全景分析(第1卷):体系结构与核心模块
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 WWW概述

WWW英文全称World Wide Web,也称万维网,它是目前Internet上最为流行的技术。WWW给用户带来的最大便利就是任何时候只要用户能够访问Internet并且安装了IE等浏览器(通常会随操作系统一起提供),就可以使用WWW。目前WWW已经成为人类最大的信息资源中心。

在了解WWW之前,我们有必要回顾WWW的发展历史。

本章从两个重要的方面来讨论WWW的发展历史:首先是整个Internet的发展历史,它是整个网络的基础;其次是HTTP协议,它是构成整个Web的协议基础。

图1-1展示了在整个WWW发展史上的一些重要的里程碑:

图1-1 WWW发展历史上的一些重要的里程碑

下面我们将结合图1-1简要介绍整个WWW的发展历史。

1.1.1 Internet概述

1957年,前苏联发射了第一颗人造地球卫星Sputnik。针对此事,美国在国防部内部组成了高级研究计划署(Advanced Research Project Agency,ARPA),从而确保美国在军事应用方面的科技领先优势。1969年,美国国防部构建了ARPANET网络(见图1-2),从而进一步推进了网络的研究,并创建了4个最初的网络节点:洛杉矶的加利福尼亚大学(UCLA)、斯坦福研究院(SRI)、圣巴巴拉的加利福尼亚大学分校,以及犹他州立大学。

图1-2 初始的ARPANET网络

最初的ARPANET 网络包括了一条50Kbps 的专线并使用网络控制协议(Network Control Protocol,NCP)进行通信,这是第一个主机对主机的通信协议。随后,越来越多的计算机加入到ARPANET网络中,用于讨论和归档ARPANET使用的协议和软件的几百个RFC(Request For Comments)和Internet草案也随之产生了。1974年,Vint Cerf和Bob Kahn发布了基于包技术的网络互联协议,该协议详细描述了TCP(Transmission Control Program,传输控制程序)的设计细节。1984年,TCP协议又被分割为两种协议:传输控制协议(TCP)和Internet协议(IP)。

1982年,美国国防部对外宣称TCP和IP(目前统称为TCP/IP)这两个协议为它的官方协议,国防部的声明形成了最早的Internet定义,它通常是指一系列相互连接的网络,尤其是使用TCP/IP协议的网络。

1983年,ARPANET也从最初的NCP协议切换到TCP/IP协议,这样,最早的Internet就诞生了。在随后的几年中,网络经历了爆炸式的发展:1984年,全球接入Internet的计算机数目超过了1 000台;1987年,这个数目达到了10 000台;到了1989年,则达到了100 000台;1992年为1 000 000台;1996年为10 000 000台;1999年的时候就已经达到43 000 000台。今天(2009年),全球接入Internet的计算机数目更是达到了上百亿台。这种快速增长的趋势目前仍然在继续。

1.1.2 超文本的概念

与Internet的诞生相比,超文本的概念出现得更早,它最早可以追溯到1945年。范尼瓦·布什于1945年发表了文章《按照我们的想象(As We May Think)》呼唤在有思维的人和所有的知识之间建立一种新的关系。为此他提出创建一种被称为“memex”的设备,在其中每个人都能把他所拥有的各种信息(比如图书)保存起来。由于条件所限,范尼瓦·布什的思想在当时并没有变成现实,但是他的思想在此后的50多年中产生了巨大影响。人们普遍认为超文本的概念源于范尼瓦·布什。

尽管超文本的思想很久之前就存在,但是超文本这个词汇一直到 1965 年才被 Xanadu项目的Ted Nelson提出来。后来,超文本一词得到世界的公认,成为这种非线性信息管理技术的专用词汇。1999年国际超文本大会设立的新人奖即以Nelson的名字命名。

后来,布朗大学(位于Rhode Island)的Andries van Dam于1967年开发了超文本编辑系统(Hypertext Editing System,HES)及文件获取和编辑系统(File Retrieval and Editing System,FRESS)——这是最早的真正超文本应用。1968年,Douglas C. Engelbart(大多数人知道的就是他于1963年发明了计算机鼠标)在加利福尼亚州的圣弗朗西斯科举办的FJCC (Fall Joint Computer Conference)会议的一次多媒体会议中演示了他的NLS,这是一种在线系统(onLine System),后来命名为Augment系统(Augment System)。NLS中已经具备了若干超文本的特性。此外,Douglas C. Engelbart还发明了鼠标、多窗口、图文组合文件等,甚至可以说是他发明了超文本。1999年国际超文本大会设立的最佳论文奖即以Engelbart的名字命名。

在这次先锋性的事件之后,许多类似的系统相继涌现出来,这些系统无不深受超文本主义的影响,包括1975年卡耐基·梅隆大学的ZOG,1978年MIT大学的Andy Lippman的白杨树镇电影地图(Aspen Movie Map)系统,1984年Telos的Filevision,1985年Janet Walker的工作站连接手册(Symbolics Document Examiner),1985年布朗大学的Norman Meyrowitz的Intermedia,等等。

1987年,Apple公司推出了HyperCard(超文本卡),HyperCard是20世纪80年代末期世界上最流行的超文本系统。从1987年到1992年,Apple公司随每一台销售出去的机器赠送一套HyperCard。HyperCard的流行使超文本的基本概念得到了普及,结束了超文本仅仅作为研究主题的状况,被广泛接受为一种新技术,并且在应用开发特别是教育系统的开发方面起到举足轻重的作用。Hyper-Card被认为是计算机历史上的里程碑,以及教育软件的范例。

第一次国际超文本技术研讨会于1987年11月13日至15日在美国的北卡罗来纳州的查布尔希尔(Chapel Hill)召开。这个会议的召开标志着超文本已经受到广泛的关注,正在形成一个新的领域。

1.1.3 WWW的历史

早在1965年,Ted Nelson就率先提出了“超文本”的概念,并在1967年把相应的实现计划命名为“Xanadu”。该项目于1987年才算完成,只不过当时只能运行在一个SUN工作站上,而且功能非常简单粗糙,同时该项目被重新命名为“Conklin”。

1989年3月,CERN(欧洲粒子物理实验室)的Tim Berners-Lee(Tim B.L)写了一篇名为“信息管理的建议(Information Management:A Proposal)”的文章,其中他试图给出“How will we ever keep track of large projects?”问题的答案。

在得到 Tim Berners-Lee 的老板 Mike Sendall 的同意之后,Tim Berners-Lee 开始基于NeXTStep开发环境开发一个超文本图形的浏览器和编辑器。Tim Berners-Lee将这个程序命名为“WorldWideWeb”,稍后又将其重新命名为“Nexus”,从而避免应用程序和抽象信息空间之间的相互混淆。两个月之后,项目开发完成,这个“WorldWideWeb”也迅速成为第一个超文本系统,同时公众也开始接受“WWW”。

欧洲粒子物理实验室(即CERN)的Tim Berners-Lee受到Nelson的影响,提出一项计划,目的是使科学家们能够很容易地查询同行的文章。该项目从 1990 年 10 月开始到同年12月完成。项目的最终成果就是形成命令行方式的浏览器和NeXTStep浏览器,该浏览器能够浏览超文本文件及CERN的USENET。1992年7月,WWW在CERN内部被广泛使用。直到1993年1月,全世界共有30台WWW服务器,并有多个浏览器版本发行。之后,超文本概念及它在Internet上的使用得到了进一步的发展。

整个WWW可以从四个方面进行描述:HTML标记语言、HTTP通信协议、WWW 客户端的发展,以及WWW服务器端的发展。本章我们只简要了解WWW客户端和服务器端的发展,关于HTML和HTTP协议相关的内容可以参考相应的RFC文档。

HTML标记语言

HTML作为定义万维网的基本规则之一,最初由Tim Berners-Lee于1989年在CERN研制出来。HTML的设计者是这样考虑的:HTML格式将允许科学家们透明地共享网络上的信息,即使这些科学家使用的计算机差别很大。因此,这种格式必须具备如下几个特点。

■ 独立于平台,即独立于计算机硬件和操作系统。这个特性对各种系统是至关重要的,因为在这个特性中,文档可以在具有不同性能(即字体、图形和颜色差异)的计算机上以相似的形式显示文档内容。

■ 超文本。允许文档中的任何文字或词组参照另一文档,这个特性将允许用户在不同计算机中的文档之间及文档内部漫游。

■ 精确的结构化文档。该特性将允许某些高级应用,如 HTML 文档和其他格式文档间互相转换,以及搜索文本数据库。

Tim Berners-Lee选择使用标准通用标记语言(Standard Generalized Markup Language, SGML)作为HTML的开发模板。作为一种当时刚刚出现的国际标准,标准通用标记语言具有结构化和独立于平台的优点。

自1989年以来,HTML及万维网的使用和发展有了巨大的变化。当NCSA(National Center for Supercomputing Applications,美国国家超级计算机应用中心)在1993年初首次构建Mosaic浏览器时,NCSA的科学家们把自己需要的特性添加到HTML中,包括直接插入图形。在允许人们把位图、照片和图表放入文档中以后,万维网的规模和使用出现了爆炸性的增长,第二年,HTML 的发展很快。HTML 的新标记不时地被一个又一个的浏览器引入,有一些新标记流行起来,而有一些又消失了。有些增加部分设计得很糟,很多甚至不遵从SGML规范。

到了1994年,HTML几乎在以失控的状态发展。在IETF(Internet Engineering Task Force)的主持下,1995年11月在瑞士日内瓦举行的第一次WWW会议上成立了一个HTML工作小组。它的主要任务是把HTML形式化为一种SGML DTD,并称之为HTML Level 2(HTML 2.0,由本尼斯李最初设计的HTML被定义为Level 1)。标准化之后,HTML就可以被安全地扩展到将来的各个级别的版本,从而利用了SGML的实质性能和它的格式化结构。

尽管有关各方从来没有取得完全一致的共识,但万维网联盟HTML工作组(World Wide Web Consortium’s HTML Working Group)还是集中了1996年的万维网发展的成果,产生了HTML 3.2版本。目前HTML已经发展到了4.0版本。

客户端的发展

客户端的发展受制于两方面的因素:超文本标记语言(HTML),以及呈现给终端用户使用的浏览器,只有通过浏览器才能将HTML数据显示在桌面上。

1990年11月,一位来自莱斯特工艺学院(Leicester Polytechnic,现德蒙特福德大学De Montfort University)数学系的实习生妮可拉·派罗(Nicola Pellow)加入了Tim Berners-Lee的工作组,共同参与首个浏览器WWW的开发。

1991年3月,世界上首个浏览器WWW问世,但是这个浏览器只能运行在NeXT平台下。几乎在同时,为了解决跨平台使用的问题,Nicola Pellow以WWW浏览器为基础开发了一款命令行式浏览器,并且给它取了个简单的名字Line-Mode Browser。这个名字如果翻译成中文就是“命令行浏览器”,所以也可以说她干脆没有取名字。在这之后,一系列的浏览器蜂拥而出,如表1-1所示。

表1-1

但是这些浏览器的影响远不如Mosaic。1993年2月伊利诺伊大学Urbana-Champaign分校的国家超级计算应用中心NCSA(National Center for Supercomputing Application) 推出了Mosaic浏览器的第一个稳定的版本。当时命名为NCSA Mosaic for X 0.10 available ,这便是世界上第一个图形化的浏览器。9月,NCSA的Aleksandar Totic完成了Macintosh版本的开发,这也使Mosaic成为了第一个跨平台的浏览器。Mosaic浏览器在继承前人成果的基础上,不仅能够处理基本的文档共享和链接,而且还支持多种网络协议及 MIME 协议,用户在浏览器中就可以直接浏览图形甚至声音。因此,Mosaic 一经发布出来就立即成为互联网上使用最多的应用程序。基于 Mosaic 浏览器,Netscape 公司发布了著名的网景浏览器 Netscape Navigator,它曾经占据了半数以上的桌面。到了现在,大部分人都知道占有率第一的已经不是Netscape Navigator,而是IE。Mosaic则转向了全部开源,目前基于Mosaic浏览器的FireFox浏览器已经让IE腹背受敌。

服务器的发展

与客户端的精彩万千、丰富有趣的改进相比,服务器端的变化要平淡得多。整个服务器的发展历史基本上就是Apache发展的历史。

Tim Berners-Lee在1991年开始编写CERN HTTP服务器,1993年和1994年Ari Luotonen及Henrik F. Nielsen也加入了进来,这是世界上第一个真正的Web服务器。1993年,Tony Sanders使用Perl编写了一个Web服务器并取名为Plexus,与此同时,美国国家超级计算机应用中心(NCSA)的Robert McCool使用C语言编写了一个完整的应用程序NCSA httpd,这是世界上第一个具备完整的Web服务器功能的Web服务器。

在后来的两年中,NCSA httpd服务器变得非常流行。但在McCool于1994年离开了NCSA之后,httpd的开发和维护工作就被停止了。而人们对httpd的需求却在继续,为了满足自己的需要,不同的人都会在httpd中打上自己的补丁。后来,一些人为了能够相互之间交换补丁,便开始有意收集这些补丁。

1995年,Brian Behlendorf及其他的一些开发者形成了一个小组开始着手收集NCSA服务器的各种补丁并保存到一个中央库中。最初的Apache工作组使用NCSA服务器作为基础,并且努力对其进行改善,一方面,他们对所有的已经公开的漏洞和缺陷提供补丁方案,另一方面,他们也增加了许多看起来很有用的增强功能。当在他们的服务器上测试了这些工作之后,1995年的4月,他们发布了第一次的官方版本,版本号为0.6.2,同时取名为Apache,意思为这个服务是一个打了各种补丁的服务器(A PAtCHy sErver)。与此同时,NCSA也重新开始了它的服务器开发工作,为了确保在两个产品中获得尽可能好的质量,NCSA的两个开发人员也加入到了该开发团队中,以共享思想和补丁程序。

与此同时,这个小组对外的正式名称为Apache组织,不过他们与一般的组织并不相同,他们没有正规的组织结构,也从来不见面,他们之间仅仅是通过电子邮件进行沟通,而且工作仅仅是在他们空闲的时间,并且完全是自愿的,没有任何回报的。第二年,Apache就超过NCSA成为Internet上最广泛使用的Web服务器,目前为止它的市场占有率达到60%左右,而微软的IIS也仅仅为30%,其余各种Web服务器共占10%的市场份额。另外,在UNIX市场上, Apache占有绝对的优势,占有率达到95%左右,而IIS则仅局限于Windows市场上。

尽管Apache的0.6.2版本获得了非常大的成功,但是所有的开发人员都意识到这个服务器的设计不可能长久地被使用。因此他们采取了两手并行的策略:一方面,对新的版本0.7.x继续进行开发,它们基于0.6.2的体系结构;另一方面,Robert Thau开始负责设计新的体系结构,这个新的服务器体系结构中包含了众多的现在众所皆知的特性,比如模块化结构、基于内存池的分配策略等。开发小组在1995年7月转移到这个新的代码基址,并且为其增加了所有已经添加到0.7.x分支的特性。1995年8月,这个版本以0.8.8发布。在将这个代码基址移植到更多的平台,编写了一组新的文档而且以更为标准化的模块形式增加了一些特性之后,Apache的1.0版本在1995年12月发布。

在1996年7月,Apache 1.1版本发布,在该版本中包含了大量的性能改善,并增加了一些新的特性,比如缓存代理模块。尽管这个模块并没有得到很好的维护,其中的一个问题直到2.0版本才得到彻底的解决,不过很多用户还是将Apache作为简单的代理服务器使用。这个版本中还包含了使用一个服务器实例侦听多个端口的能力。

下一个版本就是Apache 1.2,它包含了对HTTP/1.1,以及作为特定用户运行的CGI脚本的支持。在这个版本之后,Apache工作组开始讨论2.0的新的特性集合。

不过Apache 1.2并不是最终的1.x版本。1998年5月,Apache组织发布了1.3版本。与前几个版本相比,1.3最大的变化就是增加了对Windows平台的支持,遗憾的是,1.3系列中并没有对Windows移植进行足够的优化,因此Apache在Windows下的运行性能并不高。不过对于Unix平台而言,Apache 1.3是相当稳定的版本,即使到现在,Apache 1.3也还有相当高的使用率。

2000年的时候,推出了Apache 2.0版本,该版本的推出历时三年,整个体系结构发生了巨大的变化,引入了许多新的特征。Apache 版本更新的速度非常地缓慢,直到八年后的今天,它的最新版本才是Apache 2.3。到目前为止,Apache 2.0系列已经渐趋稳定,使用率正在逐步提高。

在2000年3月的Apache会议上,Apache 2.0 Alpha 1版本发布,Apache 2.0对整个服务器的体系结进行了完全重新的设计。Apache 2.0中将操作系统相关的细节封装到适配层APR (第3卷详细讨论)中,这样与Apache 2.0以前的版本(主要是Apache 1.3)相比,2.0版本更加容易移植到不同的操作系统平台中。更加令人惊讶的是,Apache 的模块化体系结构如此之强,以至于Apache 2.0可以作为一个通用的服务器平台而出现,而不仅仅是作为Web服务器,实现这种功能只需要在Apache核心模块上添加特定的模块即可。