HTTP作为现在非常重要的协议,需要仔细梳理一下。本次学习知识点来自于《HTTP权威指南》,只是文中知识点罗列,算是读书笔记,请有兴趣的读者购买《HTTP权威指南》完整阅读。
一、HTTP 基本知识
1、HTTP——因特网的多媒体信使
每天, 都有数以亿万计的 JPEG 图片、 HTML 页面、 文本文件、 MPEG 电影、 WAV音频文件、 Java 小程序和其他资源在因特网上游弋。 HTTP 可以从遍布全世界的Web 服务器上将这些信息块迅速、 便捷、 可靠地搬移到人们桌面上的 Web 浏览器上去。2、Web客户端和服务器
Web 内容都是存储在 Web 服务器上的。 Web 服务器所使用的是 HTTP 协议, 因此经常会被称为 HTTP 服务器。 这些 HTTP 服务器存储了因特网中的数据, 如果HTTP 客户端发出请求的话, 它们会提供数据。 客户端向服务器发送 HTTP 请求,服务器会在 HTTP 响应中回送所请求的数据
3、web资源
所有能web服务提供的内容,都可以认为是web资源。Web 传输的对象都打上了名为 MIME 类型(MIME type) 的数据格式标签。 最初设计 MIME(Multipurpose Internet Mail Extension, 多用途因特网邮件扩展) 是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。 MIME 在电子邮件系统中工作得非常好, 因此 HTTP 也采纳了它, 用它来描述并标记多媒体内容。
MIME 类型是一种文本标记, 表示一种主要的对象类型和一个特定的子类型, 中间
由一条斜杠来分隔。
• HTML 格式的文本文档由 text/html 类型来标记。
• 普通的 ASCII 文本文档由 text/plain 类型来标记。
• JPEG 版本的图片为 image/jpeg 类型。
• GIF 格式的图片为 image/gif 类型。
• Apple 的 QuickTime 电影为 video/quicktime 类型。
• 微软的 PowerPoint 演示文件为 application/vnd.ms-powerpoint 类型。
4、URI、URL、URN
服务器资源名被称为统一资源标识符(Uniform Resource Identifier, URI)
5、事务
6、方法
HTTP方法 | 描 述
GET | 从服务器向客户端发送命名资源
PUT | 将来自客户端的数据存储到一个命名的服务器资源中去
DELETE | 从服务器中删除命名资源
POST | 将客户端数据发送到一个服务器网关应用程序
HEAD | 仅发送命名资源响应中的 HTTP 首部
7、状态码
8、报文
• 起始行
报文的第一行就是起始行, 在请求报文中用来说明要做些什么, 在响应报文中说明出现了什么情况。
• 首部字段
起始行后面有零个或多个首部字段。 每个首部字段都包含一个名字和一个值, 为了便于解析, 两者之间用冒号(:) 来分隔。 首部以一个空行结束。 添加一个首部字段和添加新行一样简单。
• 主体
空行之后就是可选的报文主体了, 其中包含了所有类型的数据。 请求主体中包括了要发送给 Web 服务器的数据; 响应主体中装载了要返回给客户端的数据。 起始行和首部都是文本形式且都是结构化的, 而主体则不同, 主体中可以包含任意的二进制数据(比如图片、 视频、 音轨、 软件程序)。 当然, 主体中也可以包含文本。
报文举例:
9、连接
(a) 浏览器从 URL 中解析出服务器的主机名;
(b) 浏览器将服务器的主机名转换成服务器的 IP 地址;
(c) 浏览器将端口号(如果有的话) 从 URL 中解析出来;
(d) 浏览器建立一条与 Web 服务器的 TCP 连接;
(e) 浏览器向服务器发送一条 HTTP 请求报文;
(f) 服务器向浏览器回送一条 HTTP 响应报文;
(g) 关闭连接, 浏览器显示文档
10. HTTP 版本
1.0 是第一个得到广泛使用的 HTTP 版本。 HTTP/1.0 添加了版本号、 各种 HTTP首部、 一些额外的方法, 以及对多媒体对象的处理。 HTTP/1.0 使得包含生动图
片的 Web 页面和交互式表格成为可能, 而这些页面和表格促使万维网为人们广泛地接受。 这个规范从未得到良好地说明。 在这个 HTTP 协议的商业演进和学术
研究都在快速进行的时代, 它集合了一系列的最佳实践。
HTTP/1.1 重点关注的是校正 HTTP 设计中的结构性缺陷, 明确语义, 引入重要的性能优化措施, 并删除一些不好的特性。 HTTP/1.1 还包含了对 20 世纪 90 年
代末正在发展中的更复杂的 Web 应用程序和部署方式的支持。 HTTP/1.1 是当前使用的 HTTP 版本。
• HTTP-NG(又名 HTTP/2.0)
HTTP-NG 是 HTTP/1.1 后继结构的原型建议, 它重点关注的是性能的大幅优化,以及更强大的服务逻辑远程执行框架。 HTTP-NG 的研究工作终止于 1998 年, 编
写本书时, 还没有任何要用此建议取代 HTTP/1.1 的推广计划。
11、web服务上的几个重要组件
位于客户端和服务器之间的 HTTP 中间实体。
• 缓存
HTTP 的仓库, 使常用页面的副本可以保存在离客户端更近的地方。
• 网关
连接其他应用程序的特殊 Web 服务器。
• 隧道
对 HTTP 通信报文进行盲转发的特殊代理。
• Agent 代理
发起自动 HTTP 请求的半智能 Web 客户端
火墙了。 如图 1-14 所示, HTTP/SSL 隧道收到一条 HTTP 请求, 要求建立一条到目的地址和端口的输出连接, 然后在 HTTP 信道上通过隧道传输加密的 SSL 流量, 这
样就可以将其盲转发到目的服务器上去了。
二、URL
ftp://prep.ai.mit.edu/pub/gnu;type=d
在这个例子中, 有一个参数 type=d, 参数名为 type, 值为 d
http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
查询字符串
http://www.joes-hardware.com/inventory-check.cgi?item=12731很多网关都希望查询字符串以一系列“名 / 值” 对的形式出现, 名值对之间用字符“&” 分隔:
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
在这个例子中, 查询组件有两个名 / 值对: item=12731 和 color=blue。
三、报文
1、报文组成
进行描述的起始行(start line)、 包含属性的首部(header) 块, 以及可选的、 包含
数据的主体(body) 部分
2、报文语法
<method> <request-URL> <version>
<headers>
<entity-body>
这是响应报文的格式(注意, 只有起始行的语法有所不同) :
<version> <status> <reason-phrase>
<headers>
<entity-body>
下面是对各部分的简要描述。
• 方法(method)
客户端希望服务器对资源执行的动作。 是一个单独的词, 比如 GET、 HEAD 或POST。 本章稍后将详细介绍方法。
• 请求URL(request-URL)
命名了所请求资源, 或者 URL 路径组件的完整 URL。 如果直接与服务器进行对话, 只要 URL 的路径组件是资源的绝对路径, 通常就不会有什么问题——服务器可以假定自己是 URL 的主机 / 端口。 第 2 章详细地介绍了 URL 的语法。
• 版本(version)
报文所使用的 HTTP 版本, 其格式看起来是这样的:
HTTP/<major>.<minor>
其中主要版本号(major) 和次要版本号(minor) 都是整数。
• 状态码(status-code)
这三位数字描述了请求过程中所发生的情况。 每个状态码的第一位数字都用于描述状态的一般类别(“成功”、“出错” 等)。 本章稍后提供了 HTTP 规范定义的状态码及其含义的完整列表。
• 原因短语(reason-phrase)
数字状态码的可读版本, 包含行终止序列之前的所有文本。 本章稍后提供了HTTP 规范定义的所有状态码的原因短语示例。 原因短语只对人类有意义, 因此, 比如说, 尽管响应行 HTTP/1.0 200 NOT OK 和 HTTP/1.0 200 OK 中原因短语的含义不同, 但同样都会被当作成功指示处理
•首部(header)
• 实体的主体部分(entity-body)
实体的主体部分包含一个由任意数据组成的数据块。 并不是所有的报文都包含实体的主体部分, 有时, 报文只是以一个 CRLF 结束。
3、方法
4、状态码
5、首部
• 通用首部
既可以出现在请求报文中, 也可以出现在响应报文中。
• 请求首部
提供更多有关请求的信息。
• 响应首部
提供更多有关响应的信息。
• 实体首部
描述主体的长度和内容, 或者资源自身。
• 扩展首部
规范中没有定义的新首部。
6、首部延续行
HTTP/1.0 200 OK
Content-Type: image/gif
Content-Length: 8572
Server: Test Server
Version 1.0
在这个例子中, 响应报文里包含了一个 Server 首部, 其值被划分成了多个延续行。该首部的完整值为 Test Server Version 1.0。
7、安全方法
8、get方法
9、put
10、post
11、首部
这些是客户端和服务器都可以使用的通用首部。 可以在客户端、 服务器和其他应用程序之间提供一些非常有用的通用功能。 比如, Date 首部就是一个通用首部,
每一端都可以用它来说明构建报文的时间和日期:
Date: Tue, 3 Oct 1974 02:16:00 GMT
• 请求首部
从名字中就可以看出, 请求首部是请求报文特有的。 它们为服务器提供了一些额外信息, 比如客户端希望接收什么类型的数据。 例如, 下面的 Accept 首部就用来告知服务器客户端会接受与其请求相符的任意媒体类型:
Accept: */*
• 响应首部
响应报文有自己的首部集, 以便为客户端提供信息(比如, 客户端在与哪种类型的服务器进行交互)。 例如, 下列 Server 首部就用来告知客户端它在与一个版本 1.0 的 Tiki-Hut 服务器进行交互:
Server: Tiki-Hut/1.0
• 实体首部
实体首部指的是用于应对实体主体部分的首部。 比如, 可以用实体首部来说明实体主体部分的数据类型。 例如, 可以通过下列 Content-Type 首部告知应用程序, 数据是以 iso-latin-1 字符集表示的 HTML 文档:
Content-Type: text/html; charset=iso-latin-1
• 扩展首部
扩展首部是非标准的首部, 由应用程序开发者创建, 但还未添加到已批准的HTTP 规范中去。 即使不知道这些扩展首部的含义, HTTP 程序也要接受它们并对其进行转发。