《图解HTTP》HTTP首部(1)

一、HTTP报文首部

  HTTP结构包括:报文首部、空行、报名主体

  

  HTTP请求报文包括:方法、URI、HTTP版本、HTTP首部字段

  

   HTTP响应报文包括:HTTP版本、状态码、HTTP首部字段

   

二、HTTP首部字段

1、HTTP首部字段传递重要信息

  首部字段:给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容

2、HTTP首部字段结构

  HTTP首部字段:由首部字段名和字段值构成的,中间用冒号":"分隔

  如:Content-Type:text/html (表示报文主体对象类型为 text/html)

  注意:若HTTP首部字段重复,不同浏览器内部处理逻辑会不一样。

3、4种HTTP首部字段类型

  通用首部字段

  请求首部字段

  响应首部字段

  实体首部字段

4、HTTP1.1首部字段一览

  通用首部字段

 

   请求首部字段

   响应首部字段

   实体首部字段

5、非HTTP1.1首部字段

  其他使用比较频繁的:Cookie、Set-Cookie、Content-Disposition

6、End-to-end首部和Hop-by-hop首部

  HTTP首部字段的两种类型:缓存代理和非缓存代理

  端到端的首部:首部会转发给请求/响应到最终接收目标,必须保存在由缓存生产的响应中,必须被转发。

  逐跳首部:只对单次转发有效,会因缓存、代理不转发。如果使用Hop-by-hop,需提供Connection。

  逐跳首部只包括:Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encding、Upgrade

三、HTTP1.1通用首部字段

1、Cache-Control:操作缓存的工作机制

(1)表示是否能缓存的指令   

    public指令:Cache-Control:public  其他用户都可以使用缓存

    private指令:Cache-Control:private  对特定的用户提供资源缓存服务;其他用户发送的请求,代理服务器不会返回缓存

    no-cache指令:cache-Control:no-cache=location

       目的:防止从缓存中返回过期的资源

       客户端发送的no-cache指令:客户端不会接收缓存的响应,需要让缓存服务器把客户端的请求转发给源服务器

       服务器响应的no-cache指令:缓存服务器不能对资源进行缓存,源服务器不再对缓存服务器请求中的资源有效性进行确认,禁止缓存服务器对响应资源进行缓存

(2)控制可执行缓存的对象的指令

    no-store指令:Cache-Control:no-store   缓存不能在本地存储请求或响应的任意部分

  指定缓存期限和认证的指令

    s-maxage指令:Cache-Control:s-maxage=604800  适用供多位用户使用的公共缓存服务器(对同一用户重复返回响应的服务器是没有作用的),直接忽略对Expires首部字段及max-age指令的处理

    max-age指令:Cache-Control:max-age=604800  缓存资源的缓存时间小于指定时间,客户端就接收缓存资源(若为0,则需要缓存服务器转发给源服务器)。缓存服务器不再对资源的有效期进行确认,max-age数值表示资源缓存的最长时间。http/1.1版本的缓存服务器会优先处理max-age指令,忽略Expires首部字段。http/1.0正相反。

    min-fresh指令:Cache-Control:min-fresh=60   缓存服务器返回还未到指定时间的缓存资源(超过有效期的资源无法作为响应返回了)

    max-stale指令:Cache-Control:max-stale=3600   缓存资源即使过期也照常接收(若没有参数,客户端永久接收;若指令的具体数过期了,只要在max-stale指定的时间内,客户端仍接收)

    only-if-cached指令:Cache-Control:only-if-cached  客户端仅在缓存服务器本地缓存目标资源情况下还会要求其返回。(缓存服务器不重新加载响应,也不确认资源有效性,若本地缓存无响应,返回504Gateway Timeout)

    must-revalidate指令:Cache-Control:must-revalidate  代理向源服务器再次验证即将返回的响应是否有效(若无法连接源服务器返回504Gateway Timeout)会忽略请求max-stale指令(即使已经在首部使用了max-stale,也不会有效果)

    proxy-revalidate指令:Cache-Control:proxy-revalidate  所有的缓存服务器在接收到客户端带有该指令的请求返回响应前,必须再次验证缓存的有效性。

    no-transform指令:Cache-Control:no-transform   请求或响应中,缓存不能改变实体主体的媒体类型(防止缓存或代理压缩图片等)

(3)Cache-Control扩展

    cache-extension token : Cache-Control:private,community="UCI"   只能对理解他的缓存服务器有意义(借助extension tokens实现某些指令的添加,若缓存服务器不理解就会忽略)

2、Connection

  控制不再转发给代理的首部字段(Hop-by-hop首部)

  

  管理持久连接

  HTTP/1.1版本默认连接是持久性连接。服务器想断开连接,需使用Connection:Close

  之前的HTTP版本默认是非持久性连接。若想持续连接,需使用Connection:Keep-Alive

3、Date

  HTTP/1.1RFC1123中规定的日期 Date:Tue,03 Jul 2012 04:40:59 GMT

  之前的HTTP版本RFC850中规定的日期 Date:Tue,03-Jul-12 04:40:59 GMT

  与C标准库内的asctime()函数输出一致 Date:Tue,Jul 03 04:40:59 2012

4、Pragma

  Pragma:no-cache  为了兼容HTTP/1.0而定义的

  

  中间服务器是HTTP/1.1协议的,直接采用:Cache-Control:no-cache指定缓存方式

  中间服务器是HTTP/1.0协议的,需要采用: pragma:no-cache 的缓存方法

  因此发送的请求会同时包含这两个首部字段

5、Trailer

  事先说明在报文主体后记录了哪些首部字段,适用于:HTTP/1,1版本分块传输编码

6、Transfer-Encoding

   传输报文主体时采用的编码方式,HTTP/1.1的传输编码方式只对分块传输编码有效

  

7、Upgrade

  首部字段Upgrde用于检测http协议或其他协议是否可以使用更高的版本进行通信,其参数值可以指定一个完全不同的通信协议

8、Via

  使用首部字段Via:为了追踪客户端与服务器之间的请求和响应报文的传输路径。

  报文在经过代理或网关时,会先在首部子段Via中附加该服务器的信息,然后再进行转发。

  Via首部是为了追踪传输路径,所以经常会和trace方法发送请求(其中Max-Forwards:0时,代理服务器就不转发该请求了,直接增加via并返回请求的响应)

9、Warning

  Warning:[警告码][警告主机:端口号]"[警告内容]"([日期时间])

  该首部通常会告知用户一些与缓存相关的问题的警告。

  Waring首部的格式如下。最后的日期时间可以省略。

 

 

posted @ 2020-12-19 23:59  竹小冉  阅读(248)  评论(0编辑  收藏  举报