<HTTP权威指南>记录 ---- HTTP概述
HTTP概述
Web客户端与服务器是如何通信的
HTTP服务器存储了因特网中的数据,如果客户端发出请求的话,它们会提供数据。客户端向服务器发送一条HTTP请求,服务器会去寻找所期望的对象,如果成功,就将对象、对象类型、对象长度、以及其他一些信息放在HTTP响应中发送给客户端。
资源(Web的内容)来自何方
Web服务器是Web资源(resource)的宿主,Web资源是Web内容的源头。最简单的Web资源就是Web服务器文件系统中的静态文件;资源还可以是根据需要生成内容的软件程序,这些动态内容资源可以根据你的身份、所请求的信息或每天的不同时段来产生内容。
因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型(MIME Type)的数据格式标签。Web服务器会在所有HTTP对象数据附加一个MIME类型,当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型,看看它是否知道应该如何处理这个对象。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型。最初设计MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)是为了解决在不同的电子邮件之间搬移报文时存在的问题。
每个Web服务器资源都有一个名字,服务器资源名被成为URI(Uniform Resource Identifier,统一资源标识符)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。给定了URI,HTTP就可以解析出对象。URI有两种形式,分别称为URL和URN。
URL(Uniform Resource Locator,统一资源定位符)是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置,它们可以明确说明如何从一个精确、固定的位置获取资源。大部分URL都遵循一种标准格式,这种格式包含三个部分。现在,几乎所有的URI都是URL。
- 第一部分(http),被称为方案(scheme),说明了访问资源所使用的协议类型,可以告知Web客户端怎样访问资源。
- 第二部分(www.joes-hardware.com),给出了服务器的因特网地址,这部分告知Web客户端资源位于何处。
- 第三部分(/specials/saw-blade.gif),指定了Web服务器上的资源路径,路径说明了请求的是服务器上哪个特定的本地资源。
Web事务是怎样工作的
一个HTTP事务是由一条请求命令(从客户端发往服务器)和一个响应结果(从服务器发回客户端)组成,这种通信是通过名为HTTP报文(HTTP message)的格式化数据块进行的。应用程序完成一项任务时通常会发布多个HTTP事务。
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法,这个方法会告诉服务器要执行什么动作。
每条HTTP响应报文返回时都会携带一个状态码,状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。伴随着每个数字状态吗,HTTP还会发送一条解释性的“原因短语”文本
HTTP通信所使用的报文格式
HTTP报文是由一行一行的简单字符串组成的,HTTP报文是纯文本,不是二进制代码,所以可以方便地对其进行读写。从Web客户端发往Web服务器的HTTP报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的HTTP报文。HTTP请求和响应报文的格式很类似。
# 请求报文 GET /test/hi-there.txt HTTP/1.0 (起始行) ------------------------------- Accept: text/* (首部) Accept-Language: en, fr -------------------------------
# 响应报文 HTTP/1.0 200 OK (起始行) ------------------------------- Content-type: text/plain (首部) Content-length: 19 ------------------------------- Hi! I'm a message! (主体)
报文包括以下三个部分:
- 起始行:报文的第一行就是起始行,在请求报文中用来说明要做什么,在响应报文中说明出现了什么情况。
- 首部字段:起始行后面有多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(: )来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。
- 主体:空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包括任意的二进制数据。当然,主题中也可以包含文本。
底层TCP网络传输
HTTP报文是通过TCP(Transmission Control Protocol,传输控制协议)连接从一个地方搬移到另一个地方去的。HTTP是个应用层协议,HTTP无需操心网络通信的具体细节;把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP。只要建立了TCP连接,客户端和服务器之间的报文交换就不会丢失、不会被破坏,也不会在接收时出现错序了。
TCP提供了:
- 无差错的数据传输;
- 按续传输,数据总是会按照发送的顺序到达;
- 未分段的数据流,可以在任意时刻以任意尺寸将数据发送出去。
在HTTP客户端向服务器发送报文之前,需要通过IP(Internet Protocol,网际协议)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。在TCP中,需要知道服务器的IP地址,以及与服务器上运行的特定软件相关的TCP端口号。主机名就是P地址比较人性化的别称,可以通过一种称为DNS(Domain Name Service,域名服务)的机制方便地将主机名转换为IP地址。HTTP的URL中没有端口号时,可以假设默认端口号是80。
步骤如下:
- 浏览器从URL中解析出服务器的主机名;
- 浏览器将服务器的主机名转换成服务器的IP地址;
- 浏览器将端口号(如果有的话)从URL中解析出来;
- 浏览器建立一条与Web服务器的TCP连接;
- 浏览器向服务器发送一条HTTP报文请求;
- 服务器向浏览器返回一条HTTP响应请求;
- 关闭连接,浏览器显示文档。
不同的HTTP协议版本
现在使用的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: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架构组件
代理
位于客户端和服务器之间的HTTP中间实体。代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改后转发)。代理还可以对请求和响应进行过滤。
缓存
HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程Web服务器下载快的多。HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。
网关
连接其他应用程序的特殊Web服务器。网关(Gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
<p>例如,一个HTTP/FTP网关会通过HTTP请求接收对FTP URI的请求,但通过FTP协议来获取文档。得到的文档会被封装成一条HTTP报文,发送给客户端</p>
隧道
对HTTP通信报文进行盲转发的特殊代理。隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序。HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
HTTP隧道的一种常见用途是通过HTTP连接承载SSL加密的SSL(Secure Sockets Layer,安全套接字层)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。HTTP/SSL隧道收到一条HTTP请求,要求建立一条到目的地址和端口的输出连接,然后在HTTP信道上通过隧道传输加密的SSL流量,这样就可以将其盲转发到目的服务器上去了。
Agent代理
发起自动HTTP请求的半智能Web客户端。用户Agent代理(或者简称为Agent代理)是代表用户发起HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTP Agent代理。例如:Web浏览器。
有些自己会在Web上闲逛的自动用户Agent代理,可以在无人监视的情况下发布HTTP事务并获取内容。这些自动代理的名字通常都很生动,比如"网络蜘蛛"(spiders)或者"Web机器人"(Web robots)。网络蜘蛛会在Web上闲逛,搜集信息以构建有效的Web内容档案,比如一个搜索引擎的数据库或者为比较购物机器人生成的产品目录。