HTTP学习笔记:HTTP首部字段(1)

HTTP报文首部

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

HTTP请求报文

在请求中,HTTP报文首部由以下几部分构成:

  • 请求行:方法、URI、HTTP版本
  • HTTP首部字段:
    • 请求首部字段
    • 通用首部字段
    • 实体首部字段

HTTP响应报文

在响应中,HTTP报文首部由以下几个部分构成:

  • 状态行:HTTP版本、状态码
  • HTTP首部字段
    • 响应首部字段
    • 通用首部字段
    • 实体首部字段

首部字段同时存在与请求和响应报文内,并涵盖HTTP报文相关的内容信息。

HTTP首部字段

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

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

  • 通用首部字段
    请求报文和响应报文两方都会使用的首部

  • 请求首部字段
    从客户端向服务器端发送请求报文时使用的首部。
    补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

  • 响应首部字段
    从服务器端向客户端返回响应报文时使用的首部。
    补充了响应的附加内容,也会要求客户端附加额外的内容信息。

  • 实体首部字段
    针对请求报文和响应报文的实体部分使用的首部。
    补充了资源内容更新时间等与实体有关的信息。

通用首部字段

请求报文和响应报文两方都会使用的首部。

Cache-Control

用于操作HTTP缓存。多个指令之间通过“,”分隔。

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

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

  • private指令
Cache-Controlprivate

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

  • no-cache指令
Cache-Control:no-cache

使用no-cache指令的目的是为了防止从缓存中返回过期的资源。每次在使用缓存之前都强制发送请求给源服务器进行验证,检查文件该没改变

从字面上理解很容易以为no-cache表示不缓存,但事实上no-cache代表不缓存过期的资源,缓存会向服务器进行有效性确认后处理资源。
后面提到的no-store才是不缓存资源。

  • no-store指令
Cache-Control:no-store

该指令规定缓存不能在本地存储请求或者响应。

与到期时间相关的指令
  • s-maxage指令
Cache-Control:s-maxage=604800(单位:秒)

s-maxage指令的功能和max-age指令相同,它们的不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器(即一般代理)
也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。

另外,使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理。

  • max-age指令
    设置缓存存储的最大周期,超过这个时间缓存被认为过期
Cache-Controlmax-age=604800(单位:秒)

这里写图片描述
当客户端发送的请求中包含max-age时,如果判定缓存资源的缓存时间比指定时间的数值更小,那么客户端就接受缓存的资源。

如果max-age指定为0,那么缓存服务器通常需要将请求转发给源服务器。

当服务器返回的响应中包含max-age时,缓存服务器将不对资源的有效性再做确认,max-age代表资源保存为缓存的最长时间。

在同时遇到Expires首部字段和max-age时,会优先处理max-age指令而忽略掉Expires首部字段。

  • min-fresh
Cache-Controlmin-fresh=60

min-fresh指令要求缓存服务器返回还未过指定时间的缓存资源。

  • max-stale指令

表示客户端愿意接收一个已经过期的资源。 可选的设置一个时间(单位秒),表示响应不能超过的过期时间。

Cache-Controlmax-stale=3600

如果指令未指定参数值,那么无论经过多久客户端都会接受缓存。
如果指令中指定了具体数值,那么只接受过期时间处于指定数值内的缓存。

  • only-if-cached
Cache-Control:only-if-cached

表示不要去获取新数据。客户端只希望获取缓存的响应,并且不去联系服务器去检查是否存在较新的副本。

与验证相关的指令
  • must-revalidate
Cache-Control:must-revalidate

使用这个指令,代理会向源服务器再次验证缓存是否有效。
另外,使用这条指令会忽略max-stale指令。

  • proxy-revalidate
Cache-Control: proxy-revalidate

与must-revalidate相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。

  • no-transform
Cache-Control: no-transform

表示无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。

这样做可以防止缓存或代理压缩图片等类似操作。

Connection

这个首部具备以下两个作用:

控制不再转发
Connection:不再转发的首部字段名

在代理向服务器进行转发时,将会删除指定的首部字段。

管理持久连接
Connection:close

HTTP 1.1版本的默认连接都是持久连接。当服务器想明确断开连接时则指定Connection首部字段为Close。

Connection:Keep-Alive

之前旧版本的HTTP默认连接都是非持久连接,为此如果想在旧版本的HTTP协议上维持持续连接,则需要指定为keep-alive。

客户端发送请求给服务器时,服务器端返回的响应中的首部字段会加上Keep-Alive和Connection后返回。

Date

表明创建HTTP报文的日期和时间。

Date:Sat, 07 Jan 2017 11:52:19 GMT

Trailer

这个字段会事先说明在报文主体后记录了哪些首部字段。
这个字段可应用在分块传输编码。

HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked
Trailer: Expires

7\r\n 
Mozilla\r\n 
9\r\n 
Developer\r\n 
7\r\n 
Network\r\n 
0\r\n 
\r\n
Expires: Wed, 21 Oct 2015 07:28:00 GMT

可以看到在首部中Trailer指定了Expires字段。这个字段在报文主体的后面也出现了。

Transfer-Encoding

规定了传输报文主体时采用的编码方式。

Upgrade

用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

Via

为了追踪客户端与服务器之间的报文传输路径。

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

Via不仅用于追踪报文的转发,还可以避免请求回环的发生,所以必须在经过代理时附加该首部字段内容。

Via首部用于追踪传输路径,因此经常和TRACE方法一起使用。

Warning

会告知用户一些与缓存相关的问题的警告。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值