1、报文主体和实体的区别

报文主体 = 实体 + 实体头域
通常情况下,报文主体=实体主体,只有在传输过程中进行编码时,才会产生实体头域,比如content-Encoding和content-Length,详细可见参考里的知乎链接。

2、首部字段概述

首部字段是请求报文和响应报文都有的组成部分,可以理解为报文的元数据,首部字段里记录了这次请求或者响应的详细信息,比如时间、服务器域名等,首部字段又叫头域(header)。
http首部字段由首部字段名和首部字段值构成,中间用冒号:分隔,多个首部字段之间用逗号,分割,如下:

  1. Content-Type:text/html
  2. Keep-Alive:timeout=15,max=100

Content-Type为首部字段名,text/html为首部字段值。
首部字段分为四类;通用首部字段、请求首部字段、响应首部字段和实体首部字段。

3、通用首部字段

通用首部字段是请求报文和响应报文都会使用的头域,下面介绍比较常见的通用首部字段。

3.1 Cache-Control

Cache-Control首部字段操控缓存,举个Cache-Control首部字段的例子:

Cache-Control: private, max-age=0, no-cache

client和server通信过程中可能不直接交互,client端会把请求向发送给中间一级的服务器,该服务器处理后把处理后的请求再转发给真正的目标服务器,这个中间一级的服务器可以是代理服务器,也可以是缓存服务器。
缓存服务器是把目标服务器上的资源提前拷贝下来存在缓存服务器上,client端发送请求时,如果允许,会从缓存服务器上直接给client返回资源,而无需把请求转发给server,这样做可以减轻server端的请求数压力,降低响应时间。
private/puiblic
public表示可以向任意方提供响应的缓存,private表示只能向指定用户返回响应。
no-cache
客户端发送的请求中头域里有no-cache,表示客户端不接受过期的缓存,每次缓存服务器接收到client端发送来的请求时,都会向目标服务器发送请求确认资源是否过期;
服务端返回的响应里头域有no-cache,表示缓存服务器不能对该资源进行缓存。
no-store
请求或响应的头域里有no-store,表示不缓存请求和响应中的任何部分,一般会涉密。
max-age=值
请求头域里,代表客户端只接受在缓存服务器中缓存时间小于该值的资源;
响应头域里,代表缓存服务器不必在该时间段内向服务器确认资源的有效性。

3.2 Connection

两个作用:

  1. 管理持久链接;
  2. 控制不再转发的首部字段;

http/1.1版本默认链接都是持久连接,之前的版本想维持持久连接,需要在请求的通用首部字段里设置如下:

GET /http/1.1
Connection: Keep-Alive

服务器想明确断开连接时,响应的通用首部字段里设置如下:

Connection: close

客户端不想把某些首部字段转发给服务端,可在请求的首部字段里设置如下:

Connection: 不再转发的首部字段名

3.3 Date

表明创建http报文的具体日期和时间。

4、请求首部字段

请求首部字段用以补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容,以下列举工作中留意过的请求首部字段。

4.1 Accept系列

Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01

Accept字段通知服务器,用户代理能够处理的媒体类型及对应的优先级。
Accept-Charset: 用户代理支持的字符集;
Accept-Encoding:用户代理支持的编码方式;
Accept-language:用户代理支持的自然语言集;

4.2 Host

Host: www.baidu.com

告诉server,client要访问的资源所在的IP地址和该IP地址的机器上运行的虚拟主机域名。DNS解析Host里的域名时,找到该域名对应哪个IP(多个域名对应一个IP),这个IP对应一台服务器,上面运行着多个虚机,每个虚机对应一个域名(就是Host里的域名),找到这台服务器后,通过host找到这台服务器上的具体虚机。
Host是唯一必选的请求首部字段。

4.3 User-Agent

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

User-Agent会将创建请求的浏览器和用户代理名称等信息传给服务器。

4.4 Authorization

用户代理的认证信息(证书值)。

5、响应首部字段

响应首部字段用以补充访问的附加信息,服务器信息以及对客户端的附加要求等,下面列举工作中留意到的响应首部字段。

5.1 Age

Age告诉客户端,服务器在多久前创建了响应,字段值的单位为秒。

5.2 ETag

服务器会给每一份资源分配一个ETag值,当资源更新时,ETag值也会更新。(跟URI有什么区别?)
强ETag:资源发生细微的变化都会改变ETag值;
弱ETag:资源只有发生了根本性变化才会改变ETag值,字段前会加/W;

6、实体首部字段

实体首部字段是请求报文和响应报文中实体部分的头域,用以补充报文内容相关的附加信息,下面列举工作中留意到的实体首部字段。

6.1 Allow

服务端通知客户端,访问URI指定资源,服务端支持的所有http动词。

6.2 Content-Encoding

服务端告知客户端,服务器对实体的主体部分的编码方式。

6.3 Content-length

实体主体部分的大小,长度为字节。

6.4 Content-MD5

字符串,由MD5算法生成,目的是检查报文主体在传输过程中的完整性,以及确认是否传达。

6.5 Last-Modified

表明资源最终修改的时间。

7、定制化的首部字段

除了上面介绍的首部字段外,公司会根据业务特性在header中加入自定义的首部字段,参考华为云对象存储(OBS)的官网API文档,里面对响应消息头中介绍如图:
http/1.1首部字段 - 图1
文档中介绍obs服务自定义的头域格式为:x-obs-,开头有固定的前缀,与http1.1标准头域区分,上面介绍的x-obs-request-id是响应报文的头域,实际上是个UUID,与每次api请求相对应,如果返回码为5或者4**,响应报文的头域里会有这个requestid,用户可以提供这个request_id,_服务端查看进程日志时搜索这个request_id对应的后台日志,方便定位问题。

参考

http报文和实体的差别? www.zhihu.com
《图解HTTP》([日]上野宣 著)【简介书评在线阅读】 - 当当图书 product.dangdang.com
http首部字段 - 整鬼专家 - 博客园 www.cnblogs.com