实现WWW的基础技术


    WWW是Internet上发展最快、应用最广泛也最实用的超文本信息通信系统,它以Client/Server模式进行数据通信。服务器端通过WebServer可以提供各种服务;客户端可以通过浏览器(Browser)访问多种协议的多媒体信息,依据用户的需要组织和传递信息。人们可以通过WWW浏览器浏览和检索全球所有WWW站点的信息,这就使得信息的共享与交流越来越迅速、越来越方便,正因为如此,WWW才成为了目前Internet上信息发布与出版的重要途径。
    WWW的最大特色在于为用户提供良好的信息查询界面。WWW把各种形式的信息,如文本、图像、声音、视频等无缝隙地集成在一起,用户只需要提出自己的查询要求,具体到什么地方、如何取回信息都由WWW自动完成。通过浏览器,用户只需用鼠标点击显示屏上高亮度或有下划线的词语,就可将与该词语相关联的文件取回并显示在屏幕上,用户无需关心这些文件存放在Internet上的哪台计算机中。
    WWW信息服务的框架如图1所示。 

 

 

 

图 1

    首先,客户端根据某资源的URL向Web Server提出请求,Web Server的HTTP Daemon(守护进程)将此请求的参数通过标准输入stdin和环境变量(Environment Variable)传递给指定的CGI程序,并启动此应用程序进行处理,处理结果通过标准输出stdout返回给HTTP Daemon进程,再由HTTP Daemon进程返回给客户端,由浏览器负责解释执行,将最终结果显示在用户面前。
    实现WWW的通信协议是HTTP(Hypertext Transfer Protocol,超文本传输协议),它定义了HTTP的通信交换机制、请求及响应消息的格式等;HTML(Hypertext Markup Language,超文本标注语言)用来描述WWW上发布的信息,浏览器通过解释执行HTML文件显示出图文并茂的WWW信息,向用户提供良好的信息查询界面;CGI负责调用相应的处理程序,并返回处理结果。本文将从HTTP的通信交换机制和CGI的工作原理入手,对WWW的基础技术进行较详细的介绍,以帮助读者从本质上更深入地理解WWW的一切行为和特征。

HTTP的通信交换机制

WWW要实现诸多目标,其中最基本的四项包括:
*分布式信息系统;
*对多重协议提供一个统一通用的接口;
*对超媒体支持;
*可扩充性,能够支持所有的数据格式。

    HTTP之前的其他协议都不能完全实现上述要求,因而HTTP就应运而生了。HTTP规范表明,HTTP协议是一种根据明确性和速度要求,为建立分布式协作超媒体信息系统而设计的协议,它是一种简单的、无状态的、面向对象的协议,可用于多种任务,如名字服务器和分布式对象管理。
    HTTP常常在某种程度上引起人们的误解,仿佛HTTP只能传输超文本,其实不然,你可以用它传输各种对象,而不必考虑其数据类型。

一、HTTP的特点

   HTTP设计得简单而灵活,它是无状态和"无连接"的,基于Client/Server模式并且支持元信息和内容类型标识。它具有六个重要的特点:

1. 以Client/Server模型为基础

    HTTP支持客户与服务器之间通信及相互传送数据,一个服务器可以为分布在世界各地的许多客户服务。

2. 简易性

    HTTP被设计成一个非常简单的协议,使得Web服务器能高效地处理大量请求,客户机要连接到服务器,只需发送请求方式和URL路径等少量信息。HTTP规范定义了七种请求方式,最常用的有三种:GET、HEAD和POST。每一种请求方式都允许客户以不同类型的消息与Web服务器进行通信,Web服务器也因此可以是简单小巧的程序。由于HTTP协议简单,HTTP的通信与FTP、Telnet等协议的通信相比,速度快而且开销小。

3. 灵活性与内容-类型(content-type)标识

    HTTP允许任意类型数据的传送,因此可以利用HTTP传送任何类型的对象,并让客户程序能够恰当地处理它们,内容-类型标识指示了所传输数据的类型。打个比方,如果数据是罐头,内容-类型标识就是罐头上的标签。

4. "无连接"性

    HTTP是"无连接"的协议,但值得特别注意的是,这里的"无连接"是建立在TCP/IP协议之上的,与建立在UDP协议之上的无连接不同。这里的"无连接"意味着每次连接只限处理一个请求。客户要建立连接需先发出请求,收到响应,然后断开连接,这实现起来效率十分高。采用这种"无连接"协议,在没有请求提出时,服务器就不会在那里空闲等待。完成一个请求之后,服务器即不会继续为这个请求负责,从而不用为保留历史请求而耗费宝贵的资源。这在服务器的一方实现起来是非常简单的,因为只需保留活动的连接(Active Connection),不用为请求间隔而浪费时间。

5. 无状态性

    HTTP是无状态的协议,这既是优点也是缺点。一方面,由于缺少状态使得HTTP累赘少,系统运行效率高,服务器应答快;另一方面,由于没有状态,协议对事务处理没有记忆能力,若后续事务处理需要有关前面处理的信息,那么这些信息必须在协议外面保存;另外,缺少状态意味着所需的前面信息必须重现,导致每次连接需要传送较多的信息。

6. 元信息(meta information)

    收到数据的浏览器可以根据元信息确定服务器发来的是什么内容,预料有多少数据,确知是否接收到完整的数据,以及发送过程中是否有错,这样客户就可以知道传输对象的类型。元信息被定义为"关于信息的信息",元信息允许服务器提供所发送数据的信息,例如,HTTP可以提供所发送的对象的语言和类型,也可以用元信息来实现有条件请求和报告事务完成。元信息的引入使得HTTP协议所能做的工作更多了。

二、HTTP的通信交换过程

    HTTP通信建立在TCP/IP连接之上,缺省的TCP端口号是80,但也可以使用其他端口号。图2所示的是一个HTTP服务器在端口80上接受来自多个远程客户连接时的情形。Web服务器运行着一个守护进程(HTTPDaemon),它始终在端口80监听着来自远端客户的请求。当一个请求发来时,它就会产生一个子进程来处理当前请求,守护进程继续以后台方式运行,在端口80继续监听来自远端的连接请求。 

 

 

 

 

 

 

 

图 2

   HTTP通信中客户提出请求应该带上全部必要的信息,客户机和服务器之间不能对不明确的问题进行磋商。一旦客户提出请求,服务器感到信息不够时没有办法要求客户给出进一步信息。客户与服务器通信流程图如图3所示。 

 

 

 

 

 

图 3

三、HTTP的请求和响应消息格式

    在WWW信息的传递过程中,客户端向服务器按照特定的格式发出请求消息,服务器端处理此请求,并将结果按照特定的格式作为响应返回给客户。HTTP的消息格式与MIME相似。

1. 请求的格式

方法URIHTTP版本号
首部
(回车换行)
实体──主体

    方法描述了对给定资源应作的处理。在HTTP/1.1下,请求的合法方法有:OPTIONS、GET、HEAD、PUT、POST、TRACE和DELETE,其中最常用的是GET、HEAD和POST。
    GET:用于从服务器请求一个用URL标识的资源对象。如果对象是文档或文件,GET将请求其内容;如果对象是程序或脚本,GET将请求程序的运行结果或脚本的输出;如果对象是数据库查询,GET将请求查询的结果。每次循着链浏览Web时,浏览器都要用GET方法来读取你请求的文档。
    HEAD:用于服务器请求对象的元信息,这时用户也许想知道对象的大小或最近的修改日期,而不是请求对象本身。HEAD方法的请求速度要快得多,因为它不需要传送整个文件。使用高速缓存的客户经常使用HEAD请求来取得文档最近的修改时间,与缓存中文档的修改时间进行对比,如果一致,则表明文档没有更新,因而无须读取整个文档。
    POST:用于客户向服务器传送数据,以便服务器作出相应的处理。POST方法经常用于向HTTP服务器提交HTML表格以便处理。例如,网上的联机就业服务中就是靠提交简历表格来找工作。当你填写了一份WWW页面表格后,浏览器通常就使用POST方法向服务器提交你输入的数据。
    每个资源都有其特定的URL标识,经由各种不同的协议,对Internet上任何地方的信息都可以用URL定位或取回。URL可以指定FTP文件传输,寻找新闻信息,定义用户的Email地址,标识HTTP文件和其他类型数据。URL中的字符不区分大小写。

2. 响应的消息格式

HTTP-Version Status-Code Reason-Phrase
首部
(空行)
Entity-Body

    状态码表示服务器是否成功地满足了客户的请求,状态码由一个三位整数和解释状态码含义的正文短语组成。状态码以1、2、3、4、5开头,在HTTP/1.1中,1类状态码表示的是信息性(informational)提示;2类状态码表示成功--服务器理解客户的请求,并且毫无困难地给出了响应;3类码表示发生了重定向--服务器理解请求并能够取得资源,但发现资源不在指定的位置而在其他地方;4类码表示客户出错;5类码表示服务器出错。
    所有这些状态码中,需要熟悉的只有几个。经历最多的是200(OK),不过也许会碰到400(Bad request)和404(Not found),偶尔也有500(Internal server error)。如果想把服务器重定向到新的位置,而不是返回一个仅仅链接到对象新位置的文档时,301(Moved Permanently)和302(Moved temporarily)将特别有用。
    响应消息的首部域中,通常会指明所传输数据的编码压缩机制、服务器端软件等。
    实体主体是所传输的数据,由于HTTP对于以任意格式传输文档的自由度很大,所以它可以是图形、音频、视频文件等多媒体对象,只需在首部域中标明其类型即可。对任意格式传输数据的完全开放性,正是HTTP和Web所提供的最重要的优越性。

CGI的工作原理

一、CGI的工作原理

    CGI(Common Gateway Interface)是外部应用程序与Web服务器交互的一个标准接口。CGI应用程序可以完成客户端与服务器的交互操作,它打破了服务器软件的局限性,允许用户根据需要采用各种语言去实现无法用HTTP、HTML实现的功能,给WWW提供了更为广阔的应用空间。例如,一个能够访问外部数据库的CGI程序可以使客户端用户通过Web服务器进行数据库的查询。同时,CGI也为如何在不同的平台之间进行沟通提供了范例。
    CGI工作的主要流程是:1.一个用户请求激活一个CGI应用程序;2.CGI应用程序将交互主页中用户输入的信息提取出来;3.将用户输入的信息传给服务器主机应用程序(如数据库查询);4.将服务器处理结果通过HTML文件返回给用户;5.CGI进程结束。
    一个CGI程序可以实时产生动态的HTML文件,它能根据用户的需求输出动态信息,将数据库服务器中的信息作为数据源对外提供服务,将WWW服务和数据库服务结合起来。如图4所示,客户端向Web服务器提出请求,Web服务器运行对应的CGI程序,CGI程序向数据库服务器提出请求,数据库服务器将查询结果返回Web服务器,Web服务器再将查询结果返回客户端,一个查询请示结束。

 

 

 

 

图4

    CGI程序的工作原理是:客户端的Web浏览器浏览到某个主页后,利用一定的方式提交数据,并通过HTTP协议向Web服务器发出请求,服务器端的HTTPDaemon(守护进程)将描述的主页信息通过标准输入stdin和环境变量(environment variable)传递给主页指定的CGI程序,并启动此应用程序进行处理(包括对数据库的处理),处理结果通过标准输出stdout返回给HTTPDaemon守护进程,再由HTTPDaemon进程通过HTTP协议返回给客户端的浏览器,由浏览器负责解释执行,将最终的结果显示给用户。
    服务器使用环境变量(执行CGI程序时的设置)传输有关的请求信息到CGI程序,这些环境变量包括服务器的名字、CGI和服务器使用协议的版本号、客户端的IP地址和域名地址、客户端的请求方式、请求内容及编码方式、访问信息的合法性以及用户的输入信息等。
    CGI程序一般是可执行程序。编译好的CGI程序一般要集中放在一个目录下。具体存放的位置随操作系统的不同而不同(而且可以由用户自己根据情况进行配置),例如UNIX系统下的WWW服务器中一般放在cgi-bin子目录下,而在Windows操作系统下以Webstar或Website作WWW服务器,CGI程序都放在cgi-win下。不过,CGI程序的执行一般有两种调用方式:一是通过URL直接调用,如:"http://202.205.240.63/cgi-bin/testcgi",在浏览器的URL栏里直接写入上述地址就可以调用该程序;另一种方式,也是主要的方式,是通过交互式主页中的FORM栏调用,通常都是用户在填完一张输入信息主页后按"确认"按钮启动CGI程序。主页的交互一般都是这样调用CGI来完成的。
    CGI的跨平台性能极佳,几乎可以在任何操作系统上实现,如DOS、Windows、UNIX、OS/2、Macintosh等。实现CGI的编程语言也有很多选择,常用的有Perl、C/C++、VisualBasic等。CGI的应用程序一般都是一个独立的可执行程序,与Web服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。CGI的缺点也是显而易见的:每当有一个用户请求,就会激活一个CGI进程,当用户请求数量非常多时,大量的CGI程序就会大量挤占系统的资源,如内存、CPU时间等,造成CGI运行效率低下。
   正因为如此,Web服务器开发商又开发出了专用的API,它是驻留在Web服务器上的原始代码,可以像CGI那样扩展Web服务器的功能,同时又比CGI占用的资源少。但开发API应用程序比开发CGI应用程序更复杂,需要较多的编程技巧,如多线程、同步运行机制、直接的协议编程和容错处理等。

二、ISAPI的工作原理及其性能

    ISAPI即Internet Server Application Program Interface,是微软提供的一套面向Internet服务的API接口,它能实现CGI提供的全部功能,并在此基础上进行了扩展,例如提供了过滤器应用程序接口等。
    ISAPI的工作原理和CGI大体上是相同的,都是通过交互式主页取得用户输入信息,然后交服务器后台处理(如图5所示)。但是二者在实现机制上大相径庭。ISAPI与CGI最大的区别在于:在ISAPI下建立的应用程序都是以动态链接库的形式存在的;而CGI的应用程序一般都是可执行程序。

 

 

 

 

图 5

    ISAPI应用的工作流程与CGI有一些不同。ISAPI应用的DLL不仅可以像CGI程序一样被用户请求激活,还可以被系统预先激活来监视用户输入;对于被用户激活的DLL,在处理完一个用户请求后不会马上消失,而是继续驻留在内存中等待处理其他用户的输入,直到过了指定时间后一直没有用户输入为止。
    一个ISAPI的DLL,除了可以在被用户请求激活后长驻内存,等待用户的另一个请求外,还可以在一个DLL里设置多个用户请求处理函数。此外,ISAPI的DLL应用程序和Web服务器处于同一个进程中,效率要显著高于CGI。
    ISAPI提供了基于MicrosoftIIS(Internet Information Server)的专用API,由于ISAPI的应用程序是DLL文件,可以与Web服务器装于同一地址空间中,所以它的执行效率比CGI高。基于ISAPI的所有进程都可以获得HTTP Server上的任何资源,而且当它调用外部CGI Script时,需要的开销也较单纯的CGI少。
    由于开发ISAPI应用要用到微软的一套API,所以能用来开发ISAPI应用的语言不如CGI那么多。主要有VisualC++4.1以上版本,也可以使用VisualBasic5.0、Borland C++5.0等。


back(1).gif (2190 字节)