http报文
重点:
- 报文是如何流动的;
- http报文的三个组成部分(起始行、首部、和实体的主体部分);
- 请求和响应之间的区别;
- 请求报文支持的各种功能;
- 和请求报文一起返回的各种状态码;
- 各种各样的http首部都是用来做什么的;
报文流
http报文是在http应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息报文描述了报文的内容及含义,后面跟着可选数据部分。这些报文在客户端、服务器和代理之间流动。术语 流入 流出 上游 下游 都是用来描述报文方向的。
3.11报文流入源端服务器
http使用流入(inbound)和流出(outbound)来描述事务处理(transation)的方向。客户端发向服务器为流入,服务器发向客户端称为流出。
3.1.2报文向下游流动
http会像河水一样流动。不管是请求报文还是响应报文,所有的报文都会向下游(downstream)流动。所有报文发送者都在接受者的上游(upstream)。
3.2报文的组成部分
http报文是简单的格式化数据块。每条报文都包含三个部分:对报文描述的起始行(start line),包含属性的首部(header)块,以及可选的,包含数据主体(body)部分。
起始行和首部就是由行分隔的ascll文本。每行以回车换行符结束。主体是一个可选的数据块。与起始行不同的是,主体可以包含文本或二进制数据,也可以为空。
3.2.1报文的语法
所有的http报文可以分为两类:请求报文(request message)和响应报文(response message)请求报文会向web服务器请求一个动作。响应报文会将请求的结果返回给客户端。
请求报文格式
<method><request-url><version>
<headers>
<entity-body>
响应报文格式
<version><status><reason-phrase>
<headers>
<entity-body>
- 方法(method)
客户端希望服务器对资源执行的动作。是一个单独的词,比如get post - 请求url(request url)
命名了所请求资源,或者url路径组件的完整url。如果直接与服务器进行对话,只要url的路径组件是资源的绝对路径,通常不会有问题。 - 版本(version)
报文所使用的http版本,其格式为:http/<major>.<minor>,其中主要版本号(major)和次要版本号(minor)都是整数 - 状态码(status-code)
这三个数字描述了请求过程中发生的情况。每个状态码的第一位数字用于描述状态的一般类别(成功、出错等) - 原因短语(reason-phrase)
数字状态码的可读版本,包含行中止之前的所有文本。 - 首部(header)
可以有零个或多个首部,每个首部包含一个名字,后面跟着一个冒号,然后一个可选空格,接着是一个值,最后是crlf。首部是一个crlf结束的,有些http版本需要包含特定的首部 - 实体的主体部分
包含一个有任意数据组成的数据块。
3.2.2起始行
所有的http报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么,响应报文起始行说明发生了什么。
1.请求行
请求报文请求服务器对资源进行一些操作。请求报文的起始行,或者称为请求行,包含了一个方法和一个请求url,这个方法描述了服务器应该执行的操作,url描述了要对那个资源执行这个方法。请求行还包含http版本,在http1.0以前不要求请求行包含http版本号。
2.响应行
响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,或者称为响应行,包含类响应报文的http版本。数字状态码,以及描述操作状态的文本形式的原因短语。
3.方法
请求的起始行以方法作为开始,方法用来告知服务器要做些什么。
方法 | 描述 | 是否包含主体 |
---|---|---|
get | 从服务器获取一份文档 | 否 |
head | 只从服务器获得文档的首部 | 否 |
post | 向服务器发送需要处理的数据 | 是 |
put | 将请求的主体存储在服务器上 | 是 |
trace | 对可能经过代理服务器的报文进行追踪 | 否 |
options | 决定可以在服务器执行那些方法 | 否 |
delete | 从服务器上删除一份文档 | 否 |
4.状态码
状态码用来告诉客户端发生了什么,状态码位于起始行的行中。
整体范围 | 分类 |
---|---|
1xx | 信息提示 |
2xx | 成功 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务器错误 |
5.原因短语
响应起始行的最后一个组件,为状态码提供了一个文本解释。http没有规定原因短语以何种方式出现。
6版本号
版本号说明了应用程序支持的最高版本,但http1.0在解释包含http1.1的响应时,会认为这个响应是个1.1响应。
版本号不会被当做分数处理,而是比较每个数字,http/2.22就比http/2.3高,因为22比3大。
3.2.3首部
1.首部分类
- 通用首部
既可以出现在请求报文中,也可以出现在响应报文中。 - 请求首部
提供更多有关请求的信息 - 响应首部
提供更多有关响应的信息 - 实体首部
描述主体的长度和内容,或者资源自身 - 扩展首部
规范中没有定义的新首部
2.首部延续行
将长的首部分为多行可以提高可读性,多出来的每一行至少要有一个空格或制表符
3.2.4实体的主体部分
http报文的第三部分是可选的实体主体部分。实体的主体部分是http报文的负荷,就是http要传输的内容。
3.2.5版本0.9的报文
http/0.9也由请求和响应组成,但请求中只包含方法和请求url,响应中只包含实体,它没有版本信息,没有状态码或原因短语,也没有首部。
3.3方法
不是每个服务器都实现了所有这些方法,如果一台服务器要与http1.1兼容,只要实现get、head方法就可以了。
3.3.1安全方法
http定义了一组被称为安全方法的方法。get和head都被认为是安全的方法,这就意味着使用get或head方法的http请求不会产生什么动作,安全方法不一定什么都不执行的(这将由web开发者决定)
3.3.2get
get是最常用的方法。通常用于请求服务器发送某个资源。
3.3.3head
head与get方法很相似,但服务器只返回首部。不会返回实体的主体部分。这就允许客户端在未获得实际资源的情况下对资源的首部进行检查。
3.3.4put
与get从服务器读取文档相反,普通方法会向服务器写入文档。有些发布系统允许用户创建web页面,并用普通直接安装到服务器上
put方法的语义就是让服务器用请求的主体部分来创建一个由所请求的url命名的新文档,或者如果url已存在,就用主体来替代它
3.3.5post
post起初是用来向服务器输入数据的。实际上用它来支持html的表单。
3.3.6trace
客户端发起一个请求这个请求可能要穿过防火墙、代理、网关或其它一些程序。每个中间结点都有可能修改原始http请求。trace方法允许客户端在最终请求发送给服务器时看看它变成什么样子。
trace请求会在目的服务器发起一个回环诊断。行程最后一站的服务器会弹回一条trace响应,并在响应主体中携带它收到的原始请求报文。
3.3.7options
options方法请求web服务器告知其支持的功能。可以查询服务器通常支持那些方法。
3.3.8delete
delete就是请求服务器删除所请求的资源。但是客户端应用无法保证删除一定会被执行。用为http协议允许服务器在不通知客户端的情况下撤销请求。
http被设计成字段可扩展的,这样新特性就不会使老软件失效了。服务器会为他所管理的资源实现http服务,这些方法为开发者提供了扩展http服务能力的手段。
方法 | 描述 |
---|---|
lock | 允许用户锁定资源,比如正在编辑 |
mkcol | 允许别人创建资源 |
copy | 便于在服务器复制资源 |
move | 在服务器移动资源 |
并不是所有的方法都是正式规范中定义的,如果你定义了一个扩展方法,很可能大部分http应用程序都无法理解。同样你的http应用程序也有可能遇到一些其它应用程序正在使用,而并不理解的方法。
3.4状态码
多而杂,不抄了
3.5首部
3.5.1通用首部
有些首部提供了与报文相关的基本信息,被称为通用首部。
通用信息性首部
首部 | 描述 |
---|---|
connection | 允许客户端和服务器指定与请求/响应连接相关的选项 |
date | 提供日期和时间,说明报文是什么时间创建的 |
mime-version | 给出了发送端的mime版本 |
trailer | 如果报文采用了分块传输编码(chunked transfer encoding)方式就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合 |
update | 给出了发送端可能想要升级使用的新版本或协议 |
via | 显示报文经过的中间结点 |
通用缓存首部
http1.0引入了第一个允许http应用缓存对象本地副本的首部,这样就不用总是从源服务器获取了。
首部 | 描述 |
---|---|
cache-control | 用于报文传送缓存指示 |
pragma | 另一种报文传送指示的方式,但并不用于缓存 |
3.5.2请求首部
请求首部是只在请求报文中有意义的首部。
请求的信息性首部
首部 | 描述 |
---|---|
client-ip | 提供了客户端的ip地址 |
from | 提供了客户端的mail地址 |
host | 给出了服务器的主机名和端口号 |
referer | 提供了包含当前请求uri的文档的url |
ua-color | 提供了客户端显示器颜色相关的信息 |
ua-cpu | 客户端的cpu类型或制造商 |
ua——disp | 提供了显示器能力相关的信息 |
ua-os | 客户端的操作系统名称和版本 |
ua-pixels | 客户端的像素信息 |
user-agent | 发起请求的程序名称 |
1.accept首部
accept将客户端的喜好和能力告知服务器的方式
首部 | 描述 |
---|---|
accept | 告诉服务器能够发送哪些媒体类型 |
accept-charset | 哪些字符集 |
accept-encoding | 哪些编码方式 |
accept-language | 哪些语言 |
te | 哪些扩展传输编码 |
2.条件请求首部
客户端为请求添加限制。
首部 | 描述 |
---|---|
expect | 允许客户端列出请求所要求的服务器行为 |
if-match | 如果实体标记与文档当前的标记相同就获取这份文档 |
if-modified-since | 除非在日期后修改过,否则限制该请求 |
if-none-match | 如果文档的标记与实体标记不符,获取该文档 |
if-range | 允许对文档的某个范围进行条件请求 |
if-unmodified-since | 除非在某个日期后没有修改过,否则限制该请求 |
range | 如果服务器支持范围请求,就请求资源的指定范围 |
3.安全请求首部
http本身支持一种简单的机制,可以对请求进行质询/响应认证。这种机制要求,在获取资源之前,先对自身进行认证,这样使事务稍微安全一些。
首部 | 描述 |
---|---|
authorization | 包含了客户端提供给服务器,以便对自身进行认证的数据 |
cookie | 客户端用它向服务器传送一个令牌,它并不是真正的安全首部,但隐含了安全功能 |
cookie2 | 用来说明请求端支持的cookie版本 |
安全请求首部
首部 | 描述 |
---|---|
authorization | 包含了客户端提供给服务器,以便对自身进行认证的数据 |
cookie | 客户端用它向服务器传送一个令牌,它并不是真正的安全首部,但隐含了安全功能 |
cookie2 | 用来说明请求端支持的cookie版本 |
4.请求代理首部
首部 | 描述 |
---|---|
max-forward | 在通往源服务器的路径上,将请求转发给其它代理或网关的最大次数-与trace方法一起使用。 |
proxy-authorization | 与authorization首部相同,但这个首部是在与代理认证时使用的 |
proxy-connection | 与connection相同,但这个首部是在与代理认证时使用的 |
3.5.3响应首部
响应报文有自己的响应首部集。响应首部为客户端提供了一些额外的信息。
首部 | 描述 |
---|---|
age | 从最初创建开始的持续响应时间 |
public | 服务器为资源提供的请求方法列表 |
retry-after | 如果资源不可用,在此日期之后重试 |
server服务器应用程序的名称和版本 | |
title | 对html文档来说,就是html文档的标题 |
warning | 比原因短语中更详细的警告报文 |
1.协商首部
如果资源有多种便是方法,http1.1可以为客户端和服务器提供对资源进行协商的能力
首部 | 描述 |
---|---|
accept-ranges | 对此资源来说服务器可接受的范围类型 |
vary | 服务器查看的其它首部的列表,可能会使响应发生变化 |
2.安全响应首部
首部 | 描述 |
---|---|
proxy-authenticate | 来自代理的对客户端的质询列表 |
set-cookie | 不是真正的安全首部,但隐含安全功能,可以在客户端设置一个令牌,以方便服务器对客户端的标示 |
set-cookie2 | 与set-cookie类似 |
www-authenticate | 来自服务器对客户端的质询列表 |
3.5.4实体首部
信息性首部
首部 | 描述 |
---|---|
allow | 列出了可以对实体执行的请求方法 |
location | 告知客户端实际上位于何处 |
1.内容首部
首部 | 描述 |
---|---|
content-base | 解析主体的相对url时使用的基础url |
content-encoding | 对主体执行的任意编码方式 |
content-language | 理解主体是最适宜使用的自然语言 |
content-length | 主体的长度或尺寸 |
content-location | 资源实际所在的位置 |
content-md5 | 主体的md5校验和 |
content-range | 在整个资源中此实体表示的字节范围 |
content-type | 主体的对象类型 |
2.实体缓存首部
通用的缓存首部说明了如何或什么时候进行缓存。实体的缓存提供了与被缓存实体有关的信息。
实体缓存
首部 | 描述 |
---|---|
etag | 榆次实体相关的实体标记 |
expires | 实体不在有效,要从源端再次获取次实体的日期和时间 |
last-modified | 这个实体最后一次被修改的日期和时间 |