http权威指南第三章

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 这个实体最后一次被修改的日期和时间
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 本篇文章篇幅比较长,先来个思维导图预览一下。 一、概述 1.计算机网络体系结构分层 2.TCP/IP 通信传输流 ...
    涤生_Woo阅读 54,501评论 24 555
  • 第一章、HTTP概述1、Web浏览器、服务器和相关的Web应用程序都是通过HTTP相互通信的,HTTP是现代全球因...
    横冲直撞666阅读 606评论 0 1
  • 本文是《图解HTTP》读书笔记的第二篇,主要包括此书的第六章内容,因为第六章的内容较多,而且比较重要,所以单独写为...
    lijiankun24阅读 1,311评论 0 6
  • 混乱,昏暗,混沌,声音,物品,光线…… 说着话,不知道在说什么 洒水 西瓜 不能表意的代码 开门和关门的声音 收拾...
    听雷雷说阅读 230评论 0 0
  • 1. 身在多伦多,免不了接待秋季前来赏枫的亲友。即便没有亲友,自己也喜欢在这个迷人的季节到郊外走走,让身心融化在斑...
    北美之北阅读 822评论 2 7