万维网[www.w3.org I,Berners-Lee 1991]是一个不断发展的系统,用于发布和访问互联网上的资源和服务。通过常用的Web浏览器,用户可以检索和查看多种类型的文档、收听音频文件、观看视频文件、与无数服务进行交互。Web是1989年在瑞士的欧洲原子能研究中心(CERN)诞生的,作为通过互联网连接的物理学家社区中间交换文档用的工具[Berners-Lee 1999]。Web的一个关键特征是它在所存储的文档中提供了超文本结构,超文本结构反映了用户对组织知识的要求。这意味着文档包含链接(或超链接),链接指向其他存储在Web上的文档和资源。对Web用户来说,当他们遇到文档中的一幅图像或一段文字时,它很可能伴有指向相关文档和其他资源的链接。链接的结构可以任意复杂,可加入的资源集是无限的,即链接的Web确实是世界范围的。Bush[1945]在50年前就设想出了超文本结构,互联网的发展使得这个想法能在世界范围内得到证实。Web是一个开放的系统,它可以被扩展,并且在不妨碍已有功能的前提下用新的方法实现扩展(见1.5.2节)。首先,它的操作是基于被自由发布和广泛实现的通信标准和文档/内容标准的。例如,浏览器的类型是多种多样的,在多数情况下,每种浏览器可以在多个平台上实现;有多种Web服务器的实现。一种构造的浏览器能从不同构造的服务器中检索资源。所以,用户能访问大多数设备(从移动电话到桌面计算机)上的浏览器。其次,相对于能在其上发布和共享的资源的类型而言,Web是开放的。在Web上,最简单的资源是一个Web页面或其他能提交给用户的内容,如媒体文件和PDF格式的文件。如果有人新发明了一种图像存储格式,那么这种格式的图像能马上在Web上发布。用户需要一种查看这种新格式图像的工具,而浏览器以“帮助者”应用和“插件程序”的形式来支持新的内容显示功能。Web的发展已超越这些简单的数据资源而开始包含服务,如电子化的商品购买。Web一直在发展,但其基本的体系结构没有改变。Web基于以下三个主要的标准技术组件:
超文本标记语言(HyperText Markup Language,HTML)是页面在Web浏览器上显示时指定其内容和布局的语言。统一资源定位器(Uniform Resource Locator,URL),也称为统一资源标识符(Uniform Resource Identifier,URI),用于识别文档和保存成Web一部分的其他资源。具有标准交互规则(超文本传输协议,HTTP)的客户-服务器系统体系结构,浏览器和其他客户可利用标准交互规则从Web服务器上获取文档和其他资源。图1-7给出了一些Web服务器和向它们发送请求的浏览器。用户可以定位和管理位于互联网上任何地方的他们自己的Web服务器,这是一个很重要的特征。接下来我们依次讨论这些组件,并解释用户获取Web页面并单击页面上的链接时,浏览器和Web服务器的操作。HTML 超文本标记语言将这些内容[www.w3.org Ⅱ]用于指定组成Web页面内容的文本和图像,指定它们以何种布局方式和组织方式将这些内容显示给用户。Web页面包含结构化的成分,如标题、段落、表格和图像。HTML也用于指定链接和与链接相关联的资源。用户可使用标准的文本编辑器手写生成HTML,或用能识别HTML的“所见即所得型”编辑器,这种编辑器能根据用户以图形方式创建的一个布局生成HTML。下面是一段典型的HTML文本:
这段HTML文本保存在一个Web服务器可以访问的文件中,不妨称之为earth.html文件。浏览器从Web服务器中检索这个文件的内容,本例中是一个位于名为www.cdk5.net的计算机上的服务器,浏览器读取从服务器返回的内容后,把它变成格式化的文本和图像,以大家熟悉的方式放到Web页面上。只能由浏览器(不是服务器)解释HTML文本,但是服务器确实通知了浏览器它所返回的内容的类型,用于区分html文件和其他文件例如PDF文件。服务器能从文件的扩展名“.html”中推断出内容类型。注意,HTML的指令(即标记)放在尖括号里,如
。例子中的第1行确定了一个包含图片显示的文件,图片的URL是http://www.cdk5.net/WebExample/Images/earth.jpg。第2行和第5行的指令分别表示段落的开始和结束,第3行和第4行包含要在Web页面上以标准的段落格式显示的文本。27第4行指定了Web页面上的一个链接。它包含词“Moon”,该词位于两个匹配的HTML标记和中间。这些标记之间的文本在Web页面上显示时是以链接的形式出现的。大多数浏览器在默认情况下给链接的文本加下画线,所以,用户看到的上面的段落将是:Welcome to Earth!Visitors may also be interested in taking a look at the Moon.浏览器记录了链接的显示文本和包含在标记中的URL之间的关联,在这个例子中是:
当用户单击文本时,浏览器获取由相应URL识别的资源,并将它显示给用户。在这个例子中,资源是一个HTML文件,它指定了关于月亮的一个Web页面。URL 统一资源定位器[www.w3.org Ⅲ]的作用是识别资源。在Web体系结构文档中使用的术语是统一资源标识符(URI),在不引起混淆的前提下,本书使用更为人们所熟悉的术语URL。浏览器检查URL以便访问相应的资源。有时用户在浏览器中输入一个URL。更常见的方式是用户单击一个链接或选择一个书签,由浏览器查找相应的URL;或当浏览器去取一个Web页面里的内嵌资源(如一个图像)时,由浏览器查找相应的URL。按绝对完整的格式,每一个URL有两个顶层的组成部分:模式:模式特定的标识符第一个成分“模式”声明了URL的类型,要求URL能识别各种资源。例如,mailto:joe@ anISP.net标识出一个用户的电子邮件地址;ftp://ftp.downloadIt.com/software/aProg.exe标识一个用文件传送协议(File Transfer Protocol,FTP)获取而不是用更常用的HTTP协议获取的文件。模式的其他例子有“tel”(用于指定一个要拨打的电话号码,在移动电话上浏览时特别有用)和“tag”(用于标识一个任意实体)。利用URL中的模式指示器从Web可访问的资源类型的角度来说,它是开放的。如果有人发明了一种新的有用的“widget”资源——可能用它专有的寻址方案定位widget,用它专有的协议访问widget——那么大家就能使用widget:...格式的URL。当然,浏览器必须具备使用新的“widget”协议的能力,这一点可通过增加一个插件实现。HTTP URL是使用最广泛的,它利用标准的HTTP协议访问资源。HTTP URL有两项主要的工作:识别出哪一个Web服务器维护资源;识别出该服务器上的哪些资源是被请求的。图1-7显示了三个浏览器发出请求,而被请求的资源由三个Web服务器管理。最上面的浏览器向一个搜索引擎发出查询,第二个浏览器请求另一个Web站点的默认页。最下面的浏览器请求一个指定了全名(包括了相对于服务器的路径名)的Web页面。Web服务器的文件保存在服务器文件系统的一个或多个子树(目录)下,28每一个资源用相对于服务器的路径名识别。通常,HTTP URL具有下列格式:http://服务器名[:端口][/路径名][?查询][#片段]其中方括号中的项是可选的。一个HTTP URL全名总是以“http://”开始,后跟一个服务器名,该服务器名表示成一个域名系统(Domain Name System,DNS)名字(参见13.2节)。服务器的DNS名后面可以选加服务器监听请求的“端口”号(参见第4章),默认端口号是80。端口号后面是可选的服务器资源的路径名,如果没有这一项,那么请求的是服务器的默认页。最后,URL以一个可选的查询成分(例如,当一个用户提交诸如搜索引擎查询页这样的表单中的项)或片段标识符(它标识资源的组成成分)结束。考虑下面的URL:http://www.cdk5.nethttp://www.w3.org/standards/faq.html#conformancehttp://www.google.com/search?q=obama上述URL可分解成如下部分:
第一个URL指定了由www.cdk5.net提供的默认页,第二个URL指定了与www.w3.org服务器相关的路径名为standards/faq.html的HTML文件的片段。29片段标识符(由URL中#后面的字符指定)是intro,浏览器下载整个文件后将在HTML文本中查找该片段标识符。第三个URL给搜索引擎指定一个查询。路径指定了一个名为“search”的程序,“?”字符后面的串是作为该程序的参数查询字符串。在考虑更高级的特征时,我们将详细讨论识别程序资源的URL。在生成内容时对用户隐藏这样的考虑是很常见的。例如,“博客作者”通常使用实现成Web页面的软件工具来创建组织好的页面集合,一个公司的Web站点的产品页通常用一个内容管理系统创建,也是通过直接与Web站点的管理性Web页面交互来实现。产品页所基于的数据库或文件系统是透明的。Huang等人[2000]提供了一个模型,该模型可以实现以最少的人工干预将内容插入Web。它在用户需要从多种设备(如照相机)提取内容发布到Web页面时特别有用。HTTP 超文本传输协议[www.w3.org IV]定义了浏览器和其他类型的客户与Web服务器的交互方式。第5章将详细讨论HTTP,这里先概述它的主要特征(我们的讨论将限制在对文件资源的检索上): 请求-应答交互:HTTP是一个“请求-应答”协议。客户发送一个请求消息给被请求资源的URL所在的服务器。服务器查找路径名,如果它存在,就在应答消息中将文件内容返回给客户。否则,它返回一个出错应答,例如大家熟悉的“404 Not Found”消息。HTTP定义了一些能在一个资源上操作的操作集合或方法。最常见的操作是GET和POST,它们从资源中检索数据以及提供数据给资源。内容类型:浏览器未必能够处理每一种内容类型。当浏览器发出一个请求时,其中包括浏览器擅长处理的内容类型的清单——例如,原则上浏览器能够以“GIF”格式而不是“JPEG”格式显示图像。服务器在将内容返回给浏览器时可能能考虑到这些方面。服务器在应答消息中包含内容类型,以便浏览器知道如何处理服务器返回的内容。表示内容类型的串称为MIME类型,RFC 1521[Freed and Borenstein 1996]已对其做了标准化。例如,如果内容是“text/html”类型,那么浏览器将把文本解释成HTML并加以显示;如果内容是“image/GIF”类型,那么浏览器将以“GIF”格式把该内容显示成图像;如果内容类型是“application/zip”,那么说明它是以“zip”格式压缩的数据,浏览器将启动一个外部的帮助者应用程序将数据解压缩。浏览器对指定的内容类型所采取的动作是可配置的,读者可以检查自己浏览器的设置。一次请求一个资源:客户的每个HTTP请求只指定一个资源。如果Web页面包含9个图像,那么浏览器总共要发出10个单独请求才能获得该页完整的内容。通常浏览器可同时发出几个请求,以减少对用户的整体延迟。简单的访问控制:默认情况下,通过网络与Web服务器相连的用户能访问所有已发布的资源。如果用户希望限制对一个资源的访问,那么他们要配置服务器,给发出请求的客户回发一个“质询”。对应的用户要证明他们有权限访问该资源(如通过输入口令)。动态页面 到目前为止,我们已经描述了用户如何在Web上发布Web页面和其他保存在文件中的内容,然而大多数用户对Web的经验来自与服务的交互而不是检索数据。例如,当用户在一个网上商店中购买一个物品时,30用户经常要填写一个Web表单,写明他们的个人信息或详细说明他们要购买什么商品。Web表单是包含用户指令和诸如文本字段、复选框等窗口输入部件的Web页面。当用户提交表单(通常通过按下按钮或“回车”键)后,浏览器就发送一个HTTP请求到Web服务器,请求中包含了用户已经输入的值。因为请求的结果取决于用户的输入,所以服务器必须处理用户的输入。因此,URL或它的第一个成分要指定服务器上的一个程序,而不是一个文件。如果用户的输入是少量的参数,那么它通常用GET方法作为URL的查询成分发送;或者,它用POST方法作为请求中的额外数据发送。“search”程序产生HTML文本作为输出,用户将看见若干包含单词“obama”的页面。(读者可以在自己常用的搜索引擎上输入一个查询,注意查看在返回结果时浏览器显示的URL。)服务器返回“search”程序生成的HTML文本,就好像是从文件中检索到的一样。换而言之,从一个文件中获取的静态内容和动态生成的内容间的差别对浏览器是透明的。Web服务器上运行的为客户生成内容的程序通常称为公共网关接口(Common Gateway Interface,CGI)程序。一个CGI程序可以具有任何特定应用的功能,只要它能分析客户提供给它的参数,产生所要求类型的内容(通常是HTML文本),程序在处理请求时会经常查询或更新数据库。下载的代码:CGI程序在服务器上运行。有时Web服务的设计者需要一些与服务相关的代码,以便在用户计算机的浏览器内部运行。例如,用Javascript[www.netscape.com]编写的代码下载时通常带有Web表单,以便提供比HTML标准窗口部件质量更好的用户交互。用Javascript增强的页面可针对无效项为用户提供及时的反馈(而不是在服务器端检查用户输入值,这种方法要花费较长的时间)。Javascript也能用于更新Web页面的部分内容而不必取得该页面的全新版本并重新显示。发生这些动态的更新或者缘于一个用户行为(例如单击一个链接或一个单选按钮)或者当浏览器从提供Web页面的服务器那里获得新数据时。在后面这种情况下,因为数据到达的及时性与浏览器用户的动作没有关系,所以称为异步的。AJAX(Asynchronous Javascript And XML)技术用于此种情况。2.3.2节将更详细地描述AJAX。另一种Javascript程序是applet:用Java语言[Flanagan 2002]写的一个应用程序,在浏览器取得相应Web页面时能自动下载并运行的应用程序。applet可以访问网络,提供定制的用户界面,例如,“聊天”应用程序有时用applet实现,它在用户的浏览器上运行,同时还要有一个服务器程序。applet把用户的文本发送给服务器,服务器再给所有的applet分发该文本以给用户显示内容。2.3.1节将详细讨论applet。31Web服务 到目前为止,我们主要从用户操作浏览器的角度讨论Web,但除浏览器之外的程序也可以是Web的客户;通过程序访问Web资源确实也是常事。然而,HTML不适合程序之间的互操作。交换Web上的多种类型的结构化数据的需求在上升,但HTML的功能是有限制的,因为它对信息浏览之外的应用是没有扩展性的。HTML具有一套静态结构(例如段落),并且其数据显示给用户的方式也是受限的。可扩展标记语言(Extensible Markup Language,XML)(见4.3.3节)是一种以标准的、结构化的、特定于应用的格式表示数据的方式。从原理上看,用XML表示的数据在不同应用间是可移植的,因为它是自描述的:它包含数据元素的名字、类型和结构。例如,XML可用于为不同的服务或应用描述产品或用户的信息。在HTTP协议中,XML数据通过POST和GET操作传递。在AJAX中,XML可以用于给浏览器中的Javascript程序提供数据。Web资源提供服务特定的操作。例如,在amazon.com网上商店,Web服务操作包括订购图书和检查订单当前状态。正如我们已提到的,HTTP提供少量可应用于任一资源的操作。这些操作主要包括对已存在资源的GET和POST方法以及分别用于创建和删除Web资源的PUT和DELETE操作。用一个GET或POST方法以及用于指定操作的参数、结果和出错应答的结构化内容,能调用对一个资源的任一操作。用于Web服务的所谓的REST(REpresentational State Transfer)体系结构[Fielding 2000]在其扩展性基础上采用这种方法:在Web上的每一个资源有一个URL和对相同操作集的应答,虽然操作的处理可能随资源的不同而变化很大。这种扩展性的另一面是在软件怎样操作方面缺乏健壮性。第9章进一步讨论REST,并深入探讨Web服务框架,从而使得Web服务的设计者能描述哪些服务特定的操作对程序员更可用以及客户应当如何访问它们。对Web的讨论 Web之所以取得巨大成功,是因为许多个人和机构能比较容易地发布资源,它的超文本结构适合组织多种类型的信息,而且Web系统体系结构具有开放性。Web的体系结构所基于的标准很简单,而且它们早已被广泛地发布。它们使得许多新的资源类型和服务可以集成在一起。Web成功的背后也存在一些设计问题。首先,它的超文本模型在某些方面有所欠缺。如果删除或移动了一个资源,那么就会存在对资源的所谓“悬空”链接,会使用户请求落空。此外,还存在用户“在超空间迷失”这个常见的问题。用户经常发现自己处于混乱状态下,跟随许多无关的链接打开完全不同的页面,使得在有些情况下其可靠性值得怀疑。在Web上查找信息的另一种方法是使用搜索引擎,但这种方法在满足用户真正需求方面是相当不完美的。32要解决这个问题,资源描述框架[www.w3.org V]中介绍过,一种方法是生成标准的表达事物元数据的词汇、语法和语义,并将元数据封装在相应的Web资源中供程序访问。除了查找Web页面中出现的词组外,从原理上讲,程序可以完成针对元数据的搜索,然后,根据语义匹配编译相关的链接列表。总而言之,由互连的元数据资源组成的Web就是语义Web。作为一个系统体系结构,Web面临规模的问题。常见的Web服务器会在一秒中有很多点击量,结果导致对用户的应答变慢。第2章将描述在浏览器和代理服务器中使用缓存来加快应答,以及将服务器负载分配到集群计算机上。
相关资源:用TCP/IP进行网际互联 第三卷:客户-服务器编程与应用(Linux/POSIX套接字版)--详细书签版