转载请注明出处:
本文出自:逆转星河的博客
概述
HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,报文在客户端、服务器、代理之间流动。
内容
1、报文流
-
报文会流入服务器,之后流出服务器,流入代理。所有报文的接- 受者是下游,发送者是上游。
-
报文由三个部分组成:进行描述的起始行,包含属性的首部,可选的、包含数据的主体部分。
-
http的报文分为请求报文和响应报文,请求报文和响应报文的基本结构相同。
请求报文格式:
<method><Request-URL><version>
<headers>
<entity-body>
响应报文格式:
<version><status><reason-phrase>
<headers>
<entity-body>
各部分简介:
方法(method):客户端希望服务器对资源执行的动作。
请求(request-URL)
版本(version):报文所使用的HTTP版本。
状态码(status-code):三位数字描述了请求中发生的状况。
原因短语(reason-phrase):数字状态码的可读版本。
首部(header):可以有零个或多个首部,每个首部都包含一个名字。
实体的主体部分(entity-body):包含一个任意数据组成的数据块。
1.1、起始行
- 请求行:请求报文的起始行,或称作请求行,包含了一个方法和一个请求的URL。
- 响应行:响应报文的起始行,或称作响应行,包含了响应报文使用的HTTP版本、数字状态码,以及原因短句。
1.2、实体首部
首部的分类是:
- 通用首部:既可以出现在请求报文中,也可以出现在通用报文中。
- 请求首部:提供更多请求相关的信息。
- 响应首部:提供更多响应相关的信息。
- 实体首部:描述主体的长度和内容,或者资源自身。
- 扩展首部:待定。
1.3、实体主体
它是HTTP要传输的内容,可选。
2、方法
- GET:是最常用方法,通常用于请求服务器发送某资源。
- HEAD:与GET方法类似,但是服务器响应的报文实体只包含首部。
- PUT:请求向服务器写入数据。
- POST:通常用来支持表单数据(HTML、JSON),用于向服务器发送表单数据。
- TRACE:主要用于诊断,当客户端发出一个请求时,会穿过防火墙、代理、网关或一些其它应用,每个中间节点都可能会修改原始的HTTP请求,TRACE请求会在目的服务器端发起一个“环回”诊断,目的服务器收到报文后会弹回TRACE响应,并在响应主体中携带它收到的原始请求报文,这样客户端可以查看所有中间HTTP应用程序组成的请求/响应链上,原始报文是否,以及如何被损坏或修改过。
不能包含实体主体部分。 - OPTIONS:用于请求服务器告知其支持的各种功能。
- DELETE:请求服务器删除指定资源。
- 安全方法:GET\HEAD。
- 扩展方法:不在HTTP1.1中,但是服务器会为他所管理的资源实现一些HTTP服务。
3、状态码
4、 首部
4.1、通用首部
提供了报文相关的最基本信息,我们称之为通用首部。
- 通用的信息性首部
首部 | 描述 |
---|---|
Connection | 允许客户端与服务器指定与请求/响应连接有关的选项 |
Date | 提供日期和时间标志,说明报文时什么时候建的 |
MIME-Version | 给出了发送端使用的MIME版本 |
Trailer | 如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文拖鞋 (trailer)部分的首部 |
Transfer-Encoding | 告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式 |
Update | 给出了发送端可能想要"升级"使用的新版本或协议 |
Via | 显示了报文经过的中间节点(代理、网关) |
Warning | 错误通知 |
- 通用缓存首部
HTTP/1.0允许 HTTP应用程序缓存对象本地副本的首部,这样就不用总是从源服务端获取。
首部 | 描述 |
---|---|
Cache-Control | 用于随报文传送缓存指示 |
Pragma | 另一种随报文传送指示的方式,但并不专用于缓存 |
4.2、请求首部
服务器可以根据请求首部给出的客户信息,为客户端提供更好的响应。
- 请求的信息性首部
首部 | 描述 |
---|---|
Client-IP | 提供了运行客户端的机器的IP地址 |
From | 提供了客户端用户的E-mail地址 |
Host | 给出了接收请求的服务器的主机名和端口号 |
Referer | 提供了包含当前请求URI的文档的URL |
UA-Color | 提供了与客户端显示器的显示颜色有关的信息 |
UA-CPU | 给出了客户端CPU的类型或制造商 |
UA-Disp | 提供了与客户端显示器(屏幕)能力有关的信息 |
UA-OS | 给出了客户端显示器的像素信息 |
UA-Pixels | 提供了客户端显示器的像素信息 |
User-Agent | 将发起请求的应用程序名称告知服务器(User-Agent)用户代理,其实不就是浏览器吗 |
- Accept首部
Accept首部会使连接的两端受益,客户端能得到想要的,服务端不会浪费时间和宽度来发送客户端无法使用的东西。
首部 | 描述 |
---|---|
Accept | 告诉服务器能够发送哪些媒体类型 |
Accept-Charset | 告诉服务器能够发送哪些字符集 |
Accept-Encoding | 告诉服务器能够发送哪些编码方式 |
Accept-Language | 告诉服务器能够发送哪些语言 |
TE | 告诉服务器可以使用哪些扩展传输编码 |
- 条件请求首部
客户端为请求加上条件限制,服务器根据这些条件,作出准确的行为和响应。
首部 | 描述 |
---|---|
Expect | 允许客户端列出某请求所要求的服务器行为 |
If-Match | 如果实体标记与文档当前的实体标记相匹配,就或者这份文档 |
If-Modified-Since | 除非在某个指定的日期之后资源被修改过,否则就限制这个请求 |
If-Range | 允许对文档的某个范围进行条件请求 |
If-Unmodified-Since | 除非在某个指定的日期之后资源没有被修改过,否则就限制这个请求 |
Range | 如果服务器支持范围请求,就请求资源的指定范围 |
If-None-Match | 如果提供的实体标记与当前文档的实体标记不相符,就获取文档 |
- 安全请求首部
对请求进行 质询/响应 认证,这种机制要求客户端在获取特定资源之前,先对自身进行认证。
首部 | 描述 |
---|---|
Authorization | 包含了客户端提供给服务器,以便对其自身进行认证的数据 |
Cookie | 客户端用它想服务器传送一个令牌-他并不是真正的安全首部,但却是隐含了安全功能 |
Cookie2 | 用来说明请求端支持的cookie版本 |
- 代理请求首部
协助代理更好的工作。
首部 | 描述 |
---|---|
Max-Forword | 在通往源端服务器的路径上,将请求转发给其他代理或网关的最大次数-与TRACE方法一同使用 |
Proxy-Authorization | 与Authorization首部相同,但这个首部是在与代理进行认证时使用的 |
roxy-Connection | 与Connection首部相同,但这个首部是在于代理建立连接时使用的 |
4.3、响应首部
响应报文自己的首部集,为客户端提供一些额外的信息。
- 响应的信息性首部
首部 | 描述 |
---|---|
Age | (从最初创建开始)响应持续时间 |
Public | 服务器为其资源支持的请求方法列表 |
Retry-After | 如果资源不可用的话,再次日期或时间重试 |
Server | 服务器应用程序软件的名称和版本 |
Title | 对HTML文档来说,就是HTML文档的源端给出的标题 |
Warning | 比原因短语中更详细的一些警告报文 |
- 协商首部
HTTP/1.1可以为服务器和客户端提供对资源进行协商的能力
首部 | 描述 |
---|---|
Accept-Ranges | 对此资源来说,服务器可接受的范围类型 |
Vary | 服务器查看的其他首部的列表,可能会使响应发生变化;也就是说,这是一个首部列表,服务器会根据这些首部的内容挑选出最合适的资源版本发送给客户端 |
- 安全响应首部
HTTP质询/响应认证机制的响应侧的首部。
首部 | 描述 |
---|---|
Proxy-Authenticate | 来自代理的对客户端的质询列表 |
Set-Cookie | 不是真正的安全首部,但隐含有安全功能;可以在客户端设置一个令牌,以便服务器对客户端进行标识 |
Set-Cookie2 | 与Set-Cookie类似 |
WWW-Authenticate | 来自服务器的对客户端的质询列表 |
4.4、实体首部
实体首部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够针对资源使用的各种有效的请求方法。
- 实体信息型首部
首部 | 描述 |
---|---|
Allow | 列出了可以对此实体执行的请求方法 |
Location | 告知客户端实体实际上位于何处;用于将接收端定向到资源的位置上去 |
- 内容首部
提供了与实体有关的特定信息,说明了其类型、尺寸及处理它所需要的其它有用信息。
首部 | 描述 |
---|---|
Content-Base | 解析主体中的相对URL时使用的基础URL |
Content-Encoding | 对主体执行的任意编码方式 |
Content-Language | 理解主体时最适宜使用的自然语言 |
Content-Length | 主体的长度或尺寸 |
Content-Location | 资源实际所处的位置 |
Content-MD5 | 主体的MD5校验 |
Content-Range | 在整个资源中此实体表示的字节范围 |
Content-Type | 这个主体的对象模型 |
- 实体缓存首部
提供了与被缓存实体有关的信息。
首部 | 描述 |
---|---|
ETag | 与此实体有关的实体标记 |
Expires | 实体不在有效,要从原始的源端再次获取此实体的日期和时间 |
Last-Modified | 这个实体最后一次被修改的日期和时间 |
5、实体首部的实例
在google输入“www.baidu.com”,然后搜索,获取到请求首部和响应首部。
请求首部:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: BAIDUID=19DE9A3DCC34F43ED4144CE630EDAF55:FG=1
Host: www.baidu.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36
响应首部:
Bdpagetype: 1
Bdqid: 0xcfe6510900044ae7
Bduserid: 0
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Cxy_all: baidu+b64cfddc86ec399d47a023f16d98c06a
Date: Wed, 21 Mar 2018 09:17:45 GMT
Expires: Wed, 21 Mar 2018 09:17:13 GMT
Server: BWS/1.1
Set-Cookie: BIDUPSID=19DE9A3DCC34F43ED4144CE630EDAF55; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: H_PS_PSSID=1447_21103_17001_20927; path=/; domain=.baidu.com
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: PSTM=1521623865; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Powered-By: HPHP
X-Ua-Compatible: IE=Edge,chrome=1