1.1 Web客户端和服务器
浏 览 一 个 页 面 时( 比 如 http://www.oreilly.com/index.html), 浏 览 器 会 向 服 务 器www.oreilly.com 发送一条 HTTP 请求(参见图 1-1)。服务器会去寻找所期望的对象(在这个例子中就是 /index.html),如果成功,就将对象、对象类型、对象长度以及其他一些信息放在 HTTP 响应中发送给客户端。
Web 服务器是 Web 资源(Web resource)的宿主。Web 资源是 Web 内容的源头。最简单的 Web 资源就是 Web 服务器文件系统中的静态文件。这些文件可以包含任意内容:文本文件、HTML 文件、微软的 Word 文件、Adobe 的 Acrobat 文件、JPEG 图片文件、AVI 电影文件,或所有其他你能够想到的格式。但资源不一定非得是静态文件。资源还可以是根据需要生成内容的软件程序。这些动态内容资源可以根据你的身份、所请求的信息或每天的不同时段来产生内容。它们可以为你显示照相机中活生生的照片,也可以帮你进行股票交易,搜索房产数据库,或者从在线商店中购买礼物(参见图 1-2)。
1.3媒体类型
MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间
由一条斜杠来分隔。
• HTML 格式的文本文档由 text/html 类型来标记。
• 普通的 ASCII 文本文档由 text/plain 类型来标记。
• JPEG 格式的图片为 image/jpeg 类型。
• GIF 格式的图片为 image/gif 类型。
• Apple 的 QuickTime 电影为 video/quicktime 类型。
• 微软的 PowerPoint 演示文件为 application/vnd.ms-powerpoint 类型。
每个 Web 服务器资源都有一个名字,这样客户端就可以说明它们感兴趣的资源是什么了。服务器资源名被称为统一资源标识符(Uniform Resource Identifier,URI)。URI 就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。
统一资源定位符(URL)是资源标识符最常见的形式。URL 描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。
大部分 URL 都遵循一种标准格式,这种格式包含三个部分。
• URL 的第一部分被称为方案(scheme),说明了访问资源所使用的协议类型。这
部分通常就是 HTTP 协议(http://)。
• 第二部分给出了服务器的因特网地址(比如,www.joes-hardware.com)。
• 其余部分指定了 Web 服务器上的某个资源(比如,/specials/saw-blade.gif)。
URI 的第二种形式就是统一资源名(URN)。URN 是作为特定内容的唯一名称使用的,与目前的资源所在地无关。使用这些与位置无关的 URN,就可以将资源四处搬移。通过 URN,还可以用同一个名字通过多种网络访问协议来访问资源。
1.7 事务
一个 HTTP 事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。
应用程序完成一项任务时通常会发布多个 HTTP 事务。
HTTP 报文是由一行一行的简单字符串组成的。HTTP 报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写
从 Web 客户端发往 Web 服务器的 HTTP 报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的
HTTP 报文。HTTP 请求和响应报文的格式很类似
HTTP 报文包括以下三个部分。
• 起始行
报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。
• 首部字段
起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。
• 主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给 Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。
1.12 连接
HTTP 是个应用层协议。HTTP 无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议 TCP/IP。
在HTTP 客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)地址和端口号在客户端和服务器之间建立一条 TCP/IP 连接。
步骤如下:
(a) 浏览器从 URL 中解析出服务器的主机名;
(b) 浏览器将服务器的主机名转换成服务器的 IP 地址;
(c) 浏览器将端口号(如果有的话)从 URL 中解析出来;
(d) 浏览器建立一条与 Web 服务器的 TCP 连接;
(e) 浏览器向服务器发送一条 HTTP 请求报文;
(f) 服务器向浏览器回送一条 HTTP 响应报文;
(g) 关闭连接,浏览器显示文档。
一个使用Telnet的实例
例1-1 一个使用Telnet 的HTTP 事务
% telnet www.joes-hardware.com 80
Trying 161.58.228.45...
Connected to joes-hardware.com.
Escape character is '^]'.
GET /tools.html HTTP/1.1
Host: www.joes-hardware.com
HTTP/1.1 200 OK
Date: Sun, 01 Oct 2000 23:25:17 GMT
Server: Apache/1.3.11 BSafe-SSL/1.38 (Unix) FrontPage/4.0.4.3
Last-Modified: Tue, 04 Jul 2000 09:46:21 GMT
ETag: "373979-193-3961b26d"
Accept-Ranges: bytes
Content-Length: 403
Connection: close
Content-Type: text/html
<HTML>
<HEAD><TITLE>Joe's Tools</TITLE></HEAD>
<BODY>
<H1>Tools Page</H1>
<H2>Hammers</H2>
<P>Joe's Hardware Online has the largest selection of hammers on the
earth.</P>
<H2><A NAME=drills></A>Drills</H2>
<P>Joe's Hardware has a complete line of cordless and corded drills,
as well as the latest
in plutonium-powered atomic drills, for those big around the house
jobs.</P> ...
</BODY>
</HTML>
Connection closed by foreign host.
Telnet 会查找主机名并打开一条连接,连接到在www.joes-hardware.com 的端口80
上监听的Web 服务器。这条命令之后的三行内容是Telnet 的输出,告诉我们它已经
建立了连接。
然后我们输入最基本的请求命令GET/tools.html HTTP/1.1,发送一个提供了源
端主机名的Host 首部,后面跟上一个空行,请求从服务器www.joes-hardware.com
上获取资源tools.html。随后,服务器会以一个响应行、几个响应首部、一个空行和
最后面的HTML 文档主体来应答。
1.13 协议版本
• HTTP/0.9
HTTP 的1991 原型版本称为HTTP/0.9。这个协议有很多严重的设计缺陷,只应该用于与老客户端的交互。HTTP/0.9 只支持GET 方法,不支持多媒体内容的MIME 类型、各种HTTP 首部,或者版本号。HTTP/0.9 定义的初衷是为了获取简单的HTML 对象,它很快就被HTTP/1.0 取代了。
• HTTP/1.0
1.0 是第一个得到广泛使用的HTTP 版本。HTTP/1.0 添加了版本号、各种HTTP首部、一些额外的方法,以及对多媒体对象的处理。HTTP/1.0 使得包含生动图片的Web 页面和交互式表格成为可能,而这些页面和表格促使万维网为人们广泛地接受。这个规范从未得到良好地说明。在这个HTTP 协议的商业演进和学术研究都在快速进行的时代,它集合了一系列的最佳实践。
• HTTP/1.0+
在20 世纪90 年代中叶,很多流行的Web 客户端和服务器都在飞快地向HTTP中添加各种特性,以满足快速扩张且在商业上十分成功的万维网的需要。其中很多特性,包括持久的keep-alive 连接、虚拟主机支持,以及代理连接支持都被加入到HTTP 之中,并成为非官方的事实标准。这种非正式的HTTP 扩展版本通常
称为HTTP/1.0+。
• HTTP/1.1
HTTP/1.1 重点关注的是校正HTTP 设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。HTTP/1.1 还包含了对20 世纪90 年代末正在发展中的更复杂的Web 应用程序和部署方式的支持。HTTP/1.1 是当前使用的HTTP 版本。
• HTTP-NG(又名 HTTP/2.0)
HTTP-NG 是HTTP/1.1 后继结构的原型建议,它重点关注的是性能的大幅优化,以及更强大的服务逻辑远程执行框架。HTTP-NG 的研究工作终止于1998 年,编写本书时,还没有任何要用此建议取代HTTP/1.1 的推广计划。
1.14 Web的结构组件
两个Web 应用程序(Web 浏览器和Web 服务器)是如何相互发送报文来实现基本事务处理的。在因特网上,要与很多Web 应用程序进行交互。在本节中,我们将列出其他一些比较重要的应用程序,如下所示。
• 代理
位于客户端和服务器之间的HTTP 中间实体。
• 缓存
HTTP 的仓库,使常用页面的副本可以保存在离客户端更近的地方。
• 网关
连接其他应用程序的特殊Web 服务器。
• 隧道
对HTTP 通信报文进行盲转发的特殊代理。
• Agent 代理
发起自动HTTP 请求的半智能Web 客户端。
1.14.1 代理
代理位于客户端和服务器之间,接收所有客户端的HTTP 请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户来说,这些应用程序就是一个代理,代表用户访问服务器。
出于安全考虑,通常会将代理作为转发所有Web 流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。比如,在企业中对下载的应用程序进行病毒检测,或者对小学生屏蔽一些成人才能看的内容。
1.14.2 缓存
Web 缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP 代理服务器,可以将经过代理传送的常用文档复制保存起来。
1.14.3 网关
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP 流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
1.14.4 隧道
隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP 应用程序。HTTP 隧道通常用来在一条或多条HTTP 连接上转发非HTTP 数据,转发时不会窥探数据。
1.14.5 Agent代理
用户Agent 代理(或者简称为Agent 代理)是代表用户发起HTTP 请求的客户端程序。所有发布Web 请求的应用程序都是HTTP Agent 代理。到目前为止,我们只提到过一种HTTP Agent 代理:Web 浏览器,但用户Agent 代理还有很多其他类型。