[网络]——HTTP首部到底有哪些东西?

HTTP报文首部

HTTP首部字段是构成HTTP报文的要素之一。在客户端和服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,他能起到传递额外重要信息的作用。那么今天让我们来看看首部到底有哪些东西。

HTTP报文格式

在这里插入图片描述
就算不知道HTTP报文首部具体有哪些东西的同学也一定知道请求行和状态行的内容。请求行由方法+URI+版本组成,状态行由版本+状态码+状态码描述组成。当然我们本博客的重点肯定不在这里,上图中除去这俩部分还剩请求首部字段,响应首部字段,通用首部字段和实体首部字段。

以前老师上课讲解时将除去请求行和状态行的剩余部分统称为请求报头,我们今天将请求/响应报头再次细分,分别来介绍不同的字段都有哪些东西。

通用首部字段

通用首部是指,请求报文和响应报文都会使用的首部

Cache-Control

在介绍此字段之前我们先简单提一下代理服务器,代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器,代理在进行转发响应时,会将资源的副本保存在代理服务器上,当代理服务器再次接收到对相同资源的请求时,就可以不从源服务器那里获取,而是直接将之前的缓存资源作为响应返回。

而通过首部字段Cache-Control填充指令就可以操纵缓存的工作机制,多个指令之间使用 “,” 分隔开,那么现在来看看都有哪些指令。

  • public:服务器使用此命令时,其他的用户也可以利用缓存
  • private:与public指令刚好相反,缓存服务器只会对特定的用户提供缓存的服务,对于其他用户发送来的请求,代理服务器则不会返回缓存
  • no-cache:客户端使用此指令时表示不要代理服务器缓存的资源,这是防止代理返回已经过期的资源。服务器使用此指令则表示缓存服务器不能对资源进行缓存,且禁止对响应资源进行缓存操作
  • no-store:暗示请求或者响应中有机密信息,不能缓冲请求或者响应的任意部分,有读者会误解no-cache是不缓存,但其实他的本意是不缓存过期的资源,而no-store才是真正意义上的不缓存资源
  • max-age:使用时给max-age设置一个数值,如果客户端设置且未超过这个时间的缓存资源可以直接返回。如果服务器设置这个时间则表示缓存资源的最长生存时间。在http1.1版本中如果同时出现了expires字段,那么会优先处理max-age字段,而忽略掉expires字段。然而在http1.0中此情况恰恰相反
  • min-fresh:此字段只能客户端设置,表示缓存资源的时间没有超过设定值的可以直接返回
  • max-stale:表示即使资源过期但过期时间小于max-stale数值也照常接收,如果不设置数值,那么过期多久都照收
  • on-if-cached:客户端仅仅在缓存服务器缓存目标资源的情况下才会要求其返回
  • must-revalidate:代理回向源服务器再次验证即将返回的响应资源目前是否任然有效,如果指令中有max-stale将被忽略

关于Cache-Control字段的指令就介绍到这里,如果有小伙伴想了解更多可以去网上查找一下,不过掌握了这些足够了。

Connection

一看到这个字段大家就会想到关于长连接的问题,但是其实此字段还有其他作用。

  • 控制不再转发给其他代理的字段:如果你将此字段中填写upgrade,那么代理在转发时就会先将upgrade字段删除后再进行转发
  • 管理持久化连接:http1.1默认的连接都是持久化连接,如果服务器想明确断开连接时,则指定Connection首部字段值设置为Close。而http1.1版本之前的http建立连接默认都是非持久化连接,如果想在旧版本上维持长连接就把Connection字段设置为Keep-Alive

Date

首部字段Date表示创建HTTP报文的日期和时间

Pragma

历史遗留字段,为了向后兼容而存在。此字段设置no-cache和Cache-Control同时设置效果相同

Trailer

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

Transfer-Encoding

此字段规定了传输报文主体时应该采用的编码方式,http1.1中的传输编码方式仅对分块传输编码有效

Upgrade

此字段用于检测HTTP协议以及其他协议是否可以使用更高的版本进行通信,其参数数值可以用来指定一个完全不同的通信协议。如果服务器发现确实可以使用更高版本的协议进行通信,那么服务器返回一个状态码为101的响应。
101状态码:服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议

不过这里需要强调的是,Upgrade只适用于临接服务器之间,所以使用时一定要带上Connection字段并将Upgrade填充进去

Via

此字段用来追踪客户端和服务器之间请求和响应报文的传输路径。每当报文经过一个代理服务器、网关或者隧道时,他们就会把自己的信息也添加到via字段中

通常此字段与TREACE方法一起使用,max-forward值减到0时,代理服务器就不能在转发该请求了,此时代理服务器将自己的信息添加到via字段然后返回该请求的响应。

Warning

Warning是从http1.0响应首部retry-after演变过来的,该字段一般存放的是缓存相关的警告,笔者这里就不详细介绍了,作为了解就好。

请求首部字段

请求首部字段是从客户端向服务器发送请求报文中使用的字段,用于添加补充请求的符加信息、客户端信息等内容

Accept

此字段通知服务器,用户代理能够处理的媒体类型以及媒体类型的相对优先级。一般使用type/subtype的格式,你肯定见过text/html这样的写法,当然了还有很多类型百度一下就会有特别全的表。

关于能够处理的类型还有优先级,优先级从0到1,假设你要给一种类型加上优先级格式为:type/subtype;q=x (x == 0 ~ 1)。

Accept-Charset

此字段通知服务器用户代理可以支持的字符集以及字符集的优先顺序。可以一次性指定多种字符集。设置方式与上文中媒体类型优先级设置方式相同。

Accept-Encoding

此字段用来告知服务器用户代理支持的内容编码以及编码的优先级顺序。

Accept-Language

此字段用来告知服务器用户代理支持的自然语言集以及自然语言集的优先级顺序。可以一次指定多种自然语言

Authorization

这个单词读作奥 Ze ruai zei 肾,此字段填写的是用户代理的认证信息。想通过服务器认证的用户代理会在接收到返回401的状态码响应后,会把此字段放入请求中。

Except

客户端使用首部字段Except来告知服务器,期望出现某种特定的行为,如果服务器无法理解客户端希望做出的行为时将会返回417状态码。然而http1.1中只定义了关于100 continue的拓展,如果你希望发生100 continue事件。那么在此字段写上100-continue即可。

Form

此字段一般填充的是用户代理的用户的电子邮件地址,使用代理时尽可能使用From首部字段。

Host

此字段非常重要,是http1.1规范中唯一一个必须被包含在请求内的首部字段。此字段告诉服务器,请求的的资源所处的互联网主机名字和端口号。

首部字段Host和单台服务器分配多个域名的虚拟主机的工作机制具有很密切的关联,这是Host必须存在的意义。请求被发送至服务器时,请求中的主机命会被ip地址直接替换解决。但是如果此时相同的ip地址下部署着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此使用此字段Host来明确请求的主机名。若服务器未设定主机名,那么直接发送一个空值即可。

if

这里并没有一个字段是名叫的if的,而是我们请求头部很多字段都是以if开头的,带有if开头的字段的请求叫做条件请求,只有判定条件为真时,才会执行请求。

  • If-Match:实体标记Etag时与特定资源关联的确定值,此字段填充的值和Etag值匹配一致时服务器才接收请求。
  • If-Modified-Since:他告诉服务器如果此字段值小于资源的更新时间,则希望能处理该请求。如果此字段值大于资源的更新时间则返回304状态码响应,此字段用来判端代理或者客户端拥有本地资源的有效性。
  • If-None-Match:和上面的If-Match刚好相反,当此字段填写的值与Etag不相同时,可处理该请求,一般此字段是GET或者HEAD用来请求新的不重复的资源时会使用。和If-Modified-Since的功能相似
  • If-Range:此字段的值如果和请求资源Etag的值相同就作为范围请求处理,否则直接返回资源的全部值
  • If-UnModified-Since:与If-Modified-Since作用相反,告诉服务器只有在资源未发生更新的情况下才处理请求,反之不处理。

Max-Forwards

前面我们已经提到过这个字段了,这个字段在请求报文发送之前填充一个值,每经过一个代理服务器就减一,当值减为0时就不在进行转发,直接进行返回响应。

那么为什么需要这个字段呢?使用HTTP协议进行通信时,请求可能经过代理等多太服务器。途中如果由于某种原因导致转发失败,客户端也就等不到服务器的响应了,对此我们也就无从得知了。并且在有的情况下报文会在俩个服务器之间陷入死循环转发,这样Max-Forwards减到0时返回响应就不会无限循环了。

Range

此字段告诉请求服务器资源的指定范围,如果服务器成功处理范围请求就会返回206响应。无法处理该范围请求时,则会返回状态码200 ok以及全部资源。

Referer

此字段告诉服务器请求的原始资源的URL,但是处于安全性的考虑也可以不发送此字段。因为大家都知道URL中可能包含ID和密码等私密信息,如果写入此字段发送给其他服务器就可能造成安全性的问题。

一个小插曲,Referer正确的拼写应该是Referrer,但是不知道为什么http协议中一直使用错误的前者。

User-Agent

User-Agent会将创建请求的浏览器和用户代码名称等传达给服务器,由网络爬虫发起请求时,有可能会在字段中添加爬虫作者的电子邮件地址。除此,代理服务的信息也可能会被添加到此字段中。

关于此字段的历史混乱大战的故事有兴趣的老铁可以戳链接看看哦,User-Agent的历史故事。

响应首部字段

响应首部字段是由服务器向客户端返回响应报文所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

Accept-Ranges

此字段是服务器告诉客户端是否能处理范围,以指定获取服务器端某个部分的资源。可指定的值有俩种,可处理范围请求时指定为bytes,反之则指定其为none。

Age

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

Etag

Etag字段能告诉客户端实体标识。它可以将资源以字符串形式做唯一标识。服务器会为每份资源分配对应的Etag值。另外,当资源更新是,Etag值也需要更新。生成Etag值时,并没有统一的算法规则,而是由服务器分配。

资源被缓存时,会被分配唯一性标识。以中文浏览器访问时返回中文资源,以英文浏览器访问时返回英文资源。但是我们访问的是同一个URL,使用同一个URL标识俩份资源是非常困难的,所以要使用Etag来标识这两份资源。

Etag又被分为强Etag和弱Etag值之分。强Etag值,不论实体发生多么细微的变化都会改变其值。弱Etag值只用于提示资源是否相同。只有资源发生了根本的变化,产生的差异才会改变Etag。这是会在字段值最开始处附加W/。

Location

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

Retry-After

此字段告诉客户端应该多久之后再次发送请求。主要配合状态码503,或者3xx响应一起使用。

Server

首部字段Server告知客户端服务器上安装的HTTP服务器应用程序的信息,还有可能包含版本号和安装启用的可选项。

实体首部字段

此字段是实体部分所使用的首部,用于补充内容的跟新时间和实体相关的信息。

Content-Encoding

此字段告诉客户端服务器对实体的主体部分进行的编码方式。内容编码是指在不丢失实体信息的情况下所进行的压缩。

Content-Language

此字段告诉客户端服实体主体使用的自然语言

Content-Length

表明实体主体部分的大小

Content-Type

表明实体主体内对象的媒体类型,和上面请求首部字段的Accept填充的格式完全相同

Content-Location

表示实际被返回的URL是多少,因为有时候存在你访问的对象和返回的对象不同的情况,所以有必要设置此字段

Last-Modified

此字段指明资源最终被修改的时间。

Expires

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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值