《图解HTTP》笔记(一)
HTTP报文结构
- 请求报文:报文首部(方法,URI,HTTP版本,HTTP首部字段),空行,报文主体
- 响应报文:报文首部(HTTP版本,状态码,HTTP首部字段),空行,报文主体
其中首部字段包括通用首部字段,请求首部字段,响应首部字段,实体首部字段
通用首部字段
Cache-Control
字段可选,多个参数用,
隔开
Cache-Conrtrol: private, max-age=0, no-cache
常用指令
-
public
: 表示其他用户可以利用缓存 -
private
: 响应只以特定的用户作为对象,缓存服务器会对特定的用户提供缓存服务 -
no-cache
: 防止从缓存中返回过期的资源;在请求时,客户端不会接收缓存过的响应;在响应时,缓存服务器将不再进行缓存,源服务器不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其响应资源进行缓存操作。 -
no-cache=location
: 当no-cache
指令指定具体值时,客户端接收响应报文后不能使用缓存 -
no-store
: 请求中包含加密信息,不再进行缓存 -
s-maxage / max-age
: 参数值为时间,判定缓存资源时间比指定时间数值小时才可以接收缓存的资源;它们之间的区别:s-maxage
只适用于供多位用户使用的公共缓存服务器(一般是代理) -
min-fresh
: 要求缓存服务器返回至少还未过指定时间的缓存资源(例如指定数值为60s,则在60s内如果有过期的资源无法返回) -
max-stable
: 指定时间内的资源,即使过期也接收;若未指定参数,无论过期多久都可以接收(例如指定60s,那么资源过期时间在60s内也可以接收) -
only-if-cached
: 客户端尽在缓存服务器本地缓存目标资源的情况下才会要求其返回 -
must-revalidate
: 代理服务器返回前会再次向源服务器验证缓存是否有效(使用muast-revalidate
后会忽略max-stable
命令) -
proxy-revalidate
: 所有缓存服务器在返回缓存数据时,必须再次验证缓存的有效性 -
no-transform
: 禁止缓存改变实体主体的媒体类型
Connection
常用指令
-
close
: 关闭持久连接 -
keep-alive
: 保持持久化连接
http 都是无连接的,所以要使用
keep-alive
命令保持持久连接,这个命令一般在HTTP1.0
中使用,HTTP1.1
默认时持久连接
Date
表示HTTP报文的创建时间
Pragma
HTTP/1.0的遗留字段,也是用于缓存控制
所以一般缓存控制时都添加两个字段:
Cache-Control: no-cache
Pragma: no-cache
Trailer
用于事先说明报文主体记录了哪些首部字段
Transfer-Encoding
规定报文主体采用的编码方式
Upgrade
用于检测HTTP协议是否可以使用更高的版本进行通信,参数值:一个不同的通信协议
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
Upgrade 需要与 Connection 配合使用
via
追踪客户端与服务端之间的请求、响应报文的传输路径
Warning
告知用户关于缓存的警告信息
格式:
Warning: [警告码] [警告的主机:端口号] "[警告内容]" ([日期时间])
Warning: 113 a.baidu.com:8080 "Warning Content" Tue, 03 Jul 2012 05:09:00
常见警告码和警告内容
- 110:
Response is stale
响应已过期;代理返回已过期的资源 - 111:
Revalidation failed
再验证失败;代理再验证资源有效性时失败 - 112:
Disconnection operation
断开连接操作;代理与互联网连接被故意切断 - 113:
Heuristic expiration
试探性过期;响应的使用期超过24小时 - 199:
Miscellaneous warning
杂项警告;任意的警告内容 - 214:
Transformation applied
使用了转换;代理对内容编码或媒体类型等执行了某些处理 - 299:
Miscellaneous persistent warning
持久杂项警告;任意的警告内容
请求首部字段
Accept
客户端可以处理的媒体类型及媒体类型的优先级
常见媒体类型
- 文本类型:
text/html
,text/plain
,text/css
,application/xhtml+xml
… - 图片文件:
image/jpeg
,image/gif
,image/png
- 视频文件:
video/mpeg
… - 应用程序使用的二进制文件:
application/zip
…
优先级:使用参数q表示,参数值范围0-1
,精确到小数点后三位,默认优先级为1
示例:
Accept: text/html,application/xhtml+xml;q=0.9, */*;q=0.8
Accept-Charset
客户端支持处理的字符集及字符集处理优先级
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
Accept-Encoding
客户端支持处理的内容编码及内容编码的优先级
常见内容编码:
-
gzip
: 由文件压缩程序gzip生成的编码格式,采用LZ77算法
和32位的CRC
-
compress
: 由UNIX文件压缩程序compress
生成的编码格式,采用LZW算法
-
deflate
: 组合使用zlib
格式及由deflate
压缩算法生成 -
identity
: 不执行压缩或不会变化的默认编码格式
Accept-Encoding: gzip, deflate
Accept-Language
客户端支持处理的自然语言集及自然语言集的优先级
Accept-Language: zh-cn,zh;q=0.9, en-us,en;q=0.3
Authorization
用来告知服务器,用户代理的认证信息
Expect
客户端期望服务器出现的某种特定行为;
例如,等待状态码100响应的客户端在发送请求时,需要指定Expect
Expect: 100-continue
From
用来告知服务器使用用户代理的用户的电子邮件地址;其目的是为了显示搜索引擎等用户代理的负责人的电子邮件的联系方式
Host
用来告知服务器请求资源的主机名称和端口号;通常,相同IP地址下部署了多个域名,因此需要使用Host字段去理解请求的是哪个域名
Host: www.baidu.com
If-Match
条件请求,与Etag
搭配使用,只有当If-Match
的值与Etag
值匹配时,服务器才会接受请求,否则,返回412 Percondition Failed
If-Modified-Since
条件请求,与Last-Modified
搭配使用,只有当Last-Modified
的时间在If-Modified-Since
之后,服务器才会接受请求;即只有在If-Modified-Since
字段指定的日期后资源发生了更新,服务器才会接受请求。否则,返回304 Not-Modified
//客户端
If-Modified-Since: Thu, 15 Apr 2017 00:00:00 GMT
//服务端返回示例一
200 OK
Last-Modified: Sun, 29 Apr 2017 14:11:22 GMT
//服务端返回示例二
304 Not Modified
If-None-Match
用法与If-Match
相反,不再赘述;一般,在GET或HEAD方法中使用If-None-Match
可获取最新的资源,与If-Modified-Since
有些类似
If-Range
只有当If-Range
的值与Etag
值或更新的日期时间匹配一致,这个请求可以作为范围请求
处理,状态码 206 Partial Content
;否则返回全部资源,状态码200;
//客户端
If-Range: "123456"
Range: bytes=5001-10000
//服务端 Etag= 123456 范围请求
206 Partial Content
Content-Range: bytes=5001-10000/10000
Content-length: 5000
//服务端 Etag= 456789 返回全部资源
200 OK
Etag: "456789"
If-Unmodified-Since
与If-Modified-Since
作用相反,不再赘述;即指定的资源只有在字段值指定的日期后未发生更新,才处理请求,否则返回412 Precondition Failed
Max-Forwards
指定报文可经过的服务器最大数目,每经过一个服务器,值减1,当Max-Forwards
值为0时,不再进行转发,直接返回响应
Max-Forwards: 10
Proxy-Authorization
接受到代理服务器发出来的认证质询时,客户端会发送包含首部字段proxy-Authorization
的请求,以告知服务器认证所需要的信息;与Authorization
不同的是,认证行为发生在客户端与代理之间
Proxy-Authorization: Basic dGjwdiSDsngd5
Range
范围请求,告知服务器请求资源的指定范围,请求成功时返回206 Partial Content
;若无法处理请求则返回全部资源
Range: bytes=5001-10000
Referer
告知服务器请求的原始资源的URI
TE
客户端能够处理响应的传输编码方式及相对优先级,它与Accept-Encoding
的区别是它是传输编码,而Accept-Encoding
是内容编码;
TE: gzip, deflate;q=0.5
TE的另一种用法是,指定伴随trailer
字段的分块传输编码方式
TE: trailers
User-Agent
将创建请求的浏览器和用户代理名称等信息传达给服务器
响应首部字段
Accept-Ranges
告知客户端是否能处理范围请求,能处理返回值为bytes
,不能则返回none
Accept-Ranges: bytes
Age
告知客户端,源服务器在多久前创建了响应,字段值单位为秒;若创建该响应的服务器是缓存服务器,则Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时间必须加上首部字段Age
ETag
告知客户端实体标识,是一种可将资源以字符串形式做唯一性标识的方式。当资源更新时,ETag值也会更新;
强ETag值和弱ETag值
强ETag值:实体发生任何细微的变化都会改变其值
ETag: "uasg-1234"
弱ETag值:只用于提示资源是否相同。只有资源发生根本改变,才会改变ETag值。弱ETag值会在字段最开始附加/W
ETag: W/"usag-1234"
Location
将响应接收方引导至另一个不同的资源,配合3XX:Redirection
响应,提供重定向的URI
Proxy-Authenticate
该字段会把由代理服务器所要求的认证信息发送给客户端,其认证行为是在客户端与代理之间进行的。
Proxy-Authenticate: Basic realm="Usagidesign Auth"
Retry-After
告知客户端多久之后再次发送请求,常配合503 Service Unavailable
,3XX Redirect
响应,字段值:具体时间/秒数
Retry-After: 600
Server
告知客户端服务器上的应用程序信息
Server: Apache/2.2.17 (Unix)
Vary
用于缓存控制,在代理服务器接收到源服务器返回包含Vary指定项的响应后,仅对请求中含有相同Vary指定首部字段的请求返回缓存。
例如:
Vary: Accept-Language
当代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果使用的Accept-Language
字段的值相同,那么就直接从缓存返回响应;反之,则需要从源服务器端获取资源后才能作为响应返回
vary的意义在于告诉代理服务器/缓存/CDN,如何判断请求是否一样,vary中的组合就是服务器/缓存/CDN判断的依据,比如Vary中有User-Agent,那么即使相同的请求,如果用户使用IE打开了一个页面,再用Firefox打开这个页面的时候,CDN/代理会认为是不同的页面,如果Vary中没有User-Agent,那么CDN/代理会认为是相同的页面,直接给用户返回缓存的页面,而不会再去web服务器请求相应的页面。
WWW-Authenticate
用于HTTP访问认证。它会告诉客户端适用于访问请求URI所指定资源的认证方案(Basic 或 Digest)和带参数提示的质询(challenge)
WWW-Authenticate: Basic realm="Usagidesign Auth"
实体首部字段
Allow
通知客户端支持的HTTP方法;当服务器接收到不支持的HTTP方法时,会返回405 Method Not Allowed
,同时会返回所有支持的方法
Allow: GET, HEAD
Content-Encoding
告知客户端服务器对实体的主体部分选用的内容编码方式
Content-Encoding: gzip
Content-Length
表示实体主体部分的大小,单位字节
Content-Location
给出与报文主体部分相对应的URI。和首部字段Location不同,Content-Location 表示的是报文主体返回资源对应的URI
Content-MD5
该字段是由一串 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达
Content-Range
该字段针对范围请求,告诉客户端返回的实体哪个部分符合范围请求。
Content-Range: 当前发送部分/整个实体大小
Content-Range: bytes 5001-10000/10000
Content-Type
说明实体主体内对象的媒体类型,字段值用type/subtype
形式赋值
Content-Type: text/html; charset=UTF-8
Expires
该字段会将资源失效的日期告诉客户端,在指定日期之间,会一直使用该资源
Expires: Wed, 04 Jul 2017 08:11:11 GMT
Last-Modified
该字段会指明资源最终修改的时间
为Cookie服务的首部字段
Set-Cookie
用于开始管理客户端状态(配置Cookie)(响应首部字段)
常用字段:
-
NAME=VALUE
:赋予Cookie的名称和值 -
expires=DATE
: 设置Cookie的有效期(若未设置,那有效时间和session一样) -
path=PATH
:用于限制指定Cookie的发送范围的文件目录 -
domain=域名
:只有指定domain下才能使用Cookie -
Secure
:尽在HTTPS下通信才能使用Cookie -
HttpOnly
:禁止js脚本获得Cookie,防止跨站脚本攻击(XSS)
Set-Cookie: status=true; expires=Wed, 04 Jul 2017 08:11:11 GMT; path=/; domain= .baidu.com; Secure; HttpOnly;
Cookie
服务器接收到的Cookie信息(请求首部字段)