《HTTP权威指南》学习笔记
1. HTTP概述
1.1 Web服务器和客户端
浏览一个页面时(比如 http://www.oreilly.com/index.html),浏览器会向服务器www.oreilly.com 发送一条 HTTP 请求。服务器会去寻找所期望的对象(在这个例子中就是 /index.html),如果成功,就将对象、对象类型、对象长度以及其他一些信息放在 HTTP 响应中发送给客户端。
1.2 资源
Web 服务器是 Web 资源(Web resource)的宿主。Web 资源是 Web 内容的源头。最简单的 Web 资源就是 Web 服务器文件系统中的静态文件。这些文件可以包含任意内容:文本文件、HTML 文件、微软的 Word 文件、Adobe 的 Acrobat 文件、JPEG 图片文件、AVI 电影文件,或所有其他你能够想到的格式。
1.2.1 媒体类型
因特网上有数千种不同的数据类型,HTTP 仔细地给每种要通过 Web 传输的对象都打上了名为 MIME 类型(MIME type)的数据格式标签。
MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。
常见MIME类型
- HTML 格式的文本文档由 text/html 类型来标记。
- 普通的 ASCII 文本文档由 text/plain 类型来标记。
- JPEG 版本的图片为 image/jpeg 类型。
- GIF 格式的图片为 image/gif 类型。
- Apple 的 QuickTime 电影为 video/quicktime 类型。
- 微软的 PowerPoint 演示文件为 application/vnd.ms-powerpoint 类型。
1.2.2 URI
每个 Web 服务器资源都有一个名字,这样客户端就可以说明它们感兴趣的资源是什么了。服务器资源名被称为统一资源标识符(Uniform Resource Identifier,URI)。
例如:http://www.joes-hardware.com/specials/saw-blade.gif
1.2.3 URL
统一资源定位符(URL)是资源标识符最常见的形式。URL 描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。图1.jpg显示了URL如何精确地说明想要访问的资源。
![](https://img.haomeiwen.com/i8581772/8e573dafb7ab55df.jpg)
大部分URL都遵循一种标准格式,这个格式包含三部分。
- URL的第一部分被称为方案,说明访问资源所使用的协议类型。通常是HTTP协议(http://)。
- 第二部分给出了服务器的因特网地址(比如,www.joes-hardware.com)。
- 其余部分指定了Web服务器上的某个资源(比如,/specials/saw-blade.gif)。
现在,几乎所有的URI都是URL。
1.3 事务
一个 HTTP 事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。这种通信是通过名为 HTTP 报文(HTTP message)的格式化数据块进行的。
![](https://img.haomeiwen.com/i8581772/eb96b0dbfaed1612.jpg)
1.3.1 方法
HTTP 支持几种不同的请求命令,这些命令被称为 HTTP 方法(HTTP method)。这个方法会告诉服务器要执行什么动作(获取一个 Web 页面、运行一个网关程序、删除一个文件等)。
一些常见的HTTP方法
- GET:从服务器向客户端发送命名资源
- PUT:将来自客户端的数据存储到一个命名的服务器资源中去
- DELETE:从服务器中删除命名资源
- POST:将客户端数据发送到一个服务器网关应用程序
- HEAD:仅发送命名资源响应中的 HTTP 首部
1.3.2 状态码
每条 HTTP 响应报文返回时都会携带一个状态码。
一些常见的HTTP状态码
- 200:OK。文档正确返回
- 302:Redirect(重定向)。到其它地方去获取资源
- 404:Not Found(没找到)。无法找到这个资源
1.3.3 Web页面中可以包含多个对象
Web 浏览器会发布一系列 HTTP 事务来获取并显示一个包含了丰富图片的 Web 页面。浏览器会执行一个事务来获取描述页面布局的 HTML“框架”,然后发布另外的 HTTP 事务来获取每个嵌入式图片、图像面板、Java 小程序等。这些嵌入式资源甚至可能位于不同的服务器上。
1.4 报文
HTTP 报文是由一行一行的简单字符串组成的,HTTP 报文都是纯文本。
![](https://img.haomeiwen.com/i8581772/e218087b9a7958a2.jpg)
从 Web 客户端发往 Web 服务器的 HTTP 报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的HTTP 报文。
HTTP报文包括以下三个部分
- 起始行:报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。
- 首部字段:起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。
- 主体:空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给 Web 服务器的数据;响应主体中装载了要返回给客户端的数据。
![](https://img.haomeiwen.com/i8581772/e01f9b0fdda99268.jpg)
1.5 连接
这一部分主要讨论报文是如何通过传输控制协议(TCP)连接从一个地方搬移到另一个地方去的。
1.5.1 TCP/IP
HTTP 是个应用层协议。HTTP 无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议 TCP/IP。
1.5.2 连接、IP地址及端口号
在 HTTP 客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)地址和端口号在客户端和服务器之间建立一条 TCP/IP 连接。
在 TCP 中,你需要知道服务器的 IP 地址,以及与服务器上运行的特定软件相关的TCP 端口号。
通过URL获取HTTP服务器的IP地址和端口号,比如:
-
http://207.200.83.29:80/index.html
第一个 URL 使用了机器的 IP 地址,207.200.83.29 以及端口号 80。 -
http://www.netscape.com:80/index.html
第二个 URL 没有使用数字形式的 IP 地址,它使用的是文本形式的域名,或者称为主机名(www.netscape.com)。主机名就是 IP 地址比较人性化的别称。可以通过一种称为域名服务(Domain Name Service,DNS)的机制方便地将主机名转换为 IP地址。 -
http://www.netscape.com/index.html
最后一个 URL 没有端口号。HTTP 的 URL 中没有端口号时,可以假设默认端口号是 80。
有了 IP 地址和端口号,客户端就可以很方便地通过 TCP/IP 进行通信了。
浏览器连接处理的步骤如下:
- 浏览器从 URL 中解析出服务器的主机名;
- 浏览器将服务器的主机名转换成服务器的 IP 地址;
- 浏览器将端口号(如果有的话)从 URL 中解析出来;
- 浏览器建立一条与 Web 服务器的 TCP 连接;
- 浏览器向服务器发送一条 HTTP 请求报文;
- 服务器向浏览器回送一条 HTTP 响应报文;
- 关闭连接,浏览器显示文档。
1.5.3 使用Telnet实例
可以通过 Telnet 程序直接与 Web 服务器进行对话。通过 Telnet 可以打开一条到某台机器上某个端口的 TCP 连接,然后直接向那个端口输入一些字符。Web 服务器会将 Telnet 程序作为一个 Web 客户端来处理,所有回送给 TCP 连接的数据都会显示在屏幕上。
用 Telnet 获取 URLhttp://www.joes-hardware.com:80/tools.html 所指向的文档,看看会发生什么:
- 首先,查找 www.joes-hardware.com 的 IP 地址,打开一条到那台机器端口 80 的 TCP 连接。Telnet 会为我们完成那些“跑腿儿”的工作。
- 一旦打开了 TCP 连接,就要输入 HTTP 请求了。
- 请求结束(由一个空行表示)之后,服务器会在一条 HTTP 响应中将内容回送并 关闭连接。
1.6 Web的结构组件
除了使用Web 浏览器和 Web 服务器进行相互发送报文来实现基本事务处理外,在因特网上,要与很多 Web 应用程序进行交互。
- 代理
位于客户端和服务器之间的 HTTP 中间实体。 - 缓存
HTTP 的仓库,使常用页面的副本可以保存在离客户端更近的地方。 - 网关
连接其他应用程序的特殊 Web 服务器。 - 隧道
对 HTTP 通信报文进行盲转发的特殊代理。 - Agent 代理
发起自动 HTTP 请求的半智能 Web 客户端。
1.6.1 代理
代理位于客户端和服务器之间,接收所有客户端的 HTTP 请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户来说,这些应用程序就是一个代理,代表用户访问服务器。
![](https://img.haomeiwen.com/i8581772/39e4eef7b9c11714.jpg)
1.6.2 缓存
Web 缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP 代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。
![](https://img.haomeiwen.com/i8581772/c6a9712e4e891bbc.jpg)
1.6.3 网关
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将 HTTP 流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
例如,一个 HTTP/FTP 网关会通过 HTTP 请求接收对 FTP URI 的请求,但通过 FTP协议来获取文档(参见图 1-13)。得到的文档会被封装成一条 HTTP 报文,发送给客户端。
![](https://img.haomeiwen.com/i8581772/bcbe404010354a84.jpg)
1.6.4 隧道
隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP 应用程序。HTTP 隧道通常用来在一条或多条 HTTP 连接上转发非 HTTP 数据,转发时不会窥探数据。
HTTP 隧道的一种常见用途是通过 HTTP 连接承载加密的安全套接字层流量,这样 SSL 流量就可以穿过只允许 Web 流量通过的防火墙了。
![](https://img.haomeiwen.com/i8581772/6361efa5f75545ec.jpg)
1.6.5 Agent代理
用户 Agent 代理(或者简称为 Agent 代理)是代表用户发起 HTTP 请求的客户端程序。所有发布 Web 请求的应用程序都是 HTTP Agent 代理。到目前为止,我们只提到过一种 HTTP Agent 代理:Web 浏览器,但用户 Agent 代理还有很多其他类型。
![](https://img.haomeiwen.com/i8581772/f3cce029674fcec4.jpg)