http概述(Http权威指南)
1.1 http-因特网的多媒体信使。
1.2 web客户端与服务器
web内容都是存储在web服务器上的。web服务器所使用的是HTTP协议,因此被称为web服务器。客户端向服务器发送请求,服务器提供数据。

1.3 资源
web服务器是web资源的宿主。web资源是web内容的源头。资源可以是静态与动态。
1.3.1媒体类型
因特网上数据类型很多,Http仔细给每种通过web传输的对象打上了MIME类型的数据格式标签。MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初是为了解决在不同邮件系统中搬运文件的问题,后来HTTP采用了它。
web服务器会为所有的HTTP对象数据附加一个MIME类型,如:
Content-type: image/jpeg

当web浏览器从服务器中取回一个对象时,回去查看相关的MIME类型,看看它是否知道如何处理这个对象。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。
html的文档类型: test/html
普通的ascii文本文档类型: text/plain
jpeg版本的图片:image/jpeg
gif格式的图片: image/gif
1.3.2 URI
服务器资源名称被称为同一资源标志符(Uniform Resource Identifier ,URI).
URI就像因特网上的邮政地址一样,在世界范围内唯一标志并且定位信息资源,例如:
http://www.joes-hardware.com/specials/saw-blade.gif

"http" 代表使用http协议
"www.joes-hardware.com" 进入www.joes-hardware.com
"/specials/saw-blade.gif" 资源名称为/specials/saw-blade.gif
URI有两种形式,分为URL和URN。
1.3.3 URL
统一资源定位符(URL)是资源标识符最常见的形式。描述了一台特定服务器上某资源的特定位置。可以明确说明如何从一个精确、固定的位置获取资源,如:
http://www.oreilly.com/index.html O'Reilly & Associate公司的主URL
http://www.yahoo.com/images/logo.gif Yahoo!的web站点标识的URL
大部分的URL都遵循一种标准格式,这种格式分为三个部分:
.URL的第一分为被称为方案(scheme),说明了访问资源所使用的协议类型。这部分通常就是HTTP协议(http://)
.第二部分给出了服务器的因特网地址(例如,www.joes-hardware.com)
.剩余部分指定了Web服务器上的某个资源(比如,/specials/saw-blade.gif)
现在,几乎所有的URI都是URL
1.3.4 URN
URI的第二种形式就是统一资源名(URN)。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关。通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。如,不论因特网标准文档RFC 2141位于何处,都可以使用下列URN来命名它:
urn:ietf:rfn:2141
URN仍然处于试验阶段,还未大范围使用。
1.4 事务
客户端是怎么通过HTTP与Web服务器及其资源进行事务处理的。一个HTTP事务由一条请求命令和一个响应结果组成。这种通信是通过名为HTTP报文(HTTP message)的格式化数据块进行的。如:
客户端--> GET /specials/saw-blade.gif HTTP/1.0 Host:www.joes-hardware.com
服务器:HTTP/1.0 200 OK Content-type: image/gif Content-length: 8572

1.4.1 方法
HTTP支持集中不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条Http请求报文都包含一个方法,这个方法会告诉服务器要执行什么动作(获取一个web页面、运行一个网管程序、删除一个文件等)。5种常见的HTTP方法:
GET 从服务器向客户端发送命名资源
PUT 将来自客户端的数据存储到一个命名的资源中去
DELETE 从服务器中删除命名资源
POST 将客户端数据发送到一个服务器网关应用
HEAD 仅发送命名资源响应中的HTTP头部
1.4.2 状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数子的代码,告知客户端请求是否成功,或者是否需要采取其他动作。几种常见的HTTP状态码:
200 OK.文档正确返回
302 Redirect(重定向)。到其他地方去获取资源
404 Not Found(没找到)。无法找到这个资源
伴随着每个数字状态码。HTTP还会发送一条解释性的“原因短语”文本。包含文本短语主要是为了进行描述,所有处理过程中使用的都是数字码。
1.4.3 web页面可以包含多个对象
引用程序完成一项任务时通常会发布多个HTTP事务。一个"web页面"通常不是单个资源,而是一组资源的集合。
1.5 报文
现在快速浏览下HTTP请求和相应报文的结构。
Http报文是由一行一行的简单字符串组成的。Http报文都是存文本,不是二进制代码,所以人们可以很方便对其进行读写。例如,一个简单事务使用的HTTP报文:
从web客户端发送web服务器的HTTP报文称为请求报文(request message)。从服务器发往客户端的报文称为相应报文(response message),此外没有其他类型的HTTP报文。Http请求和响应报文的格式很类似。

HTTP报文包括以下三个部分:
起始行
报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。
首部字段
起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间使用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和条件新列一样简单。
主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给web服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体可以包含任意的二进制数据,当人主体中也可以包含文本
简单的报文实例
浏览器发送了一条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.6.2 连接、IP地址及端口号
在HTTP客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。
建立一条TCP连接的过程类似于公司办公司的某个人打电话。首先,要拨打公司的电话号码,这样就能进入正确的机构了;其次,拨打要联系的那个人的分机号。
在TCP中,你需要知道服务器的IP地址,以及服务器上运行的特定软件相关的TCP端口号。
这就行了。但最初怎么获得HTTP服务器的IP地址和端口号呢?当然是通过URL了!我们前面提到,URL就是资源的地址,所以自然能为我们提供存储资源的机器的IP地址。看几个IP地址:
http://207.200.83.29:80/index.html
http://www.netscape.com:80/i8ndex.html
http://www.netscape.com/index.html
第一个URL使用了机器的IP地址,207.200.83.29以及端口号80
第二个URL没有使用数字形式的IP地址,它使用的是文本形式的域名,或者称为主机名(www.netscape.com)。主机名就是IP地址比较人性化的别称。可以通过一种称为域名服务(Domain Name Service,DNS)的机制方便地将主机名转换为IP地址,这样所有问题就都解决了.
最后一个URL没有端口号。HTTP的URL中没有端口号时,可以假设默认端口号是80
有了IP和端口号,客户端就可以很方便地通过TCP/IP进行通信了。下图中显示了浏览器是怎么通过HTTP显示位于远端服务器中的某个简单的HTML资源的。
步骤如下:
1、浏览器从URL中解析出服务器的主机名
2、浏览器将服务器的主机名转换成服务器的IP地址
3、浏览器将端口号(如果有的话)从URL中解析出来
4、浏览器建立一条与web服务器的TCP连接
5、浏览器想服务器发送一条HTTP请求报文
6、服务器向浏览器回送一条HTTP响应报文
7、关闭连接,浏览器显示文档
1.7 协议版本
现在使用的HTTP协议有几个版本。Http引用程序尽量健全地处理各种不同的HTTP协议变体。目前仍然在使用的版本如下:
HTTP/0.9
http的1991原型版本称为HTTP/0.9。这个协议有很多重要的设计缺陷,只是应用于与老客户端的交互。HTTP/0.9只支持GET方法,不支持MIME类型、HTTP首部或者版本号。它的设计初衷是为了获取简单的HTML对象。
HTTP/1.0
1.0是第一个得到广泛使用的HTTP版本。HTTP/1.0添加了版本号、各种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是当前正在使用的HTTP版本。
HTTP-NG(又名HTTP/2.0)
HTTP-NG是HTTP/1.1后继结构的原型建议,它重点关注的是性能的大幅优化,以及更强大的服务逻辑远程执行框架
1.8 web的结构组件
本章中重点介绍了两个Web引用程序(Web浏览器与Web服务器)是如何互相发送报文来实现基本事务处理的。在因特网上,要与很多Web应用程序进行交互。在本节中,我们将列出其他的一些比较重要的应用程序,如下:
代理
位于客户端和服务器之间的HTTP中间实体
缓存
HTTP的仓库,使常用页面的副班可以保存在离客户端更近的地方
网关
连接其他应用程序的特殊web服务器
隧道
对HTTP通信报文进行盲转发的特殊代理
Agent代理
发起自动HTTP请求的半智能Web客户端
1.8.1 代理
HTTP代理服务器,这是Web安全、应用集成以及性能优化的重要组成模块。
如图所示,代理位于客户端与服务器之间,接受所有客户端的HTTP请求,并将这些请求转发给服务器(可能中途对请求修改)。对用户来说,这些应用程序就是一个代理,代表用户访问服务器。
处于安全考虑,通常会将代理作为转发所有web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤,比如在企业中对下载的应用程序进行病毒检测。

1.8.2 缓存
Web缓存(web cache)或者代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程web服务器下载快得多

1.8.3 网关
网关(gataway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通讯。
例如,一个HTTP/FTP网关会通过HTTP请求接受对FTP URI的请求,但通过FTP协议来获取文档。得到的文档就会被疯转成一条HTTP报文,发送给客户端

1.8.4 隧道
隧道(tunnel)是简历起来之后,就会在两条链接之间对原始数据进行盲转发的HTTP应用程序。HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
HTTP隧道的一种常见用途是通过HTTP链接承载加密的安全套接层(SSL,Secure Sockets Layer)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了

18.5 Agent代理
用户Agent代理(或者简称为Agent代理)是代表用户发起到HTTP请求的客户端程序。所有发布Web请求的应用程序丢失HTTP Agent。到目前为止,我们只提到过一种HTTP agent代理:web浏览器,但用户agent代理还有很多其他类型。
比如,有些自己会在web上闲逛的自动用户Agent代理,可以在无人见识的情况下发布HTTP事务并获取内容,比如“网络蜘蛛”

浙公网安备 33010602011771号