《图解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首部的格式如下。最后的日期时间可以省略。