HTTP概述
Web浏览器、服务器和相关的Web应用程序都是通过HTTP相互通信的。HTTP是现代全球因特网中使用的公共语言,初步了解以下几点:
- Web客户端与服务器是如何通信的
- (表示Web内容的)资源来自何方
- Web事务是怎样工作的
- HTTP通信所使用的报文格式
- 底层TCP网络传输
- 因特网上安装的大量HTTP架构组件中的一部分
HTTP-因特网的多媒体信使
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响应中发送给客户端。
Web资源
Web服务器是web资源的宿主,web资源是web内容的源头。最简单的Web资源就是web服务器文件系统中的静态文件。这些文件可以包含任意内容:文本文件、HTML文件、微软的Word文件、JPEG图片文件,或者所有其他你能够想到的格式等。
但资源不一定非得是静态文件,资源还可以根据需要生成内容的软件程序。这些动态内容资源可以根据你的身份、所请求的信息或每天的不同时段来产生内容。它们可以为你显示照相机中活生生的照片,也可以帮你进行股票交易等。总之,所有类型的内容来源都是资源。如下图所示:
媒体类型
因特网上有数千种不同的数据类型,HTTP给每种要通过web传输的对象都打上了名为MIME(Multipurpose Internet Mail Extension)类型(MIME type)的数据格式标签。用它来描述并标记多媒体内容,Web服务器会为所有HTTP对象数据附加一个MIME类型。如下图:
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。常见类型:
- HTML格式的文本文档由text/html类型来标记
- 普通的ASCII文本文档由text/plain类型来标记
- JPEG格式的图片为image/jpeg类型
- GIF格式的图片为image/gif类型
URI
每个Web服务器资源都有一个名字,服务器资源名被统称为统一资源标识符(Uniform Resource Identifier,URI)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。下面是Joe的五金店web服务器上的一个图片资源URI:http://www.joes-hardware.com/specials/saw-blade.gif。下图显示了URI怎样指示HTTP协议访问Joe商店服务器的图片资源。
URI有两种形式,URL和URN。
- 统一资源定位符(URL)是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置,它们可以明确说明如何从一个精确、固定的位置获取资源。
- URN是第二种形式的统一资源名,URN是作为特定内容的唯一名称使用,与目前在资源所在地无关。
大部分URL都遵循一种标准格式,这种格式包括3个部分:
- URL的第一部分被称为方案(scheme),说明了访问资源所使用的协议类型,这部分通常就是HTTP协议(http://)
- 第二部分给出服务器的因特网地址(比如:www.joes-hardware.com)
- 其余部分指定了服务器上的某个资源(比如:/specials/saw-blade.gif)
事务
一个HTTP事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。这种通信是通过名为HTTP报文(HTTP message)的格式化数据块进行的,如下图:
HTTP方法
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法,这个方法会告诉服务器要执行什么动作(比如:获取一个web页面、运行一个网关程序、删除一个文件等)。下图列出了五种常见的HTTP方法。
HTTP状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客服端是否成功,或者是否需要采取其他动作,下表显示了几种常见的状态码。
伴随着每个数字状态码,HTTP还会发送一条解释性的“原因短语”,文本短语主要是为了进行描述,所有的处理过程使用的都是数字码,如下图:
Web资源页面中可以包含多个对象
应用程序完成一项任务时通常会发布多个HTTP事务。比如:Web浏览器会发布一系列HTTP事务来获取并显示一个包含丰富图片的Web页面。浏览器会执行一个事务来获取描述页面布局的HTML框架,然后发布另外的HTTP事务来获取每个嵌入式图片、图像面板、Java小程序等。这些嵌入式资源甚至可能位于不同的服务器上,因此,一个web页面通常并不是单个资源,而是一组资源的集合。如下图所示:
HTTP报文
HTTP报文是由一行一行的简单字符串组成的。HTTP报文都是纯文本,不是二进制代码,下图显示了一个简单事务所使用的HTTP报文。
从Web客户端发往Web服务端额HTTP报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的HTTP报文,HTTP请求和响应报文的格式很类似。
HTTP报文包括以下3个部分:
起始行:报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现什么情况。
首部字段:起始行后面有零个或者多个首部字段,每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束,添加一个首部字段和添加新行一样简单。
主体:空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据;响应主体中转载了要返回给客户端的数据。起始行和首部都是文本形式并且都是结构化的,而主体则不同,主体中可以包含任意的二级制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。
简单的报文实例
图1-8显示了可能会作为某个简单事务的一部分发送的HTTP报文,流浪器请求资源http://www.joes-hardware.com/tools.html.
在图1-8中,浏览器发送了一条HTTP请求报文,这条请求的起始行中有一个GET命令,且本地资源为/tools.html.这条请求说明它使用的是1.0版本的HTTP协议,请求报文没有主体,因为服务器上GET一个简单的文档不需要请求数据。
服务器会回送一条HTTP响应报文,这条报文中包含了HTTP的版本号(HTTP/1.0)、一个成功状态码(200)、一个描述性的原因短语(ok),以及一块响应首部字段,在所有这些内容之后跟着包含了所有请求文档的响应主体。Content-Length说明了响应主体的长度,Content-Type首部说明了文档的MIME类型。
连接
报文是如何通过传输控制协议(Transmission Control Protocol,TCP)连接从一个地方搬移到另外一个地方去的。
TCP/IP
HTTP是应用层协议。HTTP无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP.
TCP提供了:
1:无差错的数据传输
2:按序传输(数据宗是会按照发送的顺序到达)
3:未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
因特网自身就是基于TCP/IP的,TCP/IP是全世界的计算机和网络设备常用的层次化分组网络协议集。TCP/IP隐藏了各种网络和硬件的特点以及弱点,使各种类型的计算机和网络都能够进行可靠地通信。
只要建立了TCP链接,客户端和服务端之间的报文交换就不会丢失、不会破坏,也不会再接受时出现错序。
用网络术语来说,HTTP协议位于TCP的上层,HTTP使用TCP来传输其报文数据,与之类似,TCP则位于IP之上,见下表:
连接、IP地址已经端口号
在HTTP客户端向服务端发送报文之前,需要用网际协议(Internet Protocol,IP)地址和端口号在客户端和服务端之间建立一条TCP/IP连接。
建立一条TCP连接的过程与给公司办公室的某个人打电话的过程类似。首先,要拨打公司的电话号码,这样就能够进入正确的机构。其次,拨打要联系的那个人的分机号。在TCP中,你需要知道服务器的IP地址,以及与服务器上运行的特定软件相关的TCP端口号。
这就行了,但最初怎么获得HTTP服务器的IP地址和端口号呢?当然是通过URL了!我们前面提到过,URL就是资源的地址,所以自然能够为我们提供存储资源机器的IP地址,我们来看几个URL:
http://207.200.83.29:80/index.html
http://www.netscape.com:80/index.html
http://www.netscape.com/index.html
1:第一个URL实验了机器的IP地址,207.200.83.29以及端口号80
2:第二个URL没有使用数字形式的IP地址,它使用的是文本形式的域名,或者称为主机名(www.netscape.com).主机名就是IP比较人性化的别称。可以通过一种称为域名服务(Domain Name Service,DNS )的机制方便地将主机名转换为IP地址,这样所有问题都解决了。
3:最后一个URL没有端口号,HTTP的URL中没有端口号,可以假设默认端口号是80。有了IP地址和端口号,客户端就可以很方便地通过TCP/IP进行通信了。图1-10显示了浏览器是怎样通过HTTP显示位于远端服务器中的某个简单HTML资源。
步骤如下:
1:浏览器从URL中解析出服务器的主机名
2:浏览器将服务器的主机名转换为服务器的IP地址
3:浏览器将端口号(如果有的话)从URL中解析出来
4:浏览器建立一条与Web服务器的TCP连接
5:浏览器向服务器发送一条HTTP请求报文
6:服务器向浏览器回送一条HTTP响应报文
7:关闭连接,浏览器显示文档
Web结构组件
1:代理
位于客户端与服务器之间的HTTP中间实体
HTTP代理服务器是web安全应用集成以及性能优化的重要模块。如下图:代理位于客户端和服务端之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户而言,这些应用程序就是一个代理,代表用户访问服务器。
2:缓存
HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方
Web缓存(web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程web服务器下载快的多,HTTP定义了很多功能,使得缓存更加高效。如下图:
3:网关
链接其他应用程序的特殊Web服务器
网关是一种特殊的服务器,作为其它服务器的中间实体,通常用于将HTTP流量转换成其他的协议。网关接受请求时就好像自己是资源的远端服务器一样,客户端可能并不知道自己正在与一个网关通信。
例如,一个HTTP/FTP网关会通过HTTP请求接收对FTP URI的请求,但通过FTP协议来获取文档,得到的文档会被封装成一条HTTP报文,发送给客户端。
4:隧道
对HTTP通信报文进行盲目转发的特殊代理
隧道是建立起来之后,就会在两条连接之间对原始数据进行盲目转发的HTTP应用程序。HTTP隧道通常用来在一条或者多条HTTP连接上转发非HTTP数据,转发不会窥探数据。
HTTP隧道的一种常见用途是通过HTTP连接承载加密的安全套接字层(SSL,Secure Sockets Layer)流量,这样SSL流量就可以穿过只允许web流量通过的防火墙。如下图:HTTP/SSL隧道收到了一条HTTP请求,要求建立一条到目的地址和端口输出连接,然后在HTTP信道上通过隧道传输加密的SSL流量,这样就可以将其盲转发到目的服务器上去了。
5:Agent代理
发起自动HTTP请求的半智能Web客户端
用户Agent代理是代表用户发起HTTP请求的客户端程序。所有发布web请求的应用程序都是HTTP Agent代理。到目前为止,我们只提到一种HTTP Agent代理:web浏览器,但用户Agent代理还有很多其他类型。
参考
《HTTP权威指南》