1.1 HTTP——因特网的多媒体信使
HTTP使用的是可靠的数据传输协议,可以从遍布全世界的Web服务器上将这些信息快迅速、便捷、可靠地搬移到人们桌面上的Web浏览器上去。
1.2 Web客户端和服务器
web内容都是存储在Web服务器上的。Web服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。这些HTTP服务器存储了因特网中的数据,如果HTTP客户端发出请求的话。它们会提供数据。客户端向服务器发送HTTP请求,服务器会在HTTP响应中回送所请求的数据。HTTP客户端和HTTP服务器共同构成了万维网的基本组件。
浏览一个页面时(http://www.oreilly.com/index.html),浏览器会向服务器www.oreilly.com发送一条HTTP请求。服务器会去寻找所期望的对象(index.html),如果成功,就将对象、对象类型、对象长度以及其它一些信息放在HTTP响应中发送给客户端。
1.3 资源
Web服务器是Web资源的宿主。最简单的Web资源就是Web服务器文件系统中的静态文件。这些文件可以包含任意内容:文本文件、HTML文件、微软的Word文件、Adobe的Acrobat文件、JPEG图片文件、AVI电影文件,或所有其他你能够想到格式。
但资源不一定非的是静态文件。资源还可以是根据需要生成内容的软件程序。这些动态内容资源可以根据你的身份、所请求的信息或每天的不同时段来产生内容。
1.3.1 媒体类型
因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型的数据格式标签。最初设计MIME是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。MIME在电子邮件系统中工作的非常好,因此HTTP也采纳了它,用它来描述并标记多媒体内容。
Web服务器会为所有HTTP对象数据附加一个MIME类型。当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型,看看它是否知道应该如何处理这个对象。大多数浏览器都可以处理数百种常见的对象类型:显示图片文件、简析并格式化HTML文件、通过计算机声卡播放音频文件,或者运行外部插件软件来处理特殊格式的数据。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。
HTML格式的文本文档由test/html类型来标记。
JPEG格式的图片为image/jpeg类型。
1.3.2 URI
每个Web服务器资源都有一个名字,这样客户端就可以说明它们感兴趣的资源是什么了。服务器资源名被称为统一资源标识符(URI),在世界范围内唯一标识并定位信息资源。
URI有两种形式,分别称为URL和URN。
1.3.3 URL
统一资源定位符(URL)是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。
包含三个部分:
(1)方案,说明访问资源的协议类型,通常为http协议
(2)服务器的因特网地址
(3)指定了Web服务器上的某个资源
1.3.4 URN
统一资源名(URN) 在实验阶段,未大范围使用。
1.4 事务
客户端是怎么通过HTTP与Web服务器及其资源进行事务处理的。
一个HTTP事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。这种通信是通过名为HTTP报文(HTTP message)的格式化数据块进行的。
1.4.1 方法
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法。这些方法会告诉服务器要执行什么动作。
以下列出五种常见的HTTP方法
GET 从服务器向客户端发送命名资源
PUT 将来自客户端的数据存储到一个命名的服务器资源中去
DELETE 从服务器中删除命名资源
POST 将客户端数据发送到一个服务器网关应用程序
HEAD 仅发送命名资源响应中的HTTP首部
1.4.2 状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。
100~199 信息性状态码
200~299 成功状态码
300~399 重定向状态码
400~499 客户端错误状态码
500~599 服务器错误状态码
300 客户端请求一个实际指向多个资源的URL时会返回这个状态码。
301 在请求的URL已被移除时使用。
302 与301类似
303 告知客户端应该用另一个URL来获取资源。
304 客户端可以通过所包含的请求首部,使其请求变成有条件的。
305 用来说明必须通过一个代理来访问资源。
306 当前未使用
307 与301类似
1.4.3 Web页面中可以包含多个对象
应用程序完成一项任务时通常会发布多个HTTP事务。比如,Web浏览器会发布一系列HTTP事务来获取并显示一个包含了丰富图片的Web页面。这些嵌入式资源甚至可能位于不同的服务器上。因此,一个“Web页面”通常并不是单个资源,而是一组资源的集合。
1.5 报文
HTTP报文包括以下三个部分:
起始行
首部字段
主体
1.6 连接
概要介绍了HTTP报文的构成之后,我们来讨论一下报文是如何通过传输控制协议(TCP)连接从一个地方搬移到另一个地方去的。
1.6.1 TCP/IP
HTTP是个应用层协议。HTTP无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP。
TCP提供了:
(1)无差错的数据传输;
(2)按序传输(数据总是会按照发送的顺序到达);
(3)未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
只要建立了TCP连接,客户端和服务器之间的报文交换就不会丢失、不会被破坏,也不会在接收时出现错序了。
用网络术语来说,HTTP协议位于TCP的上层。HTTP使用TCP来传输其报文数据。与之类似,TCP则位于IP的上层。(HTTP 网络协议栈)
HTTP连接实际上就是TCP连接及其使用规则。TCP流是分段的、由IP分组传送。
TCP的数据是通过名为IP分组(或IP数据报)的小数据块来发送的。HTTP就是“HTTP over TCP over IP”这个协议栈中的最顶层了。其安全版本HTTPS就是在HTTP和TCP之间插入了一个(称为TLS或SSL的)密码加密层。
TCP连接握手需要经过以下几个步骤:
(1)请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组。这个分组中设置了一个特殊的SYN标记,说明这是一个连接请求。
(2)如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明连接请求已被接受。
(3)最后,客户端向服务器回送一条确认信息,通知它连接已成功建立。现代的TCP栈都允许客户端在这个确认分组中发送数据。
TCP的慢启动:TCP数据的传输性能还取决于TCP连接的使用期。TCP连接会随着时间进行自我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐被称为TCP慢启动,用于防止因特网的突然过载和拥塞。
1.6.2 连接、IP地址及端口号
在HTTP客户端向服务器发送报文之前,需要用网际协议(IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。
在TCP中,你需要知道服务器的IP地址,以及在服务器上运行的特定软件相关的TCP端口号。通过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地址比较人性化的别称。可以通过一种称为域名服务(DNS)的机制方便地将主机名转换为IP地址,这样所有问题就都可以解决了。
最后一个URL没有端口号。HTTP的URL中没有端口号时,可以假设默认端口号是80。
有了IP地址和端口号,客户端就可以很方便地通过TCP/IP进行通信了。
基本的浏览器连接处理,步骤如下:
(a)浏览器从URL中解析出服务器的主机名;
(b)浏览器将服务器的主机名转换成服务器的IP地址;
(c)浏览器将端口号(如果有的话)从URL中解析出来;
(d)浏览器建立一条与Web服务器的TCP连接;
(e)浏览器向服务器发送一条HTTP请求报文;
(f)服务器向浏览器回送一条HTTP响应报文;
(g)关闭连接,浏览器显示文档。
1.7 Web的结构组件
我们重点介绍了两个Web应用程序(Web浏览器和Web服务器)是如何相互发送报文来实现基本事务处理的。在因特网上,要与很多Web应用程序进行交互。在本节中,我们将列出其他一些比较重要的应用程序,如下所示:
(1)代理
位于客户端和服务器之间的HTTP中间实体。
代理位于客户端与服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户来说,这些应用程序就是一个代理,代表用户访问服务器。代理还可以对请求和响应进行过滤。
(2)缓存
HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。
Web缓存或代理缓存是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。
客户端从附近的缓存下载文档会比从远程Web服务器下载快得多。HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。
使用缓存有下列优点:
* 缓存减少了冗余的数据传输,节省了你的网络费用。
* 缓存缓解了网络瓶颈的问题。不需要更多的带宽就能够更快地加载页面。
* 缓存降低了对原始服务器的要求。服务器可以更快地响应,避免过载的出现。
* 缓存降低了距离时延,因为从较远的地方加载页面会更慢一些。
缓存的处理步骤:
1) 接收——缓存从网络中读取抵达的请求报文。
2) 解析——缓存对报文进行解析,提取出URL和各种首部。
3)查询——缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)
4)新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。
5)创建响应——缓存会用新的首部和已缓存的主体来构建一条响应报文。
6)发送——缓存通过网络将响应发回给客户端。
7)日志——缓存可选地创建一个日志文件条目来描述这个事务。
(3)网关
连接其他应用程序的特殊Web服务器。
网关是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议。
例如,一个HTTP/FTP网关会通过HTTP请求接收对FTP URI的请求,但通过FTP协议来获取文档。得到的文档会被封装成一条HTTP报文,发送给客户端。
(4)隧道
对HTTP通信报文进行盲转发的特殊代理。
隧道是建立起来以后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序。HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
HTTP隧道的一种常见用途是通过HTTP连接承载加密的安全套接字层(SSL)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。
(5)Agent代理
发起自动HTTP请求的半智能Web客户端。
用户Agent代理是代表用户发起HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTP Agent代理。到目前为止,我们只提到过一种HTTP Agent代理:Web 浏览器,但用户Agent代理还有很多其它类型。
1.8 客户端识别与cookie机制
cookie 是当前识别用户,实现持久会话的最好方式。
cookie的存在也影响了缓存,大多数缓存和浏览器都不允许对任何cookie的内容进行缓存。
1.8.1 cookie的类型
可以笼统的将cookie分为两类:会话cookie和持久cookie。
会话cookie是一种临时cookie,它记录了用户访问站点时的设置和偏好。用户退出浏览器时,会话cookie就被删除了。持久cookie的生存时间更长一些;它们存储在硬盘上,浏览器退出,计算机重启时它们仍然存在。通常会用持久cookie维护某个用户会周期性访问的站点的配置文件或登录名。
会话cookie和持久cookie之间唯一的区别就是它们的过期时间。
1.8.2 cookie是如何工作的
cookie就像服务器给用户贴的“嗨,我叫”的贴纸一样。用户访问一个Web站点时,这个Web站点就可以读取那个服务器贴在用户身上的所有贴纸。
用户首次访问Web站点时,Web服务器对用户一无所知。Web服务器希望这个用户会再次回来,所以想给这个用户“拍上”一个独有的cookie,这样以后它就可以识别出这个用户了。cookie中包含了一个由名字=值,这样的信息构成的任意列表,并通过set-Cookie或Set-Cookie2 HTTP响应(扩展)首部将其贴到用户身上去。
cookie中可以包含任意信息,但它们通常都只包含一个服务器为了进行跟踪而产生的独特的识别码。比如,服务器会将一个表示id="23456"的cookie贴到用户上去。服务器可以用这个数字来查找服务器为其访问者积累的数据库信息。但是,cookie并不仅限于ID号。很多Web服务器都会将信息直接保存在cookie中。浏览器会记住从服务器返回的Set-Cookie或Set-Cookie2首部中的cookie内容,并将cookie集存储在浏览器的cookie数据库中。将来用户返回同一个站点时,浏览器会挑中那个服务器贴到用户上的那些cookie,并在一个cookie请求首部中将其传回去。
1.8.3 不同站点使用不同的cookie
浏览器内部的cookie罐中可以有成百上千个cookie,但浏览器不会将每个cookie都发送给所有的站点。实际上,它们通常只向每个站点发送2~3个cookie。cookie就是由服务器贴到客户端上,由客户端维护的状态片段,只会回送给那些合适的站点。
1.8.4 cookie与会话跟踪
可以用cookie在用户与某个Web站点进行多项事务处理时对用户进行跟踪。电子商务Web站点用会话cookie在用户浏览时记录下用户的购物车信息。
1.8.5 cookie与缓存
缓存那些与cookie事务有关的文档时要特别小心。你不会希望给用户分配一个过去某些用户用过的cookie,或者更糟糕的是,向一个用户展示其他人私有文档的内容。
cookie和缓存的规则并没有很好地建立起来。下面是处理缓存时的一些指导性规则:
* 如果无法缓存文档,要将其标识出来
* 缓存 Set-Cookie 首部时要小心
* 小心处理带有 Cookie首部的请求
1.9 HTTPS——细节介绍
HTTPS是最常见的HTTP安全版本。HTTPS将HTTP协议与一组强大的对称、非对称和基于证书的加密技术结合在一起,使得HTTPS不仅很安全,而且很灵活,很容易在处于无序状态的、分散的全球互联网上进行管理。
1.9.1 HTTPS概述
HTTPS就是在安全的传输层上发送的HTTP。HTTPS没有将未加密的HTTP报文发送给TCP,并通过世界范围内的因特网进行传输,它在将HTTP报文发送给TCP之前,先将其发送了一个安全层,对其进行加密。
HTTP安全层是通过SSL及其现代替代协议TLS来实现的。
1.9.2 建立安全传输
在未加密HTTP中,客户端会打开一条到Web服务器端口80的TCP连接,发送一条请求报文,接收一条响应报文,关闭连接。
在HTTPS中,客户端首先打开一条到Web服务器端口443(默认端口)的连接。一旦建立了TCP连接,客户端和服务器就会初始化SSL层,对加密参数进行沟通,并交换密钥。握手完成以后,SSL初始化就完成了,客户端就可以将请求报文发送给安全层了。在将这些报文发送给TCP之前,要先对其进行加密。
1.9.3 SSL握手
在发送已加密的HTTP报文之前,客户端和服务器要进行一次SSL握手,在这个握手过程中,它们要完成以下工作:
* 交换协议版本号
* 选择一个两端都了解的密码
* 对两端的身份进行认证
* 生成临时的会话密钥,以便加密信道
推荐:图灵程序设计丛书 《HTTP 权威指南》