《图解HTTP》——HTTP首部

438 阅读6分钟

HTTP协议的请求和响应报文中必定包含HTTP首部。这一章有很多的表格,我的想法是用到的时候再去记,因为里面有挺多是很少接触到的,或者说是不必去特别理解的。

6.1 HTTP报文首部

HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器端分别处理请求和响应提供所需要的的信息。

  • HTTP请求报文
    在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
  • HTTP响应报文
    在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段三部分构成。
    在报文众多的字段中,HTTP首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖HTTP报文相关的内容信息。

6.2 HTTP首部字段

6.2.1 HTTP首部字段传递重要信息

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

6.2.2 HTTP首部字段结构

HTTP首部字段是由首部字段名和字段值构成的。

若HTTP首部字段重复了会如何?
这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。

6.2.3 4种HTTP首部字段类型

  • 通用首部字段
    请求报文和响应报文两方都使用。
  • 请求首部字段
    从客户端向服务器端发送请求报文时使用的头部。补充了请求的附加内容、客户端信息、相应内容相关优先级等信息。
  • 响应首部字段
    从服务器端向客户端发送响应报文时使用的头部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
  • 实体首部字段
    针对请求报文和响应报文的实体部分使用的头部。补充了资源内容更新时间等与实体有关的信息。

6.2.4 HTTP/1.1首部字段一览

HTTP/1.1规范定义了如下47种首部字段。

6.2.5 非HTTP/1.1首部字段

在HTTP协议通信交互中使用到的首部字段,不限于RFC2616中定义的47种首部字段。还有Cookie、Set-cookie和Content-Disposition等在其他RFC中定义的首部字段。

6.2.6 End-to-end首部和 Hop-by-hop首部

HTTP首部字段将定义成缓存代理和非缓存代理的行为,分为两种类型。

  • 端到端首部(End-to-end Header)
    分在此类别的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
  • 逐跳首部(Hop-by-hop Header)
    分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1和之后的版本中,如果要使用此首部,需提供Connection首部字段。除这8个首部字段之外,其他所有字段都属于端到端首部。
    • Connection
    • Keep-Alive
    • Proxy-Authenticate
    • Proxy-Authorization
    • Trailer
    • TE
    • Transfer-Encoding
    • Upgrade

6.3 HTTP/1.1首部通用字段

通用首部字段是指,请求报文和响应报文双方都会使用的首部。

6.3.1 Cache-Control

作用:操作缓存的工作机制

表示是否能缓存的指令

  • Cache-Control: public
    明确表明其他用户也可利用缓存
  • Cache-Control: private
    响应只以特定的用户作为对象
  • Cache-Control: no-cache
    为了防止从缓存中返回过期的资源,缓存服务器不能对资源进行缓存
    • Cache-Control: no-cache=Location
      无参数值的首部字段可以使用缓存,只能在响应指令中指定该参数。

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

  • Cache-Control: no-store
    暗示请求或响应中包含机密信息。 该指令规定缓存不能再本地存储请求或响应的任一部分。 控制缓存期限和认证的指令
  • Cache-Control: s-maxage=604800(单位:秒)
    s-maxage指令的功能和max-age指令的相同,他们的不同点是前者只适用于供多位用户使用的公共缓存器(一般指代理)。也就是说对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。
    另外,当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理。
  • Cache-Control: max-age=604800(单位:秒)
    当客户端发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。
    当服务器返回的响应中包含max-age指令时,缓存服务器将不对资源的有效性再做确认,而max-age数值代表资源保存为缓存的最长时间
    HTTP/1.1版本缓存服务器会优先处理max-age指令,忽略Expires首部字段,而HTTP/1.1则完全相反。
  • Cache-Control: min-fresh=60(单位:秒)
    要求缓存服务器返回至少还未过指定时间(60s)的缓存资源。
  • Cache-Control: max-stale=3600(单位:秒)
    指示缓存资源,即使过期也照常接收
    如果指令未指定参数值,那么无论经过多久,客户端都会接收响应,如果指定具体参数值,那么即使过期,只要仍处于max-stale指定的时间内,仍旧会被客户端接收。
  • Cache-Control: only-if-cached
    表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回,也就时该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout。
  • Cache-Control: must-revalidate
    代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条504状态码
    使用must-revalidate指令会忽略请求的max-stale指令。
  • Cache-Control: proxy-revalidate
    要求所有的缓存服务器在接收到客户端带有改指令的请求返回响应之前,必须再次验证缓存的有效性。
  • Cache-Control: no-transform
    规定无论实在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。

Cache-Control扩展

  • Cache-Control: private, community="UCI"
    通过cache-extension标记(token),可以扩展Cache-Control首部字段内的指令
    如上例,Cache-Control首部字段本身没有community这个指令,借助extension tokens实现了该指令的增加。如果缓存服务器不能理解community这个新指令,就会直接忽略。因此,extension tokens仅对能理解它的缓存服务器来说是有意义的。

a~ 感觉这一章有点枯燥,还长0.0 明天再更