http协议的请求和响应报文中一定包含http首部,只是平时咱们在使用Web的过程当中感觉不到它,对它关注的也不是不少,最近在阅读《图解HTTP》,学习一下HTTP首部的结构,已经首部中各字段的用法。html
HTTP协议的请求和响应报文中一定包含HTTP首部,首部内容为客户端和服务器分别处理请求和响应提供所须要的信息。列了一个请求和响应报文的大体结构脑图 算法
Request Method: GET
复制代码
字段值对应单个HTTP首部字段能够有多个值:json
cache-control: public, max-age=0
复制代码
HTTP首部字段根据实际用途分为4中类型。浏览器
通用首部字段: 请求报文和响应报文两方都会使用到的首部。缓存
请求首部字段: 从客户端向服务器发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。bash
响应首部字段: 从服务器端向客户端返回响应报文时使用的首部,补充了响应时的附加内容,也会要求客户端附加额外的内容信息。服务器
实体首部字段: 针对请求报文和响应报文的实体部分使用到的首部,补充了资源内容更新时间等与实体有关的信息。app
通用首部字段ide
首部字段名 | 说明 |
---|---|
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 指明资源最后的修改时间