图解http(03)-http首部

1,344 阅读8分钟
原文链接: blog.csdn.net

简介

我们知道http请求报文首部由请求行(方法、URI、http版本)及首部字段组成,响应报文首部由响应行(http版本、状态码、状态原因)及首部字段组成。 使用首部字段的目的是为了给浏览器和服务器提供报文主体的大小、所使用语言、认证信息等内容。

首部字段分为:通用首部字段,请求首部字段,响应首部字段、实体首部字段。


1. 通用首部字段

通用首部字段,请求报文和响应报文都使用的字段;

这里写图片描述


1.1 通用首部字段:Cache-Control

和缓存相关的指令,可以多个参数用’,’分隔: Cache-Control:private, max-age=0, no-cache

1.1.1 public

响应指令:Cache-Control:public。

服务器返回给某个客户端的缓存,也可被其它任意客户端利用,这个缓存是公共的。

1.1.2 private

响应指令:Cache-Control:private。

服务器返回给某个客户端的缓存,即使其它客户端需要这样的数据,这个缓存也不会给其它客户端用,这个缓存是私有的。

1.1.3 no-cache

请求和响应指令:Cache-Control:no-cache。

客户端请求:不管缓存是何种情况,我必须从源服务器中获取最新的资源,这样是为了防止拿到过期的资源。

服务端响应:此响应缓存服务器可以把它保存下来,但是每次缓存服务器要将此响应返回给客户端之前都必须找源服务器确认一下数据。

1.1.4 no-store

请求和响应指令:Cache-Control:no-store。

对于客户端和服务端而言,该指定规定缓存不能在任何位置存储任何东西,我们可以将其看做是不缓存。

1.1.5 max-age

请求和响应指令:Cache-Control:max-age=60。

客户端请求:在第一次请求后的60秒内,再请求可以直接将缓存给我。等于0时,缓存服务器需要将请求转发给源服务器。

max-age=0和no-cache的区别:no-cache强制直接向源服务器请求不经过缓存服务器,而max-age=0需要经过缓存服务器。

服务端响应:在第一次返回缓存之后的60秒内如果缓存服务器需要返回此缓存时,不需要向源服务器进行确认就可以直接发送。

1.1.6 min-fresh

请求指令:Cache-Control:min-fresh=60。

在这60秒以内过期的资源无法作为响应进行返回。

1.1.7 max-stale

请求指令:Cache-Control:max-stale=60。

客户端在这60秒内请求的缓存即使过期了也可照常接收。

1.1.8 only-if-cached

请求指令:Cache-Control:only-if-cached。

客户端请求缓存,有缓存则返回,无缓存返回504状态码。

1.1.9 must-revalidate

响应指令:Cache-Control:must-revalidate。

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


1.2. 通用首部字段:Connection

它主要有两个作用:一控制代理不再转发首部字段,二持久连接管理。

1.2.1 控制代理不再转发首部字段

这里写图片描述

1.2.2 持久连接管理

我们知道在http1.1版本中所有连接默认是持久连接,如果我们向手动地断开连接可以这样:Connection: close。 为了兼容其它版本的http,我们这样设置:Connection: Keep-Alive。


1.3 通用首部字段:Date

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

Date: Tue, 03 Jul 2017 10:40:00 GMT
Date: Tue, 03-Jul-17 10:41:03 GMT
Date: Tue Jul 03 10:41:25 2017


1.4 通用首部字段:Pragma

Pragma是为了兼容Http版本而存在,比如Cache-Control:no-cache是针对http1.1版本而设置的,如果中间服务器不全是http1.1版本,我们要达到同样的目的应该设置:

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


1.5 其它字段:Transfer-Encoding、Via、Warning

因为这些通用首部字段作用比较容易理解,所以就大致阐述下。

Transfer-Encoding:规定传输报文主体时用的编码格式,chunked表示分块传输。
Via:为了追踪传输路径,报文经过代理或者网关时,会在Via中添加该服务器的信息。
Warning:该首部会告知一些和缓存相关的警告。


2. 请求首部字段

请求首部字段,从客户端向服务器发送请求报文时使用的首部;

这里写图片描述

2.1 Accept

Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的优先级,type/subtype。

文本类型:text/html、text/plain…
图片类型:image/jpeg、image/gif、image/png…
视频文件:video/mpeg、video/quicktime
二进制文件:application/octet-stream、application/zip…

2.2 Accept-Charset

通知服务器用户代理支持的字符集及字符集的相对优先级顺序。 Accept-Charset: iso-8859-5, unicode-1-1

2.3 Accept-Encoding

通知服务器用户代理支持的内容编码及内容编码的优先级。

2.4 Accept-Language

通知服务器用户代理能够处理的语言及相对优先级。

2.5 Authorization

客户端和源服务器之间的认证信息。 Authorization: Basic dWVub3N1bjpwYXNzd29yZA==

2.6 Proxy-Authorization

客户端和代理服务器之间的认证信息。

2.7 From

客户端告诉服务器如果有事请联系这个邮箱地址。 From: 553453829@qq.com

2.8 Host

我们通过域名转换成ip地址来连接服务器,通过ip地址我们可以找到服务器地址,如果一台服务器上运行了几台虚拟主机,那么这些虚拟主机的ip地址都是相同的,所以此时仅仅靠ip无法确定是哪台虚拟主机,这个时候我们需要告知服务器Host,Host会告知服务器,请求的资源所处的互联网主机名和端口号。 Host: www.hackr.jp

2.9 If-Match

在服务器端会有一个特定的标记实体标记ETag,里面会存放和资源相关的值,当客户端请求的If-Match值和服务器ETag的值完全匹配时,服务器才会执行请求,反之返回状态码412。

2.10 If-None-Match

只有在If-None-Match的字段值和ETag值不一致时,才处理该请求,一致返回状态码412。它的作用和If-Match是相反的。

2.11 If-Modified-Since

如果资源在指定日期之后更新过则服务器执行客户端请求,如果在这之后资源没有更新过返回状态码304。

2.12 If-Unmodified-Since

它和If-Modified-Since的作用是相反的。如果资源在指定日期之后没有更新过则服务器执行请求,否则返回状态码412。

2.13 If-Range

如果该字段值和ETag中的值相匹配则返回指定返回内的值,如果不匹配则返回全部资源。

这里写图片描述

2.14 Range

只获取部分资源,Range: bytes=5001-10000,能处理该范围请求时返回206,不能处理该范围请求时返回200。

2.15 Referer

告诉服务器请求是从哪里发出的。
Referer: www.hackr.jp/index.html

2.16 User-Agent

用于传达浏览器的种类。


3. 响应首部字段

响应首部字段,从服务器向客户端返回响应报文时使用的首部;

这里写图片描述

3.1 Accept-Range

告知客户端服务器是否能处理资源范围请求,若能返回资源范围,若不能返回none。
Accept-Range: bytes=5001-10000
Accept-Range: none

3.2 Age

告诉客户端服务器在多久前创建了响应。

3.3 ETag

对服务器端资源的唯一标记方式,服务器会为每份资源分配对应的ETag值。当资源更新时ETag值也会改变。

3.4 Location

用来告诉客户端访问的资源已经被转移到了该值的下面,会返回3XX重定向的状态码。

3.5 Retry-After

告诉客户端在N时间后再发送请求,配合返回503或3XX状态码。

3.6 Server

告诉客户端当前服务器上安装的HTTP服务器应用程序的信息。

3.7 Proxy-Authenticate

代理服务器所要求的认证信息发送给客户端。

3.8 WWW-Authenticate

源服务器所要求的认证信息发送给客户端。


4. 实体首部字段

实体首部字段,针对请求报文和响应报文的实体部分使用的首部。

这里写图片描述

4.1 Allow

客户端通过OPTIONS方法来询问服务器支持哪些方法,服务器通过Allow返回是否支持该方法。如果支持该方法直接返回该方法,如果不支持,则返回状态吗405且将支持的所有方法返回。

4.2 Content-Encoding

会告知客户端服务器对实体的主体部分选用的内容编码方式。

4.3 Content-Language

会告知客户端实体主体使用的语言。

4.4 Content-Length

会告知客户端实体主体的大小。

4.5 Content-Range

告知返回的实体的哪个部分符合范围要求。

4.6 Content-Type

说明了实体主体的类型,类型和请求首部字段Accept一致。

4.7 Last-Modified

资源最终修改时间。