HTTP报文
报文流
HTTP报文是在HTTP引用程序之间发送的数据块,这些数据块以一种文本形式的元信息开头,这些信息描述了报文的内容和含义,后面跟着可选的数据部分,这些报文在客户端,服务器和代理之间流动。
报文流入源端服务器
HTTP使用属于流入和流出来描述事务处理的方向,报文流入源端服务器,工作完成之后,会流入用户的Agent代理中。
报文向下游流动
HTTP报文会像下游流动,所有报文的发送者在接收者的上游。对于请求报文来说,代理1在代理2的上游
报文的组成部分
HTTP报文是简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。由三部分组成: 对报文进行描述的起始行,包含属性的首部块,已经可选的,包含数据的主体部分。
起始行和首部都是由行分割的ascii文本。每行都以一个或者两个字符组成的行终止序列作为结束,包括一个回车符和一个换行符。这个行终止序列被写作crlf。有些老的,或者不完整的HTTP引用程序不会总是发送回车符,又发送换行符。
使用的主体或者报文的主体是一个可选的数据块,与起始行和首部不同的是,主题中可以包含文本或者二进制数据,也可以为空。
报文的语法
所有的HTTP报文请求可以分为两类: 请求报文和响应报文。请求报文会向web服务器请求一个动作,响应报文会将请求的结果返回给客户端,请求和响应报文的基本报文结构都是相同的。
html
// 请求报文
<method> <request-URL> <version>
<headers>
<entity-body>
html
// 响应报文
<version> <status> <reason-phrarse>
<headers>
<entity-body>
方法: 客户端希望服务器对资源执行的动作
请求URL: 命名了请求资源,或者URL路径组件的完整URL,如果直接和服务器进行对话,只要URL的路径组件是资源的绝对路径。
版本: HTTP版本
状态码: 每个状态码中的第一位都用来描述状态的一般类别。
原因短语: 数字状态码的可读版本,包含行终止序列之前的所有文本。
首部: 可以有零个或者多个首部,每个首部包含一个名字,后面跟着一个冒号。然后是可选的空格,接着是一个只,最后是一个CRLF。
实体的主体部分: 实体的主体部分包含一个有任意数据组成的数据块,并不是所有报文都包含实体的组成部分。
起始行
所有的http报文都是以一个其实作为开始,请求报文的起始行说明了要做些什么,响应报文的起始行说明发生了什么
请求行
请求报文请求服务器对资源进行一些操作,请求报文的起始行,或者请求行,包含了一个方法和一个请求URL,这个方法描述了服务器应该执行的操作。请求URL描述了要对那个资源执行这个方法,请求行中包含HTTP的版本。用来告知服务器,客户端使用的是那种HTTP
响应行
响应报文承载了状态信息和操作产生的所有结果数据。将其返回给客户端,响应报文的起始行,或者称为响应行,包含了响应报文的HTTP版本,数字状态码,以及描述操作状态的文本形式的原因短语
所有这些字符都由空格符进行分割。
方法
请求的起始行以方法作为开始,方法告知服务器要做些什么
状态码
方法是用来告诉服务器做什么事情的,状态码是告诉客户端,发生了什么事情,状态码位于响应的起始行中。
状态码是在每条响应报文的起始行中返回的,会返回一个数字状态和一个可读的状态。数字码便于沉痼进行差错管理,而原因短语便于人们理解
通过三位数字代码对不同的状态进行分类。200-299之间的状态码表示成功,300-399表示资源被迁移走,400-499表示客户端的请求发生了错误,500-599表示服务器出现了错误
原因短语
原因短语是响应起始行中的最后一个组件,为状态码提供了文本形式的解释。
版本号
首部
首部分类
HTTP规范定义了首部字段,应用程序也可以随意发明自己所用的首部
- 通用首部:可以出现在请求报文中,也可以出现在响应报文中
- 请求首部: 提供更多有关请求的信息
- 响应首部: 提供更多有关的响应星系
- 实体首部: 描述主体的长度和内容,或者资源本身
- 拓展首部: 规范中没有定义过的新首部。
语法:名字:可选空格 字段值 CRLF
首部延续行
将长的首部行为分为多行可以提高可读性,多出来的每行前面至少有一个空格或者制表符。
http
HTTP/1.0 200 OK
Content-Type: image/gif
Content-Length: 8572
Server: Test Server
Version 1.0
实体的主体部分
HTTP报文的第三部分就是可选的实体主体部分,实体的主体是HTTP报文的负荷,就是HTTP要传输的内容
HTTP报文可以承载很多类型的数字数据: 图片,视频, HTML文档, 软件应用程序, 信用卡事务, 电子邮件等
版本0.9的报文
HTTP/0.9报文也都是由请求和响应组成,但是请求中只包含方法和请求URL,响应中只包含实体,没有版本信息,没有状态码或原因短语,也没有首部。
方法
安全方法
HTTP定义了一组被安全方法的方法。GET方法和HEAD方法都被认为是安全的。
GET
GET是最常用的方法,通常用于请求服务器发送某个资源,HTTP/1.1要求服务器实现此方法。
HEAD
HEAD方法和GET方法的行为很类似,但是服务器在响应中只能返回首部,不会返回实体的主体部分,这就允许客户端在没有获取实际资源的情况下,对资源的首部进行检查。
- 在不获取资源的情况下了解资源的情况
- 通过查看响应中的状态码,查看对象是否存在
- 查看首部,检查资源是否被改变
PUT
与GET从服务器中读取文档相反,PUT方法会向服务器中写入文档。 PUT方法就是让服务器用请求的主体部分来创建一个由所请求的URL命名的新的文档,或者,如果URL已经存在的话,就用这个主体代替它。
POST
post方法起初是用来向服务器输入数据的。
TRACE
客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的HTTP请求。
TRACE 请求会在目的服务器端发起一个"环回"诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求/响应链上,原始报文是否,以及如何被毁坏或修改过
TRACE的方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链。可以用来查看代理或者其他应用程序对用户请求产生的效果
OPTIONS
OPTIONS方法请求对web服务器告知其支持的各种功能,可以询问服务器支持的方法。
DELETE
DELETE方法所做的事情就是请服务器删除请求URL所指定的资源。但是客户端应用程序无法保证删除操作一定会被执行。HTTP规范允许服务器在不通知客户端的情况下撤销请求。
状态码
100 ------ 199 信息性状态码
HTTP/1.1 向协议中引入了信息性状态码,这些状态码相对较新。
100:HTTP客户端应用程序中有一个实体的主体部分要发送给服务器,但是希望在发送之前查看一下服务器是否会接受这个实体。
客户端与100Continue
如果客户端在向服务器发送一个实体,并且愿意在发送实体之间等待100 continue响应,客户端发送一个携带了100 continue的expect请求首部。如果客户端不发送实体,就不应该发送100continue expect首部,这样会使得服务器误以为客户端要发送一个实体。
100 continue 是一种优化,客户端应用程序只有在避免向服务器发送一个服务器无法处理或者使用的大实体的时候,才使用100continue
代理与100continue
如果代理从服务器受到了一条带有100 continue期望的请求,如果不知道版本,应该将expect首部放在请求中向下转发。HTTP/1.1 用417 Expectation Failed
代理决定代表http1.0或之前版本兼容的客户端,在其请求中放入expect首部和100continue值,不会讲100 Continue响应转发给客户端。
200 ~ 299 --------- 成功状态码
300 ~ 399 --------- 重定向状态码
如果资源已经被移动,可以发送一个重定向状态码和一个可选的Loacation首部来告诉客户端资源已经被移走,以及现在的位置。
可以通过某些重定向状态码对资源的应用程序本地副本和源端服务器上的资源进行验证。对于那些包含了重定向的非HEAD请求进行响应的时候,需要包含一个实体,并且在实体中包含描述信息和指向多个重定向的URL的连接。
302 303 307状态码存在一些交叉,主要源于HTTP/1.0和HTTP/1.1应用程序对这些状态码处理方式不同
当HTTP/1.0客户端发起一个post请求,并且在响应中受到302重定向状态码的时候,会接收到Location首部的重定向URL,并且这些URL发起一个GET请求。
HTTP/1.0服务器受到来自HTTP/1.0客户端的POST请求之后发送302状态码,服务器希望客户端能够接受重定向URL,并且向重定向的URL发送一个GET请求
对于HTTP/1.1客户端,用307状态码取代302,称为临时重定向。服务器可以讲302保留起来,为HTTP/1.0进行使用。
400 ~ 499 --------- 客户端错误状态码
500 ~ 599 --------- 服务器错误状态码
代理尝试代表客户端与服务器进行交流,代理会发布5XX服务器错误状态码来描述所遇到的问题。
首部
首部和方法配合工作,决定了客户端和服务器能做什么事情。
- 通用首部: 客户端和服务器都可以使用的通用首部
- 请求首部: 请求首部是请求报文中特有的,为服务器提供了一些额外的信息。
- 响应首部: 为客户端提供信息。
- 实体首部: 实体首部是对实体主体部分的首部
- 扩展首部: 扩展首部是非常标准的首部,未被添加到已批准的HTTP规范中,但是HTTP程序会接受他们并对其进行转发
通用首部
有些首部提供了与报文相关的最基本的信息,它们被称为通用首部
通用缓存首部
http/1.0 引入了一个允许http应用程序缓存对象本地副本的首部,这样不需要从源服务器获取了,最新的http版本有非常丰富的缓存参数集
请求首部
请求首部只是在请求报文中有意义的首部,用于说明是谁或什么在发送请求,请求源自何处,或者客户端的喜好以及能力。
Accept首部
Accept首部: 媒体类型, 字符集, 编码方式, 语言, 拓展传输编码
条件请求首部
为请求加上限制。
安全请求首部
要求客户端在获取资源之前,先对自身进行认真,使得事务安全。
代理请求首部
响应首部
为客户端提供一些额外的信息。
协商首部
HTTP/1.1可以为服务器和客户端提供对资源进行协商的能力。
安全响应首部
实体首部
由于请求和响应报文中都可能包含实体部分,所以在这两种类型的报文中都可能出现这些首部
实体首部可以告知报文的接收者它在对什么进行处理