1.1HTTP——因特网的多媒体信使
HTTP可以从世界各地的Web服务器上将各种图片、html、视频等互联网资源显示在web浏览器上。使用HTTP通讯能够保证数据在传输过程中不被损坏。
1.2Web客户端和服务器
我们在浏览一个页面http://www.oreilly.com/index.html
时,浏览器会向服务器www.oreilly.com
发送一条http请求,参见图1-1。服务器会寻找期望的对象,本例为/index.html
。如果成功,就将对象、对象类型、对象长度以及其他一些信息放在http响应中发送给客户端。
1.3资源
Web服务器是Web资源(Web resource)的宿主,资源包括静态文件,例如html、视频、文件以外,还包括动态生成的资源。
1.3.1媒体类型
因特网上有数千种不同的数据类型,Web服务器会为所有的对象数据附加一个MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)类型(参见图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等
1.3.2URI
Web服务器上的每个资源都有一个名字,他们被称为统一资源标识符(Uniform Resource Identifier,URI)。这是Joe的五金商店的Web服务器上一个图片资源的URI:http://www.joes-hardware.com/specials/saw-blade.gif
图1-4显示了URI是怎样指示HTTP协议去访问Joe商店的图片资源的。给定了URI,HTTP就可以解析出对象。
URI有两种形式,分别称为URL和URN
1.3.3URL
统一资源定位符(URL)是资源标识符最常见的形式。大部门URL都遵循一种标准格式,这种格式包含三个部分:
- URL的第一部分被称为方案(scheme),说明了访问资源所使用的协议类型。这部分通常就是HTTP协议(还有ftp协议等)
- 第二部分给出了服务器的因特网地址,比如:
www.joes-hardware.com
- 第三部分指定了web服务器上的某个资源,比如:
/specials/saw-blade.gif
现在,几乎所有的URI都是URL
1.3.4URN
URI的第二种形式就是统一资源名(URN)。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关使用这些与位置无关的URN,就可以将资源四处搬移,通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。
比如,不论因特网标准文档PFC2141位于何处,(甚至可以将其复制到多个地方),都可以用下列URN来命名它:urn:ietf:rfc:2141
URN仍然处于试验阶段,还未大范围使用。URN需要一个支撑架构来解析资源的位置,而此类架构的缺乏也延缓了其被采用的进度。本书的其余部分讨论的基本上是URL
1.4事务
一个HTTP事务由一条请求命令和一条响应结果组成,这种通信通过名为http报文(HTTP message)的格式化数据块进行的,如图1-5所示。
1.4.1方法
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。它会告诉服务器要执行什么动作,例如:获取web页面、运行网关程序、删除文件等。表1-2列出了五种常见的HTTP方法
1.4.2状态码
每条HTTP响应都会携带一个三位数字的状态码,用于告知客户端此次响应的状态。
HTTP还会发送一条解释性的“原因短语”,目的是为了进行简单描述。参见上图1-5。
1.5报文
HTTP报文(HTTP message)分为请求报文(request message)和响应报文(response message),他们的格式很类似。
HTTP报文包括以下三个部分
- 起始行:报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文说明了响应情况
- 首部字段:起始行后面有零个或多个首部字段,每个字段都为key:value形式。便于解析,两者用冒号(:)分隔。首部以一个空行结束。
-
主体
请求主体包括发送给web服务器的数据,响应主体包括返回给客户端的数据。起始行和首部都是文本形式且是结构化的,而主体不是,主体可以包含任意的二进制数据(如:图片、视频、音频、软件程序、文本等)。
一个简单的报文实例
图1-8中,浏览器请求资源http://www.joes-hardware.com/tools.html
。
HTTP请求
- 起始行:有一个GET命令,且本地资源为/tools.html,使用1.0版的http协议。
- 请求首部:User-agent包含了请求的浏览器类型、操作系统、使用语言等。大多数浏览器发起的请求中,User-agent为Mozilla/...开头,一些爬虫软件则不是。我们可以通过此信息初步判断请求是否为浏览器发起,参考HTTP 协议的User-Agent相关信息;
Host:请求的域名;Accept表示支持的MIME类型,从前往后代表优先顺序;
Accept-language:表示支持的语言类型。参考详细解读HTTP请求头 - 请求主体:没有主体。
HTTP响应
- 起始行:http版本(HTTP/1.0)、成功状态码(200)、描述性的原因短语(OK)
- 响应首部:Content-length:响应主体的长度;Content-type:说明了响应的MIME类型。
- 响应主体:html页面
1.6连接
介绍了HTTP报文的构成之后,我们讨论报文是如何通过传输控制协议(Transmission Control Protocol,TCP)连接从一个地方搬移到另一个地方去。
1.6.1TCP/IP
HTTP是个应用层协议。HTTP无需操心网络通信的具体细节,它把联网的细节都交给了TCP/IP。TCP提供了:
- 无差错的数据传输;
- 按序传输(数据总是会按照发送的顺序到达)
- 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
HTTP协议位于TCP的上层,HTTP使用TCP来传输其报文数据。TCP位于IP的上层。
1.6.2连接、IP地址及端口号
在HTTP客户端向服务器发送报文之前,需要用网际协议(Internet protocol,IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。
建立TCP连接和给公司办公司某个人打电话类似。首先拨打公司电话,进入正确的机构后,拨打要联系的那个人的分机号。在TCP中,需要知道服务器的IP地址,以及与服务器上运行的程序的TCP端口号。我们通过URL就能获取到这些信息。
几个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使用了域名(或称为主机名),可以通过域名服务(Domain Name Service,DNS)的机制将主机名转换为IP地址。
第三个URL没有端口号,如果HTTP请求访问的URL没有端口号,默认访问80端口。
1.6.3使用Telnet实例
我们可以通过Telnet程序打开一条道某台机器某个端口的TCP连接,然后向它输入一些字符来直接和web服务器进行对话。web服务器会将Telnet程序作为一个web客户端来处理。
我们用Telnet与一个世纪的web服务器进行交互:使用Telnet获取http://www.joes-hardware.com:80/tools.html
所指向的文档(读者可以换一个URL,我在编写此读书笔记的时候,该网站已经不维护了)
例1-1显示了对http://www.joes-hardware.com:80/tools.html
的HTTP请求实例,我们输入的内容用粗体字表示
1.7协议版本
1.8web的结构组件
本章的前部分,我们重点介绍了两个web应用程序:web浏览器和web服务器。还有其他的应用如下:
- 代理:位于客户端和服务器之间的HTTP中间实体
- 缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方
- 网关:连接其他应用程序的特殊web服务器
- 隧道:对HTTP通信报文进行盲转发的特殊代理
- Agent代理:发起自动HTTP请求的半智能web客户端
1.8.1代理
HTTP代理服务器是web安全、应用集成以及性能优化的重要组成模块。
如图1-11,代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户来说,代理服务器代表用户访问服务器
出于安全考虑,通常会将代理作为转发所有web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。比如对下载的应用进行病毒检测,屏蔽网站等。
1.8.2缓存
web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器。可以将经过代理传送的常用文档复制保存起来,下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。
客户端从附近的缓存下载文档会比从远程web服务器下载快得多。
1.8.3网关
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议。网关接收请求时就好像自己是资源的源端服务器一样,客户端可能并不知道自己正在与一个网关进行通信。
例如,一个HTTP/FTP网关会通过HTTP请求接收对FTP URI的请求,但通过FTP协议来获取文档。得到的文档会被封装成一条HTTP报文,发送给客户端。
1.8.4隧道
HTTP隧道(tunnel)的一种常见用途是通过HTTP连接承载加密的安全套接字层(secure sockets layer ssl)流量,这样SSL流量就可以穿过只允许web流量通过的防火墙了。如图1-14,HTTP/SSL隧道收到一条HTTP请求,要求建立一条到目的地址和端口的输出连接,然后在HTTP通过上通过隧道传输加密的SSL流量,这样就就可以将其盲转发到目的服务器上去了。
1.8.5Agent代理
Agent代理是代表用户发起HTTP请求的客户端程序。所有发布web请求的应用程序都是HTTP Agent代理。