第一部分 HTTP:Web的基础
本部分主要概述HTTP协议。接下来的4章介绍了Web的基础构件以及HTTP的核心技术
第1章 简要概述HTTP
第2章 详细介绍了URL的格式,以及URL在因特网上命名的各种类型的资源,并对其向URN的发展作了概要介绍
第3章 详细说明了用来传输Web内容的HTTP报文
第4章 讨论了一些通过HTTP管理TCP连接时常被误解且很少有文档说明的规则和行为
第1章 HTTP概述
Web浏览器、服务器和相关的Web应用程序都是通过 HTTP相互通信的。HTTP是现代全球因特网中使用的公共语言。
HTTP简要介绍以下方面内容:
1.2 Web客户端和服务器
Web内容都是存储在Web服务器上的。Web服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。这些HTTP服务器存储了因特网中的数据,如果HTTP客户端发出请求的话,它们会提供数据。客户端向服务器发送HTTP请求,服务器会在HTTP响应中回送所请求的数据,如图1-1所示。HTTP客户端和HTTP服务器共同构成了万维网的基本组件。
图1-1 Web客户端面和服务器
浏览一个页面时(比如 http://www.oreilly.com/index.html),浏览器会向服务器www.oreilly.com发送一条HTTP请求(参见图 1-1)。服务器会去寻找所期望的对象(在这个例子中就是/index.html),如果成功,就将对象、对象类型、对象长度以及其他一些信息放在HTTP响应中发送客户端。
1.3资源
Web服务器是Web资源(Web resource)的宿主。Web资源是Web内容的源头。最简单的Web资源就是Web服务器文件系统中的静态文件。这些文件可以包含任意内容:文本文件、HTML文件、微软的Word文件、Adobe的Acrobat文件、JPEG图片文件、AVI电影文件,或所有其他你能够想到的格式。
但资源不一定非得是静态文件。资源还可以是根据需要生成内容的软件程序。这些动态内容资源可以根据你的身份、所请求的信息或每天的不同时段来产生内容。它们可以为你显示照相机中活生生的照片,也可以帮你进行股票交易,搜索房产数据库,或者从在线商店中购买礼物。
总之,所有类型的内容来源都是资源。包含公司销售预测电子表格的文件是一种资源。扫描本地公共图书馆书架的Web网关是一种资源。因特网搜索引擎也是一种资源 。
1.3.1媒体类型
因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型(MIME type)的数据格式标签。最初设计的MIME的电子邮件系统之间搬移报文时存在的问题。MIME在电子邮件系统中工作得非常好,因此HTTP采纳了它,用它来描述并标记多媒体内容。
Web服务器会为所有HTTP对象数据附加一个MIME类型。当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型,看看它是否知道应该如何处理这个对象。大多数据浏览器都可以处理数百种常见的对象类型:显示图片文件、解析并格式化HTML文件、通过计算机声卡播放音频文件,或者运行外部插件软件来处理特殊的数据。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。
1.3.2 URI
每个Web服务器资源都有一个名字,这样客户端可以说明它们感兴趣的资深是什么了。服务器资源名被称为统一资源标识符(Uniform Resource Identifier,URI)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。
这是Joe的五金商店的Web服务器上一个图片资源的URI:
http://www.joes-hardware.com/specials/saw-blade.gif
图1-4显示了URI是怎样指示HTTP协议去访问Joe商店服务器上的图片资源的。给定了URI,HTTP就可以解析出对象。URI有两种形式,分别是URL和URN。
现在我们分别来看看这些资源标识符类型。
1.3.3URL
统一资源定位符(URL)是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。
图1-4显示了URL如何精确地说明某资源的位置以及如何去访问它。表1-1显示了几个URL实例。
大部分URL都遵循一种标准格式,这种格式包含三个部分。
现在,几乎所有的URI都是URL。
1.3.4 URN
URI的第二种形式就是统一资源名(URN)。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关。使用这些与位置无关的URN,就可以将资源四处搬移。通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。
比如,不论因特网标准文档RFC 2141位于何处(甚至可以将其复制到多个地方),都可以用下列URN来命名它:
urn:ietf:rfc:2141
URN仍然处于试验阶段,还未大范围使用。
1.4事务
我们来更仔细地持看客户端是怎样通过HTTP与Web服务器及其资源进行事务处理的。一个HTTP事务由一条请求命令和一个响应结果组成。这种通信是通过名为HTTP报文的格式化数据块进行的,如图1-5所示。
1.4.1 方法
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法。这个方法会告诉服务器要执行什么动作(获取一个Web页面、运行一个网关程序、删除一个文件等)。表1-2列出了五种常见的HTTP方法。
1.4.2 状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。表1-3显示几咱常见的状态码。
伴随着每个数字状态码,HTTP还会发送一条解释性的“原因短语”文本。包含文本短语主要是为了进行描述,所有的处理过程使用的都是数字码。
1.4.3 Web页面中可以包含多个对象
应用程序完成一项任务进通常会发布多个HTTP事务。比如,Web浏览器会发岸上一系列HTTP事务来获取并显示一个包含了丰富图片的Web页面。浏览器会执行一个事务来获取描述页面布局的HTML“框架”,然后发布别外的HTTP事务来获取每个嵌入式图片、图像面板、Java小程序等。这些嵌入式资源甚至可能位于不同的服务器上,如图1-6所示。因此,一个“Web页面”通常并不是单个资源,而是一组资源的集合。
1.5 报文
现在我们来快速浏览一下HTTP请求和响应报文的结构。
HTTP报文是由一行一行的简单字符串组成的。HTTP报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写。图1-7显示了一个简单事务所使用的HTTP报文。
从Web客户端发往Web服务器的HTTP报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文的格式很类似。
HTTP报文包括以下三个部分。
简单的报文实例
图1-8显示了可能会作为某个简单事务的一部分发送的HTTP报文。浏览器请求资源http://www.joes-hardware.com/tools.html。
在图1-8中,浏览器发送了一条HTTP请求报文。这条请求的起始行中有一个GET命令,且本地资源为/tools.html。这条请求说明它使用的是1.0版的HTTP协议。请求报文没有主体,因为从服务器上GET一个简单的文档不需要请求数据。
服务器会回送一条HTTP响应报文。这条响应中包含了HTTP的版本号(HTTP/1.0)、一个成功状态码(200)、一个描述性的原因短语(OK),以及一块响应首部字段,在有这些内容之后跟着包含了所请求文档的响应主体。Content-length首部说明了响应主体的长度,Content-Type首部说明了文档的MIME类型。
1.6 连接
概要介绍了HTTP报文的构成之后,我们来讨论一下报文是如何通过传输控制协议(Transmission Control Protocol,TCP)连接从一个地方搬移到另一个地方去的。
1.6.1 TCP/IP
HTTP是个应用层协议。HTTP无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP。TCP提供了:
因特网自身就是基于TCP/IP的,TCP/IP是全世界的计算机和网络设备常用的层次分化组交换网协议集。TCP/IP隐藏了各种网络和硬件的特点及弱点,使各种类型的计算机和网络都能进行可靠的通信。
只要建立了TCP连接,客户端和服务器之间的报文交换就不会丢失、不会被破坏,也不会在接收时出现错序了。
用网络术语来说,HTTP协议位于TCP的上层。HTTP使用TCP来传输其报文数据。与之类似,TCP则位于IP的上层(参见图1-9)
1.6.2 连接、IP地址及端口号
在HTTP客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)地址和端口在客户端和服务器之间建立一条TCP/IP连接。
建立一条TCP连接的过程与给公司办公室的某个人打电话的过程类似。首先,要拔打公司的电话号码。这样就能进入正确的机构了。其次,拔打要联系的那个人的分机号。
在TCP中,你需要知道服务器的IP地址,以及与服务器上运行的特定软件相关的TCP端口号。
这就行了,但最初怎么获得HTTP服务器的IP地址和端口号呢?当然是通过URL了!我们前面曾提到过,URL就是资源的地址,所以自然能够为我们提供存储资源的机器的IP地址。我们来年几个URL:
http://207.200.83.29:80/index.html
http://www.netscape.com:80/index.html
http://www.netscape.com/index.html
第一个URL使用了机器的IP地址,207.200.83.29以及端口80.
第二URL没有使用数字形式的IP地址,它使用的是文本形式的域名,或者称为主机名(www.netscape.com)。主机名就是IP地址比较人性化的别称。可以通过一种称为域名服务的机制方便地将主机名转换为IP地址,这样所有问就都解决了。
最后一个URL没有端口号。HTTP的URL中没端口号时,可以假设默认端口号是80.有了IP地址和端口号,客户端就可以很方便地通过TCP/IP进行通信了。图1-10显示了浏览器是怎样通过HTTP显示位于远端服务器中某个简单HTML资源的。
步骤如下:
1.6.3 一个使用Telnet的实例
由于HTTP使用了TCP/IP传输协议,而且它是基于文本的,没有使用那些难以理解的二进制格式,因此很容易直接与Web服务器进行对话。
Telnet程序可以将键盘连接到某个目标TCP端口,并将此TCP端口的输出回送到显示屏上。Telnet常用于远程终端会话,但它几乎可以连接所有的TCP服务器,包括HTTP服务器。
可以通过Telnet程序直接与Web服务器进行对话。通过Telnet可以打开一条到某台机器上某个端口的TCP连接,然后直接向那个端口输入一些字符。Web服务器会将Telnet程序作为一个Web客户端来处理,所有回送给TCP连接的数据都会显示在屏幕上。
我们用Telnet与一个实际的Web服务器进行交互。我们要用Telnet获取URL http://www.joes-hardware.com:80/tools.html所指向的文档。
例1-1显示了对http://www.joes-hardware.com:80/tools.html的HTTP请求实例。我们输入的内容用粗体字表示。
Telnet会查找主机名并打开一条连接,连接到在www.joes-hardware.com的端口80上监听的Web服务器。这条命令之后的三行内容是Telnet的输出,告诉我们它已经建立了连接。
然后我们输入最基本的请求命令GET /tools.html HTTP/1.1发送一个提供了源端主机名的Host首部,后面跟上一个空行,请求从服务器www.joes-hardware.com上获取资源tools.html。随后,服务器会以一个响应行、几个响应首部、一个空行和最后面的HTML文档主体来应答。
要明确的是,Telnet可以很好地模拟HTTP客户端,但不能作为服务器使用。而且对Telnet做脚本自动化是很繁锁乏味的。如果想要更灵活的工具(包括HTTP),可以去看看nc(netcat)。通过nc可以很方便地操纵基本UDP和TCP的流量,还可以为其编写脚本。
1.7 协议版本
现在使用的HTTP协议有几个版本。HTTP应用程序要尽量强健地处理各种不同的HTTP协议变体。目前仍在使用的版本如下。
HTTP/0.9
HTTP的1991原型版本称为HTTP/0.9。这个协议有很多严重的设计缺陷,只应该用于与老客户端的交互。HTTP/0.9只支持GET方法,不支持多媒体内容的MIME类型、各种HTTP首部,或者版本号。HTTP/0.9定义的初衷是为了获取简单的HTML对象,它很快就被HTTP/1.0取代了
HTTP/1.0
HTTP/1.0+
HTTP/1.1
1.8 Web的结构组件
在本章的概述中,我们重点介绍了两个Web应用程序(Web浏览器和Web服务器)是如何相互发送报文来实现基本事务处理的。在因特网上,要与很多Web应用程序进行交互。在本节中,我们将列出其他一些比较重要的应用程序,如下所示:
代理:位于客户端和服务器之间的HTTP中间实体
缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。
网关:连接其他应用程序的特殊Web服务器
隧道:对HTTP通信报文进行盲转发的特殊代理
Agent代理:发起自动HTTP请求的半智能Web客户端
1.8.1 代理
首先我们来看看HTTP代理服务器,这是Web安全、应用集成以及性能优化的重要组成模块。
如图1-11所示,代理位于客户端与服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用来说, 这些应用程序就是一个代理,代表用户访问服务器。
出于安全考虑,通常会将代理作用转发所有Web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。比如,在企业中对下载的应用程序进行病毒检测,或者对小学生屏蔽一些成人才能看的内容。第6单详细介绍代理。
1.8.2 缓存
Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了(参见图:1-12)
客户端从附近的缓存开载文档会比从远程Web服务器下载快得多。HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。第7章介绍了缓存技术
1.8.3 网关
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
例如,一个HTTP网关会通过HTTP请求接收到FTP URI的请求,但通过FTP协议来获取文档(参见图1-13)。得到文档会被封装成一条HTTP报文,发送给客户端。第8章将探讨网关。
1.8.4 隧道
隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序。HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
HTTP隧道的一种常见用途是通过HTTP连接承载加密的安全套接字层流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。如图1-14所示,HTTP/SSL隧道收到一条HTTP请求,要求建立一条到目的地址和端口的输出连接,然后在HTTP通信上通过隧道传输加密的SSL流量,这样就可以将其盲转发到目的服务器上去了。
1.8.5 Agent代理
用户Agent代理(或者简称为Agent代理)是代表用户发起HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTP Agent代理。到目前为止,我们只提到过一种HTTP Agent代理:Web浏览器,但用户Agent代理还有很多其他类型。
比如,有些自己会在Web上闲逛的自动用户Agent代理,可以在无人监视的情况下发布HTTP事务并获取内容。这些自动代理的名字通常有很生,比如“网络蜘蛛”(spiders)或者“Web机器人”(Web robots)参见图1-15。网络蜘蛛会在Web上闲逛,搜集信息以构建有效的Web内容档案,比如一个搜索引擎的数据库或者为比较购物机器人生成的产品目录。更多信息请参见第9章。
1.9起始部分的结束语
这就是我们对HTTP的简要介绍。本章中,我们重点介绍了作为多媒体传输协议使用的HTTP。概要说明了HTTP是怎样使用的URI来命名远程服务器上的多媒体资源的,粗略介绍了如何利用HTTP请求和响应报文操纵远程服务器上的多媒体资源 ,最后考察了几种使用HTTP的Web应用程序。