HTTP权威指南一
HTTP——因 特网的多媒体信使
每天, 都有数以亿万计的 JPEG 图片、 HTML 页面、 文本文件、 MPEG 电影、 WAV
音频文件、 Java 小程序和其他资源在因 特网 上游弋。 HTTP 可以从遍布全世界的
Web 服务器上将这些信息块迅速、 便捷、 可靠地搬移到人们桌面上的 Web 浏览器
上去。
HTTP 使用的是可靠的数据传输协议, 因此即使数据来自 地球的另一端, 它也能够
确保数据在传输的过程中不会被损坏或产生混乱。 这样, 用户在访问信息时就不用
担心其完整性了, 因此对用户来说, 这是件好事。 而对因特网应用程序开发人员来
说也同样如此, 因为这样就无需担心 HTTP 通信会在传输过程中被破坏、 复制或产
生畸变了。 开发人员可以专注于应用程序特有细节的编写, 而不用考虑因特网中存
在的一些缺陷和问题。
媒体类型
因 特网 上有 数千种不 同 的 数据类型, HTTP 仔细 地给每种 要通过 Web 传输的 对象
都 打 上 了 名 为 MIME 类 型( MIME type) 的 数 据 格 式 标 签。
最 初 设 计 MIME( Multipurpose Internet Mail Extension, 多用途因特网邮件扩展)
是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。 MIME 在电子邮件系统中工作得非常好,
因此 HTTP 也采纳了它, 用它来描述并标记多媒体内容。Web 服务器会为所有 HTTP 对象数据附加一个 MIME 类型。
当 Web浏览器从服务器中取回一个对象时, 会去查看相关的 MIME 类型, 看看它是否知道应该如何处理这个对象。
大多数浏览器都可以处理数百种常见的对象类型: 显示图片文件、 解析并格式化 HTML 文件、
通过计算机声卡播放音频文件, 或者运行外部
MIME 类型是一种文本标记, 表示一种主要的对象类型和一个特定的子类型, 中间
由一条斜杠来分隔。
• HTML 格式的文本文档由 text/html 类型来标记。
• 普通的 ASCII 文本文档由 text/plain 类型来标记。
• JPEG 版本的图片为 image/j peg 类型。
• GIF 格式的图片为 image/gif 类型。
• Apple 的 QuickTime 电影为 video/quicktime 类型。
• 微软的 PowerPoint 演示文件为 application/vnd. ms- powerpoint 类型。
常见的 MIME 类型有数百个, 实验性或用途有限的 MIME 类型则更多。
URL
大部分 URL 都遵循一种标准格式, 这种格式包含三个部分。
• URL 的第一部分被称为方案( scheme), 说明了访问资源所使用的协议类型。 这
部分通常就是 HTTP 协议( http://)。
• 第二部分给出了服务器的因特网地址(比如, www.joes-hardware.com)。
• 其余部分指定了 Web 服务器上的某个资源(比如, /specials/saw-blade.gif)。
事务
我们来更仔细地看看客户端是怎样通过 HTTP 与 Web 服务器及其资源进行事务处理
的。 一个 HTTP 事务由一条( 从客户端发往服务器的) 请求命令和一个( 从服务器
发回 客户端的) 响应结果组成。 这种通信是通过名为 HTTP 报文( HTTP message)
的格式化数据块进行的
方法
GET 从服务器向客户端发送命名资源
PUT 将来自 客户端的数据存储到一个命名的服务器资源中去
DELETE 从服务器中删除命名资源
POST 将客户端数据发送到一个服务器网关应用程序
HEAD 仅发送命名资源响应中的 HTTP 首部
Web页面中 可以包含多个对象
应用程序完成一项任务时通常会发布多个 HTTP 事务。 比如, Web 浏览器会发布一
系列 HTTP 事务来获取并显示一个包含了丰富图片的 Web 页面。 浏览器会执行一个
事务来获取描述页面布局的 HTML“框架”, 然后发布另外的 HTTP 事务来获取每
个嵌入式图片、 图像面板、 Java 小程序等。 这些嵌入式资源甚至可能位于不同的服
务器上. 因此, 一个“Web 页面” 通常并不是单个资源, 而是一组资源的集合。
连接
报文是如何通过传输控制协议 Transmission Control Protocol, TCP) 连接从一个地方搬移到另一个地方去的。
TCP/IP
HTTP 是个应用层协议。 HTTP 无需操心网络通信的具体细节; 它把联网的细节都
交给了通用、 可靠的因特网传输协议 TCP/IP。
TCP 提供了:
• 无差错的数据传输;
• 按序传输(数据总是会按照发送的顺序到达) ;
• 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)。
因特网自 身就是基于 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 地址。
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 地址比较人性化的别称。 可以通过一
种称为域名 服务( Domain Name Service, DNS) 的机制方便地将主机名转换为 IP
地址, 这样所有问题就都解决了。
最后一个 URL 没有端口号。 HTTP 的 URL 中没有端口号时, 可以假设默认端口 号是 80。
有了 IP 地址和端口 号, 客户端就可以很方便地通过 TCP/IP 进行通信了。
使用 Telnet实例
由 于 HTTP 使用 了 TCP/IP 传输协议, 而且它是基于文本的, 没有使用 那些难以理
解的二进制格式, 因此很容易直接与 Web 服务器进行对话。
Telnet 程序可以将键盘连接到某个目 标 TCP 端口 , 并将此 TCP 端口 的输出 回 送到
显示屏上。 Telnet 常用于远程终端会话, 但它几乎可以连接所有的 TCP 服务器, 包
括 HTTP 服务器。
可以通过 Telnet 程序直接与 Web 服务器 进行对话。 通过 Telnet 可以打开一条到
某台机器上某个端口 的 TCP 连接, 然后直接向 那个端口 输入一些字符。 Web 服务
器会将 Telnet 程序作为一个 Web 客户 端来处理, 所有回 送给 TCP 连接的数据都
会显示在屏幕上。
我 们 用 Telnet 与 一 个 实 际 的 Web 服 务 器 进 行 交 互。 我 们 要 用 Telnet 获 取 URL
http://www.joes-hardware.com:80/tools.html 所指向 的文档( 你可以自 己尝试一下这
个实例)。
我们来看看会发生什么情况。
• 首先, 查找 www.joes-hardware.com 的 IP 地址, 打开一条到那台机器端口 80 的
TCP 连接。 Telnet 会为我们完成那些“跑腿儿” 的工作。
• 一旦打开了 TCP 连接, 就要输入 HTTP 请求了。
• 请求结束(由一个空行表示) 之后, 服务器会在一条 HTTP 响应中将内容回送并
关闭连接。
一个使用 Telnet 的 HTTP 事务
% telnet www.joes-hardware.com 80
Trying 161. 58. 228. 45. . .
Connected to j oes- hardware. com.
Escape character is ' ^] ' .
GET /tools.html HTTP/1.1
Host: www.joes-hardware.com
HTTP/1. 1 200 OK
Date: Sun, 01 Oct 2000 23 : 25: 17 GMT
Server: Apache/1. 3 . 11 BSafe- SSL/1. 3 8 ( Unix) FrontPage/4. 0. 4. 3
Last- Modified: Tue, 04 Jul 2000 09: 46: 21 GMT
ETag: " 3 73 979- 193 - 3 961b26d"
Accept- Ranges: bytes
Content- Length: 403
Connection: close
Content- Type: text/html
<HTML>
<HEAD><TITLE>Joe' s Tools</TITLE></HEAD>
<BODY>
<H1>Tools Page</H1>
<H2>Hammers</H2>
<P>Joe' s Hardware Online has the largest selection of hammers on the
earth. </P>
<H2><A NAME=drills></A>Drills</H2>
<P>Joe' s Hardware has a complete line of cordless and corded drills,
as well as the latest
in plutonium- powered atomic drills, for those big around the house
j obs. </P> . . .
</BODY>
</HTML>
Connection closed by foreign host.
Telnet 会查找主机名并打开一条连接, 连接到在 www.joes-hardware.com 的端口 80
上监听的 Web 服务器。 这条命令之后的三行内容是 Telnet 的输出, 告诉我们它已经
建立了连接。
然后我们输入最基本的请求命令 GET/tools. html HTTP/1. 1, 发送一个提供了源
端主机名的 Host 首部, 后面跟上一个空行, 请求从服务器 www.joes-hardware.com
上获取资源 tools.html。 随后, 服务器会以一个响应行、 几个响应首部、 一个空行和
最后面的 HTML 文档主体来应答。
要明确的是, Telnet 可以很好地模拟 HTTP 客户端, 但不能作为服务器使用。 而且
对 Telnet 做脚本自 动化是很繁琐乏味的。 如果想要更灵活的工具, 可以去看看 nc
( netcat)。 通过 nc 可以很方便地操纵基于 UDP 和 TCP 的流量(包括 HTTP), 还可
以为其编写脚本
Web的结构组件
在本章的概述中, 我们重点介绍了两个 Web 应用程序( Web 浏览器和 Web 服务器)
是如何相互发送报文来实现基本事务处理的。 在因特网上, 要与很多 Web 应用程序
进行交互。
• 代理
位于客户端和服务器之间的 HTTP 中间实体。
• 缓存
HTTP 的仓库, 使常用页面的副本可以保存在离客户端更近的地方。
• 网 关
连接其他应用程序的特殊 Web 服务器。
• 隧道
对 HTTP 通信报文进行盲转发的特殊代理。
• Agent 代理
发起自 动 HTTP 请求的半智能 Web 客户端。
代理
首先我们来看看 HTTP 代理服务器, 这是 Web 安全、 应用集成以及性能优化的重要
组成模块。
代理位于客户端和服务器之间, 接收所有客户端的 HTTP 请求, 并
将这些请求转发给服务器(可能会对请求进行修改之后转发)。 对用户来说, 这些应
用程序就是一个代理, 代表用户访问服务器。
出于安全考虑, 通常会将代理作为转发所有 Web 流量的可信任中间节点使用。 代理
还可以对请求和响应进行过滤。 比如, 在企业中 对下载的应用程序进行病毒检测,
或者对小学生屏蔽一些成人才能看的内容。
缓存
Web 缓存( Web cache) 或代理缓存( proxy cache) 是一种特殊的 HTTP 代理服务
器, 可以将经过代理传送的常用文档复制保存起来。 下一个请求同一文档的客户端
就可以享受缓存的私有副本所提供的服务了
客户端从附近的缓存下载文档会比从远程 Web 服务器下载快得多。 HTTP 定义了很
多功能, 使得缓存更加高效, 并规范了文档的新鲜度和缓存内容的隐私性。
网关
网 关( gateway) 是一种特殊的服务器, 作为其他服务器的中间实体使用。 通常用于
将 HTTP 流量转换成其他的协议。 网关接受请求时就好像自 己是资源的源端服务器
一样。 客户端可能并不知道自 己正在与一个网关进行通信。
例如, 一个 HTTP/FTP 网关会通过 HTTP 请求接收对 FTP URI 的请求, 但通过 FTP
协议来获取文档。 得到的文档会被封装成一条 HTTP 报文, 发送给
客户端。
隧道
隧道( tunnel) 是建立起来之后, 就会在两条连接之间 对原始数据进行盲转发的
HTTP 应用 程序。 HTTP 隧道通常用 来在一条或多条 HTTP 连接上转发非 HTTP 数
据, 转发时不会窥探数据。
HTTP 隧 道 的 一 种 常 见 用 途 是 通 过 HTTP 连 接 承载 加 密 的 安 全 套 接 字 层( SSL,
Secure Sockets Layer) 流量, 这样 SSL 流量就可以穿过只允许 Web 流量通过的防
火墙了。 HTTP/SSL 隧道收到一条 HTTP 请求, 要求建立一条到目
的地址和端口 的输出连接, 然后在 HTTP 信道上通过隧道传输加密的 SSL 流量, 这
样就可以将其盲转发到目 的服务器上去了。
Agent代理
用 户 Agent 代理( 或者简称为 Agent 代理) 是代表用户发起 HTTP 请求的客户端程
序。 所有发布 Web 请求的应用程序都是 HTTP Agent 代理。 到目 前为止, 我们只提
到过一种 HTTP Agent 代理: Web 浏览器, 但用户 Agent 代理还有很多其他类型。
比如, 有些自 己会在 Web 上闲逛的自 动用户 Agent 代理, 可以在无人监视的情况下
发布 HTTP 事务并获取内容。 这些自 动代理的名字通常都很生动, 比如“网络蜘蛛”
( spiders) 或者“Web 机器人”( Web robots)。 网络蜘蛛会在 Web 上
闲逛, 搜集信息以构建有效的 Web 内容档案, 比如一个搜索引擎的数据库或者为比
较购物机器人生成的产品目 录。
HTTP权威指南一的更多相关文章
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- JavaScript权威指南 - 对象
JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块
五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options] -v,--verbose ...
- 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令
2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...
- 读《Android编程权威指南》
因为去年双十二购买了一折的<Android 编程权威指南(第一版)>,在第二版出来后图灵社区给我推送了第二版的优惠码,激动之余就立马下单购买电子书,不得不说Big Nerd Ranch G ...
- maven权威指南学习笔记(五)—— POM
1. 简介 Archetype插件通过 pom.xml 文件创建了一个项目.这就是项目对象模型 (POM),一个项目的声明性描述. 当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里 ...
- maven权威指南学习笔记(一)——简介
maven是什么?有什么用? Maven是一个项目管理工具,它包含了 一个项目对象模型 (Project Object Model), 一组标准集合, 一个项目生命周期(Pro ...
- 《javascript权威指南》读书笔记——第二篇
<javascript权威指南>读书笔记——第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字 ...
- 《javascript权威指南》读书笔记——第一篇
<javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...
随机推荐
- 分巧克力【来源:CSDN线上编程挑战赛】——递归,费波那奇数列,迭代
/*====================================================================== 儿童节快到了,班长想要给班上的每个同学给一个巧克力, ...
- 阅读layim代码小记,实现可以更改用户签名的方法
用layim原版的时候发现,用户的签名是不能直接修改的,如下: 其实要改也很简单,查看一下源代码,然后加一个input进去,可是,加完之后是这样的: 没关系,给它一个样式,让它乖乖的“隐藏“起来. / ...
- openssl数字证书私钥删除私钥密码
解密 openssl rsa -in server.key.org -out server.key
- 分布式服务框架:Zookeeper
Zookeeper是一个高性能,分布式的,开源分布式应用协调服务.它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,配置管理,集群管理,名空间.它被设计为易于编程,使用文件系统目 ...
- 国内的阿里云maven私服
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexu ...
- Hive(五):hive与hbase整合
配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-h ...
- SharePoint 2010 最佳实践学习总结------第1章 SharePoint Foundation开发基础
----前言 这段时间项目出在验收阶段,不是很忙,就潜心把SharePoint学一下,不求有多深刻,初衷只是先入门再说.后续会发布一系列的学习总结.主要学习的书籍为<SharePoint2010 ...
- 【linux】cut
vim test id name age score 101 paul 18 100 102 suan 11 99 103 peter 18 98 [root@andon ~]# cut -f 2 t ...
- lwip:网络数据包读取和解析过程
1. 程序的某处(poll or interrupt)在有数据可读时调用ethernetif_input,该函数依次调用以下函数: 1.1 low_level_input(),将网络数据读入内存: 1 ...
- bzoj3533: [Sdoi2014]向量集
Description 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);" Q x y l r (|x| ...