1. 报文首部
首部:在客户端和服务器处理时起重要作用的信息几乎都在这边
主体:所需要的用户和资源的信息都在这边
1.1 HTTP请求报文
- 请求行:方法、URI、HTTP版本
- 请求头:首部字段(请求首部字段、通用首部字段、实体首部字段)
- 请求体:发送的数据
1.2 HTTP响应报文
- 响应行:HTTP版本号、状态码
- 响应头:响应首部字段、通用首部字段、实体首部字段
- 响应头:响应的数据
2. 首部字段
HTTP 首部字段是构成 HTTP 报文的要素之一。它是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
2.1 首部字段的结构 首部字段由首部字段名和字段值构成的,中间用冒号分开。例如:
Content-Type: text/html
另外,字段值对应的单个HTTP首部字段可以有多个值。例如:
Keep-Alive: timeout=15,max=100
2.2 四种HTTP首部字段类型
HTTP首部根据实际用途被分为四个类型:
- 通用首部字段:请求报文和响应报文两方都会使用的首部。
- 请求首部字段:从客户端发送请求报文时的首部,主要是补充了请求的附加内容,客户端信息等。
- 响应首部字段:从服务器向客户端返回响应报文时使用的首部,主要是补充响应的附加内容。
- 实体首部字段:针对请求报文和响应报文的实体使用的首部。
2.3 End-to-end 首部和 Hop-by-hop 首部
HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。
3. HTTP/1.1 通用首部字段
3.1 Cache-Control
首部字段 Cache-Control 能够控制缓存的行为,可用于请求及响应时。
-
public:表明其他用户也可利用缓存 -
private:响应只以特定的用户作为对象,对于其他用户发送过来的请求,代理服务器则不会返回缓存。 -
no-cache 指令 目的是为了防止从缓存中返回过期的资源。 客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。 如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。 由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。 -
no-store 指令 暗示请求(和对应的响应)或响应中包含 机密信息,规定缓存不能在本地存储请求或响应的任一部分。
事实上 no-cache 代表不缓存过期的资源,no-store 才是真正地不进行缓存。
-
s-maxage 指令 s-maxage 指令的功能和 max-age 指令的相同,它们的不同点是 s-maxage 指令只适用于供多位用户使用的公共缓存服务器 。 也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。 另外,当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及max-age 指令的处理。 -
max-age 指令
Cache-Control: max-age=604800(单位:秒)
当客户端发送的请求中包含 max-age 指令时,如果在规定时间内,那么客户端就接收缓存的资源。另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发给源服务器。 当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。 -
min-fresh 指令 要求缓存服务器返回至少还未过指定时间的缓存资源。比如,当指定 min-fresh 为 60 秒后,过了 60 秒的资源都无法作为响应返回了。 -
max-stale 指令 使用 max-stale 可指示缓存资源,即使过期也照常接收。 如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale指定的时间内,仍旧会被客户端接收。 -
only-if-cached 指令 表示客户端仅在缓存服务器本地缓存目标资 源的情况下才会要求其返回。 -
…
3.2 Connection
Connection 首部字段具备如下两个作用: 1. 控制不再转发给代理的首部字段 2. 管理持久连接
- Connection: 不再转发的首部字段名
在客户端发送请求和服务器返回响应内,使用 Connection 首部字段,可控制不再转发给代理的首部字段(即 Hop-by-hop 首部)
- 管理持久连接
Connection: close
HTTP/1.1 版本的默认连接都是持久连接。当服务器端想明确断开连接时,则指定Connection 首部字段的值为 Close。
Connection: Keep-Alive
HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定Connection 首部字段的值为 Keep-Alive。
3.3 Date
首部字段 Date 表明创建 HTTP 报文的日期和时间。 HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式,如下
Date: Tue, 03 Jul 2012 04:40:59 GMT
3.4 Pragma
Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0的向后兼容而定义。
Pragma: no-cache
该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。
3.5 Trailer
首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。 通用首部字段就说到这,下面说说请求首部字段。
4. 请求首部字段
4.1 Accept
Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒体类型。按权重值 q 来表示相对优先级。
- Accept-Charset:服务器用户代理支持的字符集
- Accept-Encoding:服务器用户代理支持的内容编码
- Accept-Language:服务器用户代理能够处理的自然语言集
4.2 Authorization
首部字段 Authorization 是用来告知服务器,用户代理的认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接收到返回的401 状态码响应后,把首部字段 Authorization 加入请求中。
4.3 Expect
Expect: 100-continue
客户端使用首部字段 Expect 来告知服务器,期望出现的某种特定行为。 客户端可以利用该首部字段,写明所期望的扩展。虽然 HTTP/1.1 规范只定义了 100-continue(状态码 100 Continue 之意)。
4.4 From
首部字段 From 用来告知服务器使用用户代理的用户的电子邮件地址。
4.5 Host
首部字段 Host 会告知服务器,请求的资源所处的互联网主机名和端口号。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。
4.6 Referer
首部字段 Referer 会告知服务器请求的原始资源的 URI。 客户端一般都会发送 Referer 首部字段给服务器。但当直接在浏览器的地址栏输入 URI,或出于安全性的考虑时,也可以不发送该首部字段。
5. 响应首部字段
5.1 Accept-Ranges
首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。 可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则指定其为 none。
5.2 Age
首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。 若创建该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次发起认证到认证完成的时间值。
5.3 ETag
首部字段 ETag 能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag值。 另外,当资源更新时,ETag 值也需要更新。生成 ETag 值时,并没有统一的算法规则,而仅仅是由服务器来分配。
强 ETag 值:不论实体发生多么细微的变化都会改变其值。 弱 ETag 值:只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETag 值。这时,会在字段值最开始处附加 W/。
5.4 Location
使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。 基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的URI。
5.5 Proxy-Authenticate
首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。
5.6 Retry-After
首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。 主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用。
5.7 Server
首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。 不单单会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。
5.8 Vary
首部字段 Vary 可对缓存进行控制。
5.9 WWW-Authenticate
首部字段 WWW-Authenticate 用于 HTTP 访问认证。 它会告知客户端适用于访问请求 URI 所指定资源的认证方案和带参数提示的质询。
6. 实体首部字段
6.1 Allow
Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。 当服务器接收到不支持的 HTTP 方法时,会以状态码 405 作为响应返回。
6.2 Content-Encoding
Content-Encoding: gzip
Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。 大致有以下四种:
- gzip
- compress
- deflate
- identity
6.3 Content-Language
Content-Language: zh-CN
Content-Language 会告知客户端,实体主体使用的自然语言
6.4 Content-Length
Content-Length: 15000
Content-Length 表明了实体主体部分的大小(单位是字节) 对实体主体进行内容编码传输时,不能再使用 Content-Length首部字段。
6.5 Content-Location
Content-Location 给出与报文主体部分相对应的 URI。 和首部字段 Location 不同,Content-Location 表示的是报文主体返回资源对应的 URI。
6.6 Content-MD5
Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
Content-MD5 是一串由 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。 由于 HTTP 首部无法记录二进制值,所以要通过 Base64 编码处理。为确保报文的有效性,作为接收方的客户端会对报文主体再执行一次相同的 MD5 算法。计算出的值与字段值作比较后,即可判断出报文主体的准确性。
6.7 Content-Range
Content-Range: bytes 5001-10000/10000
针对范围请求,返回响应时 Content-Range能告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。
6.8 Content-Type
Content-Type 说明了实体主体内对象的媒体类型。和首部字段 Accept 一样,字段值用 type/subtype 形式赋值。
6.9 Expires
Expires: Wed, 04 Jul 2012 08:26:05 GMT
Expires 会将资源失效的日期告知客户端。 缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。 但是,当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。
6.10 Last-Modified
Last-Modified 指明资源最终修改的时间。一般来说,这个值就是 Request-URI 指定资源被修改的时间。 但类似使用 CGI 脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。
7. 为 Cookie 服务的首部字段
7.1 Set-Cookie
开始状态管理史所使用的的Cookie信息,他的属性如下:
- espires:指定浏览器可发送 Cookie 的有效期
- path:用于限制指定 Cookie 的发送范围的文件目录。
- domain:指定的域名可做到与结尾匹配一致。
- secure:用于限制 Web 页面仅在 HTTPS 安全连接时,才可以发送 Cookie
- HttpOnly: Cookie 的扩展功能,它使 JavaScript 脚本无法获得 Cookie。
7.2 Cookie
服务器接收到的Cookie信息,是请求首部字段。Set-Cookie是响应首部字段。
|