xzhuz / blog-gitment

博客备份和comment记录
https://meisen.pro
0 stars 0 forks source link

图解HTTP之HTTP通用首部 #18

Open xzhuz opened 6 years ago

xzhuz commented 6 years ago

https://meisen.pro/article/182ffdf6c60f4aaa9fd002d641bed96c

1 Cache-Control

 通过制定首部字段Cache-Control的指令,就能操作缓存的工作机制。示例如下:

Cache-Control: private, max-age=0, no-cache

1.1 public

Cache-Control: public

 表明其他用户也可以使用缓存。

1.2 private

Cache-Control: private

 响应只以特定的用户作为对象

1.3 no-cache && no-store

 使用no-cache的目的是为了防止从缓存中返回过期的资源。客户端请求中包含no-cache指令是,表明客户端不会接受缓存过的响应。服务器端响应中包含no-cache指令时,表明客户端不会对响应进行缓存。

 可以也只能在响应中指定no-cache的参数

Cache-Control: no-cache=Location

 使用no-store指令时,说明请求或响应中包含机密信息。因此该指令规定不能再本地存储请求或响应的任一部分。

Cache-Control: no-store

no-cache表示不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源。

no-store才表示不真正的进行缓存

1.4 max-age && s-maxage

 当客户端请求中包含max-age指令时,如果判断资源缓存的缓存时间数值比指定的时间数值要小的时候,那么客户端就能接收缓存的数值。服务器返回的响应中包含max-age指令时,缓存服务器不对资源有效性进行确认,max-age的数值就是缓存的有效时间。

应用HTTP/1.1版本的缓存服务器遇到同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略Expires首部字段。而HTTP/1.0版本的缓存服务器的情况相反

 s-maxage指令的功能和max-age相同,不同点就是s-maxage指令只适用于供多位用户使用的公共缓存服务器(一般指代理)

1.5 min-fresh

    Cache-Control: min-fresh=60

 表示要求缓存服务器至少返回未过指定时间的缓存资源

1.6 max-stale

Cache-Controle: max-stale=3600

 表示可指定资源,即使过期也同样接收。

1.7 only-if-cached

 表示客户端仅在缓存服务器本地资源目标资源的情况下才会要求其返回。就是说,该指令要求缓存服务器不重新加载响应,也不会再次确认资源的有效性。若发生请求资源服务器的本地缓存无响应,则会返回状态码504 Gateway Timeout

1.1.8 must-revalidate

 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。

1.9 no-transform

Cache-Control: no-transform

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

1.10 扩展 cache-extension token

Cache-Control: private, community="UCI"

 仅能对理解他的缓存服务器是有意义的。

 Cache-Control指令一览

指令 参数 说明
no-cache 强制向源服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age= [ 秒 ] 必需 响应的最大Age值
max-stale (= [ 秒 ]) 可省略 接收已过期的响应
min-fresh = [ 秒 ] 必需 期望在指定时间内的响应仍有效
no-transform 代理不可更改的媒体类型
only-in-cached 从缓存获取资源
cache-extension - 新指令标记 (token)

 缓存响应指令

指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅想特定用户返回响应
no-cache 可省略 缓存前必须先确认其有效性
no-store 不可缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 要求中间缓存服务器对缓存的响应有效性在进行确认
max-age = [ 秒 ] 必需 响应的最大Age
s-maxage = [ 秒 ] 必需 公共缓存服务器响应的最大Age值
cache-extension - 新指令标记 ( token )

2 Connection

 Connection字段有两个作用:

2.1 不在转发代理的首部字段

Connection: 不在转发的首部字段

转发代理的首部字段

2.2 管理持久链接

Connection: Keep-Alive

 HTTP/1.1版本的默认连接都是持久连接。当服务端想要断开连接的时候,则指定首部字段Connection的值为close.

Connection: close

3 Date

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

4 Pragma

 HTTP/1.1版本之前遗留字段,只为兼容。常用方式:

Cache-Control: no-cache
Pragma: no-cache

5 Trailer

 字段会事先说明在报文主体后记录了那些首部字段。该首部字段可用于HTTP/1.1版本分块传输编码时。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2018 04:40:56 GMT
Content-Type: text/html
...
Transfer-Encoding:chunked
Trailer: Expires

...(报文主体)...
0
Expires: Tue, 03 Jul 2018 14:40:56 GMT

6 Transfer-Encoding

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

HTTP/1.1的传输编码方法仅对分块传输编码有效

7. Upgrade

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

 上图用例中,首部字段Upgrade指定的值为TLS/1.0.请注意此处两个字段首部字段的对应关系,Connection的值被指定为Upgrade.Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此,使用首部字段Upgrade时,还需要额外指定Connection:Upgrade

这里是笔者有点疑惑的地方,不知道这里的Connection字段的作用,后面如果找到会不上去

 对于附有首部字段Upgrade的请求,服务器可用101 Switching Protocols状态码作为响应返回。

7. Via

 使用Via是为了跟踪客户端与服务器之间的请求和响应报文的传输路径。

8. Warining

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

Warning: [警告码] [警告的主机:端口号] "[警告内容]" ([日期时间])
Warning: 112 127.0.0.1:8080 "Heuristic expiration" Tue, 03 Jul 2018 04:40:56 GMT
警告码 警告内容 说明
110 Response is stale (响应已过期) 代理返回已过期的资源
111 Revalidation failed (再验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因)
112 DisConnection operation(断开连接操作) 代理与互联网连接被故意切断
113 Heuristic expiration(试探性过期) 响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)
199 Miscellaneous warning(杂项警告) 任意的警告内容
214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
299 Miscellaneous persistent warning(持久杂项警告) 任意的警告内容

转载请注明出处