(本文参考课本是《HTTP权威指南》,文中的书写结构是根据自己的阅读理解的个人思路,如有不懂可以自行参考原书)
第一章 HTTP概述
1.1 Web客户端和服务器基本结构
HTTP是因特网的多媒体信使,HTTP是如何传输web流量如下,图1-1
Web内容存储在Web服务器上的,Web服务器所使用的HTTP协议,因此被称为HTTP服务器。
HTTP服务器存储因特网中的数据,如果HTTP客户端发出请求,它会提供数据。
如图1-1,客户端向服务器发送HTTP请求,服务器会在HTTP响应中回送所请求数据。
那么我们看下上面结构中各部分。
1.1.1 资源
Web服务器是Web资源(Web sersource)的宿主。Web是Web内容的源头。
最简单的Web资源就是Web服务器文件系统中的静态文件。例如:文本文件,HTML文件,AVI电影文件等。
除此之外,还有动态内容资源可以每天不同时间段产生内容。如监控录像,股票交易,搜索的房产数据等。
此外,电子表格,本地网络Web网关,搜索引擎都是一种资源
那么,这些数据有不同的类型,那么HTTP如何在进行区分?
1.2 MIME类型
HTTP给每种要通过Web传输的对象打上MIME类型(MIME type)的数据格式标签。
注意:MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)是为了解决子不同的电子邮件系统之间搬移报文时存在的问题。
Web服务器会对所有HTTP对象数据附加一个MIME类型(参考图1-3).当Web浏览器从服务器中取回对象是,会查看相关MIME类,看看它是否知道如何处理这个对象。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔
例如:
HTML格式的文本文档由text/html类型来标记
JPEG版本的图片为image/jpeg;类型
附录D中回提及完整的MIME类型列表。
(如果需要可以留下私信回复我,或者请自行下载HTTP权威指南。当然是第二种比较方便啦)
我们知道了资源类型,可是每个资源的名字又该如何命名?
1.3. URI
服务器资源名被称为统一资源标识符(Uniform Resource Identifier,URI)
URI就像因特网上的邮件地址,在世界范围内容为唯一表示并定位信息资源。看图1-4
例如:这是Joe的五金店Web网站上一个图片的资源地址如下:
http://www.joes-hardware.com/specials/saw-blade.gif
URI有两种那个形式,分别是URL和URN。下面分别认识下:
1.3.1 URL
统一资源定位符(URL)是资源表示符最常见的形式。
URL描述的一台特定服务其上某资源的特定位置。
它们可以说明如何从一个精确,固定的位置获取资源。
(问题:固定的位置,有没有资源是变动位置?我们如何处理?URN)
图 1-4 显示了URL如何精确说明某个资源的位置以及如何去访问。
表1-1 显示了几个URL实例
URL的标准格式:
1.方案(scheme)。说明访问资源使用的协议类型,通常是HTTP协议(http://)
2.服务器的因特网地址 。如www.joes-hardware.com
3.指定Web服务器上的某个资源(比如,/specials/saw-blade.gif)
如今,几乎URI都是URL
1.3.2 URN
统一资源名(URN):作为特定内容的唯一的名称使用的,与资源所在地无关。
使用这些与位置无关的URN,就可以将资源四处搬运。
通过URN,还可以通过一个名字通过多种网络访问协议来访问资源。
例如:因特网标准文档RFC 2141位于何处(甚至可以复制到多地),都可以用下了URN命名它:
urn:ietf:rfc:2141
注意:目前URN还处于试验结点,还未大范围使用。(第2章会详细地讨论URN,其他部分讨论URL)
那么客户端怎么通过HTTP与Web服务器及其资源进行事务处理呢?
1.4. 事务处理
HTTP事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。
这种同行通过HTTP报文(HTTP message)的格式化数据块进行的,如图1-5所示
那么在HTTP命令或方法有哪些呢?
1.4.1 HTTP方法
在HTTP请求报文都包含一个方法,这个方法会告诉要执行什么动作(获取一个Web网页,运行一个网关,删除一个文件等)
表1-2 列出了五种常见的HTTP方法(第三章会详细讨论HTTP方法)
(这部分对于Html表单的传输理解,有一定帮助)
那么当服务器接收到请求时,通过什么方式反馈HTTP响应?
1.4.2 状态码
每条HTTP告之响应报文返回时会携带一个状态码。
状态码是一个三位数字代码,告知客户端是否成功,或者是否需要采取其他动作。
表1-3 显示了几个常见的状态码
伴随每个数字状态码,HTTP还会发送一条解释性的“原因短语”文本(图1-5)
包含文本短语主要为了进行描述,所有的处理过程使用的数字码
HTTP软件处理下列状态码和原因短语的方式是一样的。
第3章会详细解释HTTP状态码
1.4.3 Web页面中可以包含多个对象 ##
应用程序完成一项任务通常会发布多个HTTP事务。
比如:Web浏览器会发布一系列事务获取页面图片。浏览器会执行一个事务来获取秒数网页布局的Html框架,然后发布另外的HTTP事务来获取每个嵌入图片等等。如图1-6所示。
因此,一个"Web页面"通常并不是单个资源,而是一组资源的集合
1.5 报文
HTTP请求和响应报文的结构。第三章会深入研究HTTP报文
HTTP报文时由一行一行的简单字符串组成。
HTTP报文都是纯文本,不是二进制代码,所以人们可以方便对其进行读写。
图1-7显示了一个简单事务所使用的HTTP报文
HTTP报文分类:
请求报文(request message):从Web客户端到Web服务器的HTTP报文
响应报文(response message):从服务器发往客户端的报文
以上两个报文的格式类似。
HTTP报文包括三部分:
1.起始行
报文的第一行是起始行,在请求报文中用来说明要做什么,
在响应报文中,说明出现了什么情况。
2.首部字段
其实行后面有0个或者多个首部字段。每个首部字段包含一个名字和一个值,为了便于解析,两者之间用冒号来分隔。
首部以一个空行结束。添加一各首部字段和添加新行一样简单。
3.主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据,
响应主体中装载了要返回给客户端数据。起始行和首部都是文本形式且都是结构化的,
而主体则不同,主体中可以包含任意的二进制数据(比如图片,视频,音轨等等)。
主体中也包含文本。
简单的报文实例:
图 1-8显示了可能会作为简单事务的一部分发送的HTTP报文。浏览器请求资源http://www.joes-hardware.com/tools.html
过程:
1.浏览器发送一条HTTP请求报文(a) 其中起始行中有一个GET命令且本地资源/tools.html。这个请求使用的是1.0版的HTTP协议。请求报文没有主体,因为服务器上GET一个简单的文档不需要请求数据。
2.服务器回送一条HTTP响应报文。这条响应中包含HTTP版本号(HTTP/1.0),一个成功状态码(200),一个描述性的原因短语(OK),以及一块响应首部字段,再多有这些内容之后跟着包含了请求文档的响应主体。context-Length首部说明了响应主体的长度,context-type首部说明了文档的MIME类型。
1.6 连接#
----报文如何通过传输控制协议(Transmission Control Protocol,TCP)连接从一个地方搬移到另一个地方去。
1.6.1 TCP/IP
HTTP是应用层协议。不考虑网络通信的具体细节,由TCP/IP负责。
TCP/IP提供了:
1.无差错的数据传输
2.按序传输(数据总是会按照发送的顺序到达)
3.未分段的数据流(可以在任意时刻以任意的尺寸将数据发送出去。)
TCP/IP保证了客户端和服务器之间报文交换时,减少了报文交换时数据的丢失,破坏以及接受是出现的错误。
1.6.2 连接,IP地址以及端口号
简单理解,在HTTP客户端服务发送报文之前,需要用网网际协议(Internet Protocol,IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。
Let’s take a look at a few URLs:
http://207.200.83.29:80/index.html
这个URL使用的机器的IP地址,207.200.83.29以及端口号80.
http://www.netscape.com:80/index.html
这个URL没有使用数字形式的IP地址,它使用文本形式的域名,也就是主机名(www.netscape.com),主机名比较人性化的别称,可以通过一种为域名服务(Domain Name Service,DNS)的机制方便主机名转换为IP地址,这样所有的问题解决了。(第二章会介绍DNS)
http://www.netscape.com/index.html
这个URL没有端口号时,默认端口号是80.
有了IP地址和端口号,客户端可以很方便通过TCP/IP进行通信。
步骤如下:
(a)浏览器从URL中解析出服务器的主机名
(b)浏览器将服务器的主机名转换成服务器的IP地址
(c)浏览器将端口号(如果有的话)从URL中解析出来
(d)浏览器建立一条与Web服务器的TCP连接
(e)浏览器向服务器发送一条HTTP请求报文
(f)服务器向浏览器回送一条HTTP响应报文
(g)关闭连接,浏览器显示文档。
1.6.3 使用Telnet实例(此部分作者自行补充的,如有不懂可以百度下更为详细的资料)
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
(1)win7下开启telnet命令
win7上telnet这条命令默认被关闭了。开启telnet方法如下:
一,打开控制面版
二,选择程序和功能
三,选择打开或关闭windows功能,在弹出窗口中把 Telnet客户端 选项前打勾。
注意事项:
使用Telnet协议进行远程登录时需要满足以下条件:在本地计算机上必须装有包含Telnet协议的客户程序;必须知道远程主机的Ip地址或域名;必须知道登录标识与口令。
telnet很好的模拟HTTP客户端,但不能作为服务器使用。而且对Telnet作脚本自动化比较繁琐乏味,可以看看nctcat
通过nc可以方便地操作基于UDP和TCP的流量(包括HTTP),还可以编写脚本。
连接:http://netcat.sourceforge.net/
(推荐查看英文版书籍里面资源地址相对正确;如果连接不上建议翻墙)
注意:
GNU Netcat应该在以下主机上编译和工作,无需更改:
Linux(测试主机:alphaev67-unknown-linux-gnu)
FreeBSD(测试主机:i386-unknown-freebsd4.9)
NetBSD(测试主机:i386-unknown-netbsdelf1.6.1)
SunOS / Solaris(测试主机:sparc-sun-solaris2.9)
MacOS X(测试主机:powerpc-apple-darwin6.8)
1.7 协议版本
1.8 Web的结构组件
主要包括以下:
1.代理:位于客户端和服务器之间的HTTP中间实体
2.缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方
3.网关:连接其他应用程序的特殊Web服务器
4.隧道:对HTTP通信报文进行盲目转发的特殊代理
5.Agent代理:自动发起HTTP请求的半智能Web客户端。
1.8.1 代理
从上图可以知道,代理位于客户端和服务器之间,接受所有客户端的HTTP请求,并将请求转发给服务器(可能对请求进行修改之后转发。)对于用户来说,应用程序就是一个代理,代表用户的访问服务器。
出于安全考虑,通常代理作为转发所有Web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。(第六章会详细说明)
1.8.2 缓存
Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务,可以将经过代理传送的常用文档复制保存。下一个请求同文档的客户端就可以享受缓存的私有副本所提供的服务。(第七章会详细接受)
1.8.3 网关
网关(gateway)是一个特殊的服务器,作为其他服务器的中间实体使用。通常用与于将HTTP流量转换为其他协议。网关接受请求时就好像自己的资源的源端服务器一样,客户端可能并不知道子集正在与网关进行通信。(第8章详解)
1.8.4 隧道
隧道(tunnel)时间里起来之后,就会在两条连接之间对原书数据进行盲目转发的HTTP程序。HTTP隧道通常用来在一条或者多条HTTP连接上转发非HTTP数据,转发是不会窥探数据。
HTTP隧道最常见用途是通过HTTP连接承载加密的安全套接字层(SSL,Secure Socket Layer)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙。
1.8.5 Agent代理
Agent代理是代表用户发起HTTP请求的客户端程序。所有发布Web请求应用程序都是HTTP Agent代理。目前提到的一种:Web浏览器,但还有很多其他类型,比如网络爬虫(spiders)或者Web机器人(Web robots)(参考第9章)
1.9 补充资料和网站推荐
HTTP协议信息
HTTP口袋参考,O'Reilly&Associates,Inc.这本小书提供了一个简洁的
介绍HTTP和快速参考每个标题和状态编写HTTP事务的代码。
http://www.w3.org/Protocols/
这个W3C网页包含许多关于HTTP协议的很好的链接。
http://www.ietf.org/rfc/rfc2616.txt
RFC 2616“超文本传输协议HTTP / 1.1”是官方规范
对于HTTP / 1.1,当前版本的HTTP协议。规格是一个写得很好,组织有序,详细的HTTP参考,但它不是理想的对于想要了解HTTP的基本概念和动机的读者或理论与实践之间的差异。我们希望这本书能够填写底层的概念,所以你可以更好地利用规范。
http://www.ietf.org/rfc/rfc1945.txt
RFC 1945“超文本传输协议HTTP / 1.0”是一个信息RFC它描述了HTTP的现代基础。详细说明官方认定和Web应用程序的“最佳实践”行为是写的它还包含有关行为的一些有用的描述在HTTP / 1.1中不推荐使用,但仍由传统应用程序广泛实现。
http://www.w3.org/Protocols/HTTP/AsImplemented.html
该网页包含1991年HTTP / 0.9协议的描述仅实现GET请求,并且没有内容打字。
历史的角度
http://www.w3.org/Protocols/WhyHTTP.html
这个简短的网页从1991年起,从HTTP的作者,突出了一些HTTP的原始,简约的目标。
http://www.w3.org/History.html
“万维网的一个小小的历史”给出了一个短暂但有趣的观点关于万维网的一些早期目标和基础HTTP。
http://www.w3.org/DesignIssues/Architecture.html
“五万英尺的网络架构”描绘了一个广泛而雄心勃勃的观点万维网和影响HTTP和相关网页的设计原则技术。
其他万维网信息
http://www.w3.org
万维网联盟(W3C)是技术指导团队网络。 W3C开发互操作技术(规范,指南,软件和工具),用于不断发展的Web。 W3C网站是一个宝库关于网络技术的介绍性和详细的文档。
http://www.ietf.org/rfc/rfc2396.txtRFC 2396“统一资源标识符(URI):通用语法”是详细的URI和URL的引用。
http://www.ietf.org/rfc/rfc2141.txt
RFC 2141“URN Syntax”是一个描述URN语法的1997规范。
http://www.ietf.org/rfc/rfc2046.txt
RFC 2046“MIME第2部分:媒体类型”是五个互联网套件中的第二个定义多用途Internet邮件扩展标准的规范多媒体内容管理。
http://www.wrec.org/Drafts/draft-ietf-wrec-taxonomy-06.txt
这个互联网草案“Internet Web Replication and Caching Taxonomy”指定了Web架构组件的标准术语
参考文献:
1.《HTTP权威指南》
2.《HTTP The Definitive Guide》
- 部分标准术语参阅维基百科