http协议的请求和响应报文中必定包含http首部,只是平时我们在使用Web的过程中感受不到它,对它关注的也不是很多,最近在阅读《图解HTTP》,学习一下HTTP首部的结构,已经首部中各字段的用法。
HTTP报文首部
HTTP协议的请求和响应报文中必定包含HTTP首部,首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。列了一个请求和响应报文的大致结构脑图
请求和响应中都会存在着首部字段,它们为浏览器和服务器,传递额外重要信息。
通常HTTP首部字段由首部字段名和字段值,中间以":"分割组成:
Request Method: GET
字段值对应单个HTTP首部字段可以有多个值:
cache-control: public, max-age=0
首部字段类型
HTTP首部字段根据实际用途分为4中类型。
通用首部字段: 请求报文和响应报文两方都会使用到的首部。
请求首部字段: 从客户端向服务器发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应首部字段: 从服务器端向客户端返回响应报文时使用的首部,补充了响应时的附加内容,也会要求客户端附加额外的内容信息。
实体首部字段: 针对请求报文和响应报文的实体部分使用到的首部,补充了资源内容更新时间等与实体有关的信息。
通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Transfer-Encoding | 指定报文传输主体的编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
请求首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可以处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Authorization | Web认证信息 |
Except | 期待服务器的特定行为 |
Host | 请求资源所在的服务器 |
if-Match | 比较实体标记(ETag) |
if-Modified-Since | 比较资源的更新时间 |
Range | 实体的字节范围请求 |
Refer | 实体的字节范围请求 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过的时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定UPI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器的管理信息 |
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小 |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
EXpires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
一一细说
Cache-Control
Connection
- 可以控制将某些字段不再转发给代理
- 管理持久连接
Connection : Keep-Alive
Date
表明创建HTTP报文的日期和时间
date: Sun, 19 May 2019 06:05:00 GMT
PraGma 用来向后兼容只支持HTTP/1.0协议的缓存服务器,那时候 HTTP/1.1 协议中的 Cache-Control 还没有出来。
Pragma: no-cache
Trailer 说明报文主体后使用了哪些首部字段,可用在HTTP/1.1版本分块传输编码时。
Transfer-Encoding 规定了传输报文主体时采用的编码方式(仅对分块传输编码有效)
Upgrade 用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议(仅限与客户端和临接服务器之间,因此使用首部字段Upgrade时还需要额外指定connection:Upgrade)
Via 为了追踪客户端和服务器之间的请求和响应报文的传输路径。当报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后在进行转发
Warning 通常会告知用户与缓存有关的问题的警告信息,格式如下
Warning [警告码] [警告的主机:端口号] "警告内容" ([日期时间])
请求首部字段
是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
Accept 通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级,可以使用q=num来代表权重的优先值,权重值num的取值范围是0-1,可以精确到三位小数,1为权重最大值,默认为1.
Accept: text/html,application/json;q=0.9, application/xml;q=0.8
Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序,权重用法同Accept字段的q
Accept-Encoding 首部字段可用来通知服务器用户代理支持的内容编码及编码的优先级,可以一次性指定多种内容编码,采用权重q表示优先级。
Accept-Encoding: gzip, deflate, cpmpress, identity
Accept-Language 首部字段用来告知服务器,用户代理能够处理的语言,采用权重q指定优先级
Authorization 用来告知服务器用户代理的认证信息, 用于验证用户身份的凭证。
Expect 用于告知服务器期望出现的某种特定行为, 浏览器暂不使用
Form 发送请求的用户代理的邮箱的实际操控者的邮箱
Host 指明请求服务器的域名, 及服务器所监听的Tcp端口号,如果没有给定端口,会自动使用被请求服务的默认端口, 用于告知服务器请求资源所处的服务器域名及端口号。
条件请求
形如 if-XXXX的请求首部字段,都是条件请求,服务器接收到附带的请求条件后,只有当条件满足时,服务器才会执行
if-Match 通常在请求方法为get时,服务器仅在请求资源的ETag值为if-Match首部字段值之一时,才会返回资源,当请求方法为Put时,才允许上传资源。ETag为一份资源独一无二的实体标记,资源更新后实体标记值ETag也会更新。
if-Modified-since 通常该字段只用在get请求中,如果资源在if-Modified-Since字段值日期之后发生更新,则服务器接受该请求, 否则会返回一个不带响应体的304(Not Modified),用于确认代理或客户端本地资源的有效性
if-None-Match 当且仅当服务器上没有任何资源的实体标记ETag值与该首部字段中列出的值相对应是,服务器才会返回所请求的资源,否则返回304
if-Range 范围请求;用来当满足条件时(当if-range字段值中的条件得到满足,通常是满足last-Modified或ETag),是Range字段起作用,服务器返回206 Partial Content,如果if-Range字段值中的条件没有得到满足,则作为正常处理返回 200 OK的全部资源。
Proxy-Authorization 用于用户代理给代理服务器发送身份验证的凭证
Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
Range 用于只需获取部分资源的范围请求,字段值表明服务器资源的指定范围
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
Referer 可以根据Referer查看请求资源的是从哪个页面发起的
TE 告知服务器客户端能够处理响应的传输编码方式以及相对优先级
User-Agent 将创建请求的浏览器和用户代理信息等名称传达给服务器
User-Agent: <product> / <product-version> <comment>
//<product> 产品识别码
//<product-version> 产品版本号
//comment 0个或多个关于组成产品信息的注释
响应首部字段
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息、以及对客户端的附加要求信息。
Accept-Ranges 用于告知客户端服务器能否处理范围请求
Accept-Ranges: none | bytes //
Age 能告知客户端,源服务器在多久前创建了响应,字段值的单位为秒。
ETag 它是一种将资源以字符串的形式做唯一标识性的方式,服务器会为每份资源分配对应的ETag值,当资源更新时,ETag值也会更新。没有特定的生成算法,通常使用资源最后修改时间戳的哈希值,或散列或版本号。
用处: 1.防止资源的同时更新而导致的相互覆盖(空中碰撞);
2.缓存未更改的资源
Location 指定需要将页面重新定向至的地址
Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。指定了获取代理服务器上的资源访问权限而采用的身份验证方式。代理服务器对请求进行验证,以便它进一步传递请求
Retry-After 告知客户端应该在多久后可以再次发起请求。主要配合状态吗503(Service Unavailable)响应。
Server 首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
Vary 当代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果使用的Accept-Language字段的值相同,那么就直接从源服务器返回响应,反之,则需要先从源服务器获取资源后才能作为响应返回。
WWW-Authenticate 用于HTTP访问认证。它会告知客户端适用于访问请求的URI所指定资源的认证方案(Basic 或是Digest);定义了何种验证方式去获取对资源的连接
实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间与实体相关的信息。请求报文和响应报文中都含有的与实体相关的首部
ALlow 由于枚举资源所支持的HTTP方法的集合,当服务器接收到不支持的HTTP方法时,会返回405(Method Not Allowed )作为响应返回,于此同时还会把所有能支持的HTTP方法写入首部字段Allow返回。
Allow: GET, POST, HEAD
Content-Encoding 告知客户端服务器对实体的主体部分选用的内容编码方式。(内容编码是指在不丢失实体信息的前提下所进行的压缩)常用的有gzip、compress、deflate、 identify;
Content-Language 告知客户端实体主体使用的自然语言
Content-Language: zh-CN
Content-Length 实体主体部分的大小(bites)
Content-Location 首部字段Content-Location给出与报文主体部分相对应的URI。和首部字段Location不同,Content-Location表示的是报文主体返回的资源对应的URI。
Content-MD5
Content-Range
Content-type 说明了实体主体部分的媒体类型,和首部字段Accept一样,字段值用type/subtype 形式赋值
Expires 会将资源失效的日期告知客户端,缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本会一直保存,当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源
Last-Modified 指明资源最后的修改时间
来源:CSDN
作者:bylfsj
链接:https://blog.csdn.net/bylfsj/article/details/104111753