图解HTTP——HTTP首部(学习记录8)

HTTP报文首部:


HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。对于客户端用户来说,这些信息中的大部分内容都无须亲自查看。

HTTP请求报文:


HTTP响应报文:


HTTP首部字段结构是由首部字段名和字段值构成的,中间用冒号“:”分隔(字段值对应单个HTTP首部字段可以有多个值)

   首部字段名:字段值

4种HTTP首部字段类型(根据实际用途划分):

   1、通用首部字段:请求报文和响应报文两方都会使用的首部

扫描二维码关注公众号,回复: 1744530 查看本文章


Cache-Control通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。指令的参数是可选的,多个指令之间用“,”分隔,首部字段Cache-Control的指令可用于请求及响应时。



no-cache指令目的是为了防止从缓存中返回过期的资源。(客户端发送的请求包含no-cache,客户端不会接收缓存过的响应,于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。服务器端返回的响应包含no-cache,缓存服务器不能对资源进行缓存,源服务器以后也不会对缓存服务器请求中提出的资源有效性进行确认,且禁止其对相应资源进行缓存操作)

no-store指令,规定缓存不能在本地存储请求或相应的任一部分。

指定缓存期限和认证的指令:

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

max-age指令,当客户端发送的请求中包含max-age指令时,如果判定缓存时间数值比指定的时间的数值更小,那么客户端就接收缓存的资源。当服务器返回的响应中包含max-age指令时,缓存服务器将不对资源的有效性再作确认,而max-age数值代表资源保持为缓存的最长时间。

min-fresh指令,要求缓存服务器返回至少还未过指定时间的缓存资源。

max-stale指令,指示缓存资源,即使过期也照常接收。(如果未指定参数值,无论经过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于max-stale指定的时间内,仍然会被客户端接收)

only-if-cached指令,表示客户端仅在寒蝉服务器本地缓存目标资源的情况下才会要求其返回。

must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存目标是否仍然有效。

proxy-revalidate指令,要求所有的缓存服务器在接收到客户端带有该指令返回响应之前,必须再次验证缓存的有效性。

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

cache-extension token,可以扩展Cache-Control首部字段内的指令。(extension tokens仅对能理解它的缓存服务器来说是有意义的)


Connection首部字段具备如下两个作用: 

                               1、控制不再转发给代理的首部字段(即Hop-by-hop首部)

                                    Connection:不再转发的首部字段名

                               2、管理持久连接(HTTP/1.1版本默认连接都是持久连接,为此,客户端会在持久连接上连续发送请求,当服务器想明确断开连接时,则指定Connection首部字段的值为close。)

                                     Connection:close                            


Date:表明创建HTTP报文的日期和时间(使用RFC1123中规定的日期时间的格式,如Date:Tue,03 Jul 2012 04:40:59 GMT)


Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义

     Pragma:no-cache

该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。


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


Transfer-Encoding规定了传输报文主体时采用的编码方式。(HTTP/1.1的传输编码方式仅对分块传输编码有效)


Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。(Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此,使用首部字段Upgrade时,还必须额外指定Connection:Upgrade)


Via:为了追踪客户端与服务器之间的请求和响应报文的传输路径。(还可避免请求回环的发送)

报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。Via首部是为了追踪传输路径,所以经常会和TRACE方法(回显服务器收到的请求,主要用于测试或诊断)一起使用。


Warning:通常会告知用户一些与缓存相关的问题的警告

Warning首部的格式如下,最后的日期时间部分可省略:

         Warning:[警告码][警告的主机:端口号]"[警告内容]"([日期时间])

   2、请求首部字段:从客户端向服务器发送请求报文时所使用的首部,补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。


Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。(若是想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,使用分号分隔。权重值q的范围是0-1,默认为q=1.0)

Accept-Charset可用来通知服务器代理支持的字符集以及字符集的相对优先顺序,使用q来表示权重。(应用于内容协商机制的服务器驱动协商)

Accept-Encoding用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序,使用q来表示权重(可使用*作为通配符)。

Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级,使用q来表示权重。

Authorization是用来告知服务器用户代理的认证信息(认证值)。

Host告知服务器,请求的资源所处的互联网主机名和端口号,是唯一一个必须包含着请求内的首部字段(虚拟主机运行中同一个IP上,因此使用首部字段Host加以区分)

形如If-XXX这种形式的请求首部字段,都可以称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

If-Match的字段值跟ETag值匹配一致时,服务器才会接受请求,否则返回412状态码

If-None-Match的字段值与ETag值不一致时,可以处理该请求,与If-Match首部字段的作用相反

If-Range字段值若是跟ETag值或更新的日期时间匹配一致,那么就作为范围请求处理,若不一致,则忽略范围请求,返回全部资源。如果不使用If-Range,则需要进行两次处理。

Max-Forwards以十进制整数的形式指定可经过的服务器最大数目,每次转发数值减1,当数值变0时返回响应。

Range对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码为206 Partial Content的响应。无法处理该范围请求时,则会返回状态码200 OK的响应及全部资源。

Referer会告知服务器请求的原始资源的URI,只要查看Referer就能知道请求的URI是从哪个Web页面发起的。

TE会告知服务器客户端能够处理响应的传输编码方式及相对优先级,还可以指定伴随trailer字段的分块传输编码的方式(只需要把trailers赋值给该字段值)。

User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。

   3、响应首部字段:从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。



Accept-Ranges是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源(可处理范围请求时指定其为bytes,反之则指定为none)。

Age告知客户端,源服务器在多久前创建了响应,单位为秒。若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段Age。

ETag告知客户端实体标志。它 一种可将资源以字符串形式做唯一性标识的方式,服务器会为每份资源分配对应的ETag值(当资源更新时,ETag值也需要更新)

Location可以将响应接收方引导至某个与请求URI位置不同的资源,几乎所有的浏览器中接收到包含首部字段Location的响应后,都会强制性的尝试对已提示的重定向资源的访问。

Retry-After告知客户端应该在多久之后再次发送请求,主要配合状态码503 Service Unavailable响应,或3XX Redirect响应一起使用。(字段值可以指定为具体的日期时间,也可以是创建响应后的秒数)

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

Vary可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。(从代理服务器接收到源服务器返回包含Vary指定项的响应之后,若再要进行缓存,仅对请求中含有相同Vary指定首部字段的请求返回缓存。即使对相同的资源发起请求,但由于Vary指定的首部字段不相同,因此必须要从源服务器重新获取资源)

   4、实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。


Content-Encoding会告知客户端服务器对实体的主体部分选用的内容编码方式(内容编码是指在不丢失实体信息的前提下所进行的压缩。对实体主体进行内容编码传输时,不能再使用Content-Length首部字段)。

Content-Location给出与报文主体部分相对应的URI。和首部资源Location不同,Content-Location表示的是报文主体返回资源对应的URI。

Content-MD5是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。(客户端会对接收的报文主体执行相同的MD5算法,然后与首部字段Content-MD5的字段值比较)

Expires会将资源失效的日期告知客户端。缓存服务器在接收到Expires的响应后,会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器会在请求发送过来时,会转向源服务器请求资源。



End-to-end首部和Hop-by-hop首部:HTTP首部字段将定义成缓存代理和非缓存代理的行为,分为两种类型

1、端到端首部(End-to-end Header)

      首部会转发给请求/响应对于的最终接受目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

2、逐跳首部(Hop-by-hop Header)

      首部只对单词转发有效,会因通过缓存或代理而不再转发。如果需要使用Hop-to-hop首部,需提供Connection首部字段



为Cookie服务的首部字段

Cookie的工作机制是用户识别及状态管理,Web网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内。


Set-Cookie

       1、expires属性指定浏览器可发送Cookie的有效期。(若省略则有效期仅局限于维持浏览器会话(Session)时间段内,这通常局限于浏览器应用程序被关闭之前。)

       2、path属性可用于限制指定的Cookie的发送范围的文件目录(将服务器上的文件目录作为Cookie的适用对象,若不指定则默认为文档所在的文件目录)

       3、domain属性指定的域名可做到与结尾匹配一致。(若不指定则默认为创建Cookie的服务器的域名)

       4、secure属性用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie(当省略secure时,不论HTTP还是HTTPS,都会对Cookie进行回收)

       5、HttpOnly是Cookie的扩展功能,它使JavaScript脚本无法获得Cookie,其主要目的是为防止跨站脚本攻击对Cookie的信息窃取

Cookie会告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie,接收到多个Cookie时,同样可以以多个Cookie形式发送。




猜你喜欢

转载自blog.csdn.net/zmeilin/article/details/80779262