《图解HTTP》- HTTP 首部 - 学习笔记(四)

第6章 HTTP 首部

6.1 HTTP 报文首部



  • HTTP 请求报文
    在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成。
  • HTTP 响应报文
    在响应中,HTTP 报文由 HTTP 版本、状态码(数字和原因短语)、 HTTP 首部字段 3 部分构成。


6.2 HTTP 首部字段

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

HTTP 首部字段是构成 HTTP 报文的要素之一。在客户端与服务器 之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首 部字段,它能起到传递额外重要信息的作用。

6.2.2 HTTP 首部字段结构

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




6.2.3 4 种 HTTP 首部字段类型

HTTP 首部字段根据实际用途被分为以下 4 种类型。

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

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 中定义的首部字段,它们的使用频率也很高。
这些非正式的首部字段统一归纳在 RFC4229 HTTP Header Field Registrations 中。

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

HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种
类型。
端到端首部(End-to-end Header)
分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且 必须保存在由缓存生成的响应中,另外规定它必须被转发。
逐跳首部(Hop-by-hop Header)
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不 再转发。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部, 需提供 Connection 首部字段。

下面列举了 HTTP/1.1 中的逐跳首部字段。除这 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 的指令,就能操作缓存的工作机制
指令的参数是可选的,多个指令之间通过“,”分隔。首部字段Cache-Control 的指令可用于请求及响应时。

  • Cache-Control 指令一览


表示是否能缓存的指令
  • public 指令

    当指定使用 public 指令时,则明确表明其他用户也可利用缓存。

  • private 指令

    当指定 private 指令后,响应只以特定的用户作为对象,这与 public 指令的行为相反。
    缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发 送过来的请求,代理服务器则不会返回缓存。

  • no-cache 指令(代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源 --> 请求报文/响应报文中的不同作用;有无参数的区别)

    使用 no-cache 指令的目的是为了防止从缓存中返回过期的资源。

  • 请求报文/响应报文中的不同作用:
    1.客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。
    2.如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。

  • 有无参数的区别:
    3.由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache 字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。

控制可执行缓存的对象的指令
  • no-store 指令(代表不缓存)

    当使用 no-store 指令时,暗示请求(和对应的响应)或响应中包含机密信息。
    因此,该指令规定缓存不能在本地存储请求或响应的任一部分。

  • no-cache 与 no-store 的区别:
    从字面意思上很容易把 no-cache 误解成为不缓存,但事实上 no-cache 代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,也许称为 do-not-serve-from-cache-without-revalidation 更合适。no-store 才是真正地不进行缓存。

你可能感兴趣的:(《图解HTTP》- HTTP 首部 - 学习笔记(四))