HTTP概述

143 阅读14分钟

第一部分 HTTP:Web基础

HTTP权威指南读书笔记

HTTP概述

HHTP

每天,都有数以亿万计的 JPEG 图片、HTML页面、文本文件、MPEG 电影、WAV 音频文件、Java 小程序和其他资源在因特网上游弋。HTTP可以从遍布全世界的Web服务器上将这些信息块迅速、便捷、可靠地搬移到人们桌面上的Web浏览器上去。

HTTP使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,它也能够确保数据在传输的过程中不会被损坏或产生混乱。

Web客户端和服务器

Web内容都是存储在Web服务器上的。Web服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。这些HTTP服务器存储了因特网中的数据,如果HTTP客户端发出请求的话,它们会提供数据。客户端向服务器发送HTTP请求,服务器会在HTTP响应中回送所请求的数据。

资源

Web服务器是Web资源(Webresource)的宿主。Web资源是Web内容的源头。最简单的Web资源就是Web服务器文件系统中的静态文件。这些文件可以包含任意内容:文本文件、HTML文件、微软的Word 文件、Adobe 的 Acrobat 文件、JPEG 图片文件、AVI 电影文件,或所有其他你能够想到的格式。

但资源不一定非得是静态文件。资源还可以是根据需要生成内容的软件程序。这些动态内容资源可以根据你的身份、所请求的信息或每天的不同时段来产生内容。

媒体类型

因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为 MIME类型(MIME type)的数据格式标签。

Web服务器会为所有HTTP对象数据附加一个 MIME 类型(参见图1-3)。当Web浏览器从服务器中取回一个对象时,会去查看相关的 MIME 类型,看看它是否知道应该如何处理这个对象。大多数浏览器都可以处理数百种常见的对象类型:显示图片文件、解析并格式化HTML文件、通过计算机声卡播放音频文件,或者运行外部插件软件来处理特殊格式的数据。

MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。

  • HTML格式的文本文档由text/html类型来标记。
  • 普通的 ASCII 文本文档由text/plain类型来标记。
  • JPEG 格式的图片为image/jpeg类型。
  • GIF 格式的图片为image/gif类型。
  • Apple 的 QuickTime 电影为video/quicktime类型。
  • 微软的 PowerPoint 演示文件为application/vnd.ms-powerpoint类型。

常见的 MIME 类型有数百个,实验性或用途有限的 MIME 类型则更多。

image.png

URI

每个Web服务器资源都有一个名字,这样客户端就可以说明它们感兴趣的资源是什么了。服务器资源名被称为统一资源标识符(Uniform Resource Identifier,URI)。URI 就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。

URI 有两种形式,分别称为 URL和 URN。

URL

统一资源定位符(URL)是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。

image.png

  • URL的第一部分被称为方案(scheme),说明了访问资源所使用的协议类型。这部分通常就是HTTP协议(http://)。
  • 第二部分给出了服务器的因特网地址(比如,www.joes-hardware.com)
  • 其余部分指定了Web服务器上的某个资源(比如,/specials/saw-blade.gif)

现在,几乎所有的 URI 都是 URL。

URN

URI 的第二种形式就是统一资源名(URN)。URN 是作为特定内容的唯一名称使用的,与目前的资源所在地无关。使用这些与位置无关的 URN,就可以将资源四处搬移。通过 URN,还可以用同一个名字通过多种网络访问协议来访问资源。

事务

我们来更仔细地看看客户端是怎样通过HTTP与Web服务器及其资源进行事务处理的。一个HTTP事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。这种通信是通过名为HTTP报文(HTTPmessage)的格式化数据块进行的。

image.png

方法

HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTPmethod)。每条HTTP请求报文都包含一个方法。这个方法会告诉服务器要执行什么动作(获取一个Web页面、运行一个网关程序、删除一个文件等)。

常见HTTP方法: image.png

状态码

每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。

常见状态码: image.png

Web页面中可以包含多个对象

应用程序完成一项任务时通常会发布多个HTTP事务。比如,Web浏览器会发布一系列HTTP事务来获取并显示一个包含了丰富图片的Web页面。浏览器会执行一个事务来获取描述页面布局的HTML“框架”,然后发布另外的HTTP事务来获取每个嵌入式图片、图像面板、Java 小程序等。这些嵌入式资源甚至可能位于不同的服务器上,如图1-6所示。因此,一个“Web页面”通常并不是单个资源,而是一组资源的集合。

报文

HTTP报文是由一行一行的简单字符串组成的。HTTP报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写。

image.png 从Web客户端发往Web服务器的HTTP报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的HTTP报文。HTTP请求和响应报文的格式很类似。

HTTP报文包括以下三个部分。

  • 起始行

    报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。

  • 首部字段

    起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。

  • 主体

    空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。

简单的报文实例

image.png

连接

概要介绍了HTTP报文的构成之后,我们来讨论一下报文是如何通过传输控制协议(Transmission Control Protocol,TCP)连接从一个地方搬移到另一个地方去的。

TCP/IP

HTTP是个应用层协议。HTTP无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议 TCP/IP。

TCP提供了:

  • 无差错的数据传输
  • 按序传输(数据总是会按照发送的顺序到达)
  • 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)

因特网自身就是基于 TCP/IP的,TCP/IP是全世界的计算机和网络设备常用的层次化分组交换网络协议集。TCP/IP隐藏了各种网络和硬件的特点及弱点,使各种类型的计算机和网络都能够进行可靠地通信。

只要建立了 TCP连接,客户端和服务器之间的报文交换就不会丢失、不会被破坏,也不会在接收时出现错序了。

HTTP使用 TCP来传输其报文数据。

image.png

连接、IP地址及端口号

在HTTP客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)地址和端口号在客户端和服务器之间建立一条 TCP/IP连接。

建立一条 TCP连接的过程与给公司办公室的某个人打电话的过程类似。首先,要拨打公司的电话号码。这样就能进入正确的机构了。其次,拨打要联系的那个人的分机号。

在 TCP中,你需要知道服务器的 IP地址,以及与服务器上运行的特定软件相关的 TCP端口号。

这就行了,但最初怎么获得HTTP服务器的 IP地址和端口号呢?当然是通过 URL了!我们前面曾提到过,URL就是资源的地址,所以自然能够为我们提供存储资源的机器的 IP地址。

image.png

步骤:

  1. 浏览器从 URL中解析出服务器的主机名
  2. 浏览器根据DNS域名解析服务器将服务器的主机名转换成服务器的 IP地址
  3. 浏览器将端口号(如果有的话)从 URL中解析出来
  4. 浏览器建立一条与Web服务器的 TCP连接
  5. 浏览器向服务器发送一条HTTP请求报文
  6. 服务器向浏览器回送一条HTTP响应报文
  7. 关闭连接,浏览器显示文档
使用Telnet实例

由于HTTP使用了 TCP/IP传输协议,而且它是基于文本的,没有使用那些难以理解的二进制格式,因此很容易直接与Web服务器进行对话。

Telnet 程序可以将键盘连接到某个目标 TCP端口,并将此 TCP端口的输出回送到显示屏上。Telnet 常用于远程终端会话,但它几乎可以连接所有的 TCP服务器,包括HTTP服务器。

可以通过 Telnet 程序直接与Web服务器进行对话。通过 Telnet 可以打开一条到某台机器上某个端口的 TCP连接,然后直接向那个端口输入一些字符。Web服务器会将 Telnet 程序作为一个Web客户端来处理,所有回送给 TCP连接的数据都会显示在屏幕上。

协议版本

  • 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后继结构的原型建议,它重点关注的是性能的大幅优化,以及更强大的服务逻辑远程执行框架。

Web的结构组件

在因特网上,要与很多Web应用程序进行交互。在本节中,我们将列出其他一些比较重要的应用程序,如下所示。

  • 代理

    位于客户端和服务器之间的HTTP中间实体。

  • 缓存

    HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。

  • 网关

    连接其他应用程序的特殊Web服务器。

  • 隧道

    对HTTP通信报文进行盲转发的特殊代理。

  • Agent 代理

    发起自动HTTP请求的半智能Web客户端。

代理

首先我们来看看HTTP代理服务器,这是Web安全、应用集成以及性能优化的重要组成模块。

代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户来说,这些应用程序就是一个代理,代表用户访问服务器。

image.png

出于安全考虑,通常会将代理作为转发所有Web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。比如,在企业中对下载的应用程序进行病毒检测,或者对小学生屏蔽一些成人才能看的内容。

缓存

Web缓存(Webcache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。

image.png

客户端从附近的缓存下载文档会比从远程Web服务器下载快得多。HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。

Agent代理

用户 Agent 代理(或者简称为Agent 代理)是代表用户发起HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTPAgent 代理。到目前为止,我们只提到过一种HTTP Agent 代理:Web浏览器,但用户 Agent 代理还有很多其他类型。

比如,有些自己会在Web上闲逛的自动用户 Agent 代理,可以在无人监视的情况下发布HTTP事务并获取内容。这些自动代理的名字通常都很生动,比如“网络蜘蛛”(spiders)或者“Web机器人”(Webrobots)。网络蜘蛛会在Web上闲逛,搜集信息以构建有效的Web内容档案,比如一个搜索引擎的数据库或者为比较购物机器人生成的产品目录。

本章中,我们重点介绍了作为多媒体传输协议使用的HTTP。概要说明了HTTP是怎样使用 URI 来命名远程服务器上的多媒体资源的,粗略介绍了如何利用HTTP请求和响应报文操纵远程服务器上的多媒体资源,最后考察了几种使用HTTP的Web应用程序。