Http报文是在http应用程序之间发送的数据块。这些数据块以一些文本形式的无信息 开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动。术语 流入、流出、上游、下游 都是用来描述报文方向的。
Http 使用术语 流入 inbound 和流出 outbound来描述事务处理的方向。报文流入源端服务器,工作完成之后,会流回用户的agent代理中。
所有报文都会向下游流动。所有报文的发送者都在接收者的上游。
每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。它们由三个部分组成:对报文进行描述的起始行、包含属性的首部块,以及可选的、包含数据的主体部分
起始行 http/1.0 200 ok
首部 content-type:text/plain
content-length:19
主体 Hi! i am a message! (可以包含文本或二进制数据,也可以为空)
所有http报文者可以分为两类:请求报文 request message 和响应报文 response message。请求报文会向web服务器请求一个动作。响应报文会将请求的结果返回给客户端。
请求报文的格式:
<method><request-url><version>
<headers>
<entity-body>
响应报文的格式:
<version><status><reason-phrase>
<headers>
<entity-body>
方法 method:客户端希望服务器对资源执行的动作是一个单独的词,比如:get head post
请求url request url:命名了所请求的资源,或者url路径组件的完整url。
版本 version:报文所使用的http版本,其格式:HTTP/<major>.<minor>
其中主要版本号和次要版本号都是整数。将自己所遵循的协议版本告知对方的方式
状态码 status-code:用三位数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(成功/出错 等)
原因短语reason-phrase
数字状态码的可读版本,包含行终止序列之前的所有文本
首部 header 可以有零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号 :,然后是一个可选的空格,接着是一个值,最后是一个CRLF。首部是由一个空行CRLF 结束的,表示了首部列表的结束和实体主体部分的开始。
实体的主体部分entity-body:实体的主体部分包含一个由任意数据组成的数据块。是HTTP报文的负荷,要传输的内容
一组http首部总是应该以一个空行(单个crlf)结束,甚至即使没有首部和实体的主体部分也应如此。 (有的省略了最后的CRLF)
起始行:所有的http报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么。响应报文的起始行说明发生了什么。
请求行:请求报文的起始行,包含了一个方法和一个请求url,这个方法让所有吧服务器应该执行的操作,请求行中还包含http的版本,用来告知服务器,客户端使用的是哪种http
所有这些字段都由空格符分隔
响应行 响应报文的起始行:响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。包含了响应报文使用的http版本/数字 状态码,以及描述操作状态的文本形式的原因短语。
方法 :请求的起始行以方法作为开始,方法用来告知服务器要做些什么。
GET 从服务器获取一份文档 不包含主体
HEAD 只从服务器获取文档的首部 不包含主体
POST 向服务器发送需要处理的数据 包含主体
PUT 将请求的主体部分存储在服务器上 包含主体
TRACE 对可能经过代理服务器传送到服务器上去的报文进行追踪 不包含主体
OPTIONS 决定可以在服务器上执行哪些方法 不包含主体
DELETE 从服务器上删除一份文档 不包含主体
状态码:用来告诉客户端,发生了什么事情。位于响应的起始行中。是在每条响应报文的起始行中返回,会返回一个数字 状态和一个可读 状态。数字 码便于程序进行差错处理,而原因短语则更便于人们理解。
200到299之间的状态码表示成功。 200-206
300-399之间的代码表示资源已经被移走了。300-305
400-499之间的代码表示客户端的请求出错了。400-415
500-599之间的代码表示服务器出错了 500-505
100-199 信息提示 100-101
首部分类:http规范定义了几首部字段。应用 程序 也可以随意发明自己所用的首部。
通用首部:既可以出现在请求报文中,也可以出现在响应报文中。
请求首部:提供更多有关请求的信息。
响应首部:提供更多有关响应的信息。
实体首部:描述主体的长度和内容,或者资源自身。
扩展首部:规范中没有定义的新首部
安全方法:get head 方法都被认为是安全的,请求在服务器上不会产生什么结果。
安全方法并不一定什么动作都不执行,由web开发者决定的。使用安全方法的目的就是允许http应用程序开发者通知用户,什么时候会使用某个可能引发某些动作的不安全方法。
TRACE 客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用 程序。每个中间节点都可能会修改原始的http请求。trace方法允许客户端在最终将请求发送给服务器时,看看它变成了什么样子。
TRACE请求会在目的服务器端发起一个 环回 诊断。行程最后一站有报务器会弹回一条tace响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间http应用程序组成的请求/响应链上,原始报文是否,以及如何被毁坏或修改过。
TRACE 方法主要用于诊断,用于验证请求是否如愿穿过了请求、响应链。
TRACE请求中不能带有实体的主体部分。TRACE响应的实体主体部分包含了响应服务器收到的请求的精确副本。
OPTIONS方法请求web服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。
DELETE方法所做事情就是请服务器删除请求URL所指定 资源。但是 客户端应用程序无法删除操作一定会被执行。因为http规范允许服务器在不通知客户端的情况下撤销请求。
扩展方法:指没有在HTTP/1.1规范中定义的方法。最好按惯例:对所发送的内容要求严一点,对所接收的内容宽容一些 来处理扩展方法。
100-199 信息性状态码
100 continue:如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待100 continue 响应,那么客户端就要发送一个携带了值为 100 continue的Expect请求首部,如果客户端没有发送实体,就不应该发送 100 Continue Expect首部。因为这样会使服务器误以为客户端要发送一个实体。
客户端应用程序只有在避免向服务器发送一个服务器无法处理或使用的大实体时,才应该使用100Contine
客户端不应该永远在那儿等待服务器发送100 Contine响应。超时一定时间之后,客户端应该直接将实体发送出去。
客户端程序的实现者也应该做好应对非预期100 Continue响应的准备。有些出错的HTTP应用程序会不合时宜地发送这些代码。
如果 服务收到了一条带有值为100 Continue的Expect首部的请求,它会用100 Continue响应或一条错误码来进行响应。服务器永远也不应该向没有发送 100 Continue期望的客户端发送 100Continue状态码。有些出错的服务器可能会这么做。
如果出于某种原因,服务器在有机会发送100 Continue响应之前就收到部分或合部的实体,就说明客户端已经决定继续发送数据了,这样,服务器就不需要发送这个状态码了。但服务器读完请求之后,还是应该为请求发送一个最终状态码。
如果代理从客户端收到了一条带有100 Continue期望的请求,。如果代理 知道服务器是http/1.1兼容的,或者并不知道服务与哪个版本兼容,它都应该将expect首部放在请求中向下转发。如果它知道服务器只能与http/1.1之前的版本兼容,就应该以 417 expectation failed 错误进行响应。
如果代理决定代表与http/1.0或之前版本兼容的客户端,在其请求中放入expect首部 100continue值,如果从服务器收到了 100 continue响应,它就不应该将 100 continue响应转发给客户端。因为客户端不可能不知道该拿它怎么办。
通用首部:
Connection 允许客户端和服务器指定与请求/响应莲蓬乳额关的选项
Date 提供日期和时间标志,说明报文是什么时间创建的
MIME-Version 给出了发送端使用的MIME版本
Trailer
Transfe-Encoding 告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
Update 给出了发送端可能想要 升级 使用的新版本协议
Via 显示了报文经过的中间节点 代理 网关
Cache-Control 用于随报文传送缓存指示
Pragma 另一种随报文传送指示的方式,但并不专用于缓存
请求首部:用于说明是谁或什么在发送请求、请求源自何处,或者客户端的喜好及能力
Client-IP 提供了运行客户端的机器的IP地址
From 提供了客户端用户的e-mail地址
Host 给出了接收请求的服务器的主机名和端口号
Referer 提供了包含当前请求URI的文档的URL
UA-Color 提供了客户端显示器的显示颜色有关的信息
UA-CPU 提供客户端CPU的类型或制造商
UA-Disp 提供了与客户端显示器能力有关的信息
UA-OS 给出了运行在客户端机器上的操作系统名称及版本
UA-Pixels 提供了客户端显示器的像素信息
User-Agent 将发起请求的应用程序名称告知服务器。
Accept首部:为客户端提供了一种将其喜好的能力告知服务器的方式,包括它们想要什么,可以使用什么,以及最重要的,它们不想要什么。这样服务器就可以根据这些额外信息,对要发送的内容做出更明智的决定。accept首部会使连接的两端都受益。客户端会得到它们想要的内容,服务器则不会浪费其时间和带宽来发送客户端无法使用的东西。
Accept 告诉服务器能够发送哪些媒体类型
accept-Charset 告诉服务器能够发送哪些字符集
Accept-Encoding 告诉服务器能够发送哪些编码方式
Accept-Language 告诉服务器能够发送哪些语言
TE 告诉服务器可以使用哪些扩展传输编码
条件请求首部:为请求加上某些限制,要求服务器在对请求进行响应之前,确保某个条件为真。
Expect 允许客户端列出某请求所要求的服务器行为
If-Match 如果实体标记与文档当前的实体标记相匹配,就获取这份文档。
If-Modified-Since 除非在某个指定的日期之后资源被修改过,否则就限制这个请求。
If-None-Match 如果提供的实体标识与当前文档的实体标记不相符,就获取文档
If-Range 允许对文档的某个范围进行条件请求
If-Unmodified-Since 除非在某个指定日期之后资源没有被修改过,否则就限制这个请求
Range 如果服务器支持范围请求,就请求资源的指定范围。
安全请求首部
HTTP本身就支持一种简单的机制,可以对请求进行质询/响应认证。这种机制要求客户端在获取特定的资源之前,先对自身进行认证。
Authorization 包含了客户端提供给服务器,以便对其自身进行认证的数据
Cookie 客户端用它向服务器传送一个令牌 ,它并不是真正的安全首部,但确定隐含了安全功能。
Cookie2 用来说明请求端支持的cookie版本。
代理请求首部
Max-Forward 在通往源端服务器的路径上,将请求转发给其他代理或网关的最大次数,与TRACE方法一同使用
Proxy-Authorization 与Authorization首部相同,但这个首部是在与代理进行认证时使用的。
Proxy-Connection 与Conection 首部相同,但这个首部是在与代理建立连接时使用的。
响应首部:谁在发送响应,响应者的功能,甚至与响应相关的一些特殊指令。
Age 从最初创建开始响应持续时间
Public 服务器为其资源支持的请求方法列表
Retry-After 如果资源不可用的话,在此日期或时间重试
Server 服务器应用程序软件的名称和版本
Title 对html文档来说,就是html文档的源端给出的标题
Warning 比原因短语中更详细一些的警告报文
协商首部
Accept-Ranges 对此资源来说,服务器可接受的范围类型
Vary 服务器查看的其他首部的列表,可能会使响应发和变化,也就是说,这是一个首部列表,服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端
安全响应首部
Proxy-Authenticate 来自代理的对客户端的质询列表
Set-Cookie 不是真正的安全首部,但隐含有安全功能,可以在客户端设置一个令牌,以便服务器对客户端进行标识
Set-Cookie2
www-Authenticate 来自服务器的对客户端的质询列表
实体首部:提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。
Allow 列出了可以对此实体执行的请求方法
Location 告知客户端实体实际上位于何处,用于将接收端定向到资源的位置url上去。
内容首部:提供了与实体内容有关的特定信息,说明了其类型/尺寸以及处理它所需的其他有用信息。
Content-Base 解析主体中的相对URL时使用的基础URL
Content-Encoding 对主体执行的任意编码方式
Content-Language 理解主休时最适宜使用的自然语言
Content-Length 主体的长度或尺寸
Content-Location 资源实际所处的位置
Content-MD5 主体的MD5校验和
Content-Range 在整个资源中此实体表示的字节范围
Content-Type 这个主体的对象类型
实体缓存首部
通用的缓存首部说明了如何或什么时候进行缓存。实体的缓存首部提供了与被缓存实体有关的信息--比如 验证已缓存的资源副本是否仍然有效所需的信息,以及更好地估计已缓存资源何时失效需的线索
ETag 与此实体相关的实体标记
Expires 实体不再有效,要从原始的源端再次获取此实体的日期和时间
Last-Modified 这个实体最后一次被改的日期和时间。