【计算机网络】应用层——详解HTTP协议

协议是一种“约定”。 约定的方式有两种,其中字符串之间可以通过socket进行传输,而结构化数据可以通过序列化和反序列化进行传输。这使得应用层的数据可以通过某种协议,完成资源的请求从而使用。接下来,我主要讲解HTTP协议的内容。

HTTP报文格式

在这里插入图片描述

  • 请求与响应时的首行内容
    请求行内容:请求方法+URL+版本号
    状态行内容:版本号+状态码+状态码解释
  • 首部字段
    HTTP首部字段是构成HTTP报文的要素之一。在用HTTP进行通信的过程中,无论请求还是响应,都要使用首部字段传输除数据之外其他重要的信息。
  • HTTP的分包和分用
    通过空行和content_Length进行有效载荷分离,无需考虑分用。

HTTP 常见的首部字段

1. 通用首部字段

通用就是指请求和响应的首部都会使用的字段。

Cache-Control:缓存控制

介绍此字段前,我们先要了解代理服务器。代理服务器 的基本行为就是接收客户端发送的请求后转发给其他服务器,代理在进行转发响应时,会将资源的副本保存在代理服务器上,当代理服务器再次接收到对相同资源的请求时,就可以不从源服务器那里获取,而是直接将之前的缓存资源作为响应返回。
我们通过首部字段Cache-Control填充指令就可以操纵缓存的工作机制,多个指令之间使用 “,” 分隔开。那么下面看一下都有哪些指令:

  • public:代理服务器执行此命令时,其他的用户也可以利用缓存
  • private:缓存服务器只会对特定的用户提供缓存的服务
  • 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将被忽略

Connection:持久化连接

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

Upgrade:是否使用升级版本

用于检测HTTP协议以及其他协议是否可以使用更高的版本进行通信,其参数数值可以用来指定一个完全不同的通信协议。如果服务器发现确实可以使用更高版本的协议进行通信,那么服务器返回一个状态码为101的响应。

Data:创建HTTP报文的日期和时间

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

Trailer:事先说明报文主体后记录了哪些首部字段

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

Transfer-Encoding:规定传输报文主体时应该采用的编码方式

Via:追踪客户端和服务器之间请求和响应报文的传输路径,当max-forward值减到0时,代理服务器就不能在转发该请求了,并将自己的信息添加到via字段然后返回该请求的响应。

Warning:从http1.0响应首部retry-after演变过来的,该字段一般存放的是缓存相关的警告。

2. 请求首部字段

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

Host:http1.1规范中唯一一个必须被包含在请求内的首部字段

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

Accept:此字段通知服务器,用户代理能够处理的媒体类型以及媒体类型的相对优先级

Accept-Charset:用户代理可以支持的字符集以及字符集的优先顺序。可以一次性指定多种字符集

Accept-Encoding:用户代理支持的内容编码以及编码的优先级顺序

Accept-Language:用户代理支持的自然语言集以及自然语言集的优先级顺序

Authorization:用户代理的认证信息

Except:期望出现某种特定的行为,如果服务器无法理解客户端希望做出的行为时将会返回417状态码

Form:用户代理的用户的电子邮件地址,使用代理时尽可能使用From首部字段

If-Match:实体标记Etag时与特定资源关联的确定值,此字段填充的值和Etag值匹配一致时服务器才接收请求

If-Modified-Since:如果此字段值小于资源的更新时间,则希望能处理该请求

If-None-Match:当填写的值与Etag不相同时可处理该请求,一般此字段是GET或者HEAD用来请求新的不重复的资源时会使用

If-Range:此字段的值如果和请求资源Etag的值相同就作为范围请求处理,否则直接返回资源的全部值

If-UnModified-Since:只有在资源未发生更新的情况下才处理请求,反之不处理。

Max-Forwards:在请求报文发送之前填充一个值,每经过一个代理服务器就减一,当值减为0时就不在进行转发,直接进行返回响应。

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

Range:告诉服务器请求资源的指定范围,如果服务器成功处理范围请求就会返回206响应,否则会返回状态码200 ok以及全部资源

Referer:告诉服务器请求的原始资源的URL,但是处于安全性的考虑也可以不发送此字段

User-Agent:将创建请求的浏览器和用户代码名称等传达给服务器,除此,代理服务的信息也可能会被添加到此字段中

3. 响应首部字段

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

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

Age:源服务器在多久之前创建了响应。代理创建响应时必须加上首部字段Age,字段的单位为秒

Etag:将资源以字符串形式做唯一标识,服务器会为每份资源分配对应的Etag值

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

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

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

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

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

4. 实体首部字段

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

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

Content-Language:告诉客户端服实体主体使用的自然语言

Content-Length:实体主体部分的大小

Content-Type:实体主体内对象的媒体类型

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

Last-Modified:资源最终被修改的时间

Expires:将资源失效的日期告诉客户端,缓存服务器在接收到含有首部字段Expires后会以缓存来应答请求,当超过指定的时间后会转向源服务器请求资源.

HTTP 的方法

在这里插入图片描述

重要方法详解
  • GET 方法:获取已被URL识别的资源

先来看一下URL的格式:
在这里插入图片描述

如果你的方法是GET,那么服务器就会解析出你请求报头中的URL的路径,拿这个路径与自己的资源目录比较,并且返回相应的文件。从上图我们就可以客户端想请求的就是dir目录下的index.htm文件。

  • POST 方法:用于传输实体的主体

上面的GET方法也可以进行传输实体,但是由于URL长度的限定,一般都是用POST方法来传递。反过来POST也可以请求资源,但是POST的主要目的并不是获取响应的主体内容。

  • PUT:传输文件到指定路径

PUT方法是HTTP1.1版本中才支持的方法,由于HTTP/1.1的PUT方法并不带验证的机制,任何人都可以上传文件,存在安全性的问题,因此一般的web网站不使用该方式。

  • DELETE:删除指定资源

这种方法比PUT方法更加没有安全性,你应该从来没有见过你能够主动删除某个网站上的资源吧!!

关于get,post,put三种获取资源方法的不同,戳链接看下篇博客的详解。
面试官常问:get,post,put,方法的区别

HTTP的状态码

HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。
在这里插入图片描述

部分状态码的详解
  • 以1开头的信息性状态码

100 continue:表示客户端应当继续发送请求。
这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且并未被拒绝。这个状态码经常出现在使用POST方法传输资源完成TCP的三次握手之后,客户端向服务器先进行确认,当服务器返回100 continue的响应报文客户端才接着发送数据。

  • 以2开头的成功状态码=

200 ok:表示从发送端发来的请求被服务端正常的处理并返回其请求资源。
204 no content:表示服务器接收的请求已经被成功处理,但不返回资源的主体部分。一般是在客户端向服务器发送信息,而服务器不需要发送新信息内容的情况下使用。

  • 以3开头的重定向状态码

301 moved permanently:表示请求的资源已经被分配到新的URL,以后请求资源都在新的URL中,也称永久性重定向
302 found:表示本次请求的资源被重新分配了URL,下次请求却不一定是这个URL,称临时重定向
303 see other:临时重定向,完全继承302的规则:若是POST方法则主动更改为GET方法,再进行重定向
307 temporary redirect:临时重定向,是对302的规范:如果请求不是GET或者HEAD方法就不允许重定向
这里的303 和 307 是HTTP对302 的两个严格划分形成的

  • 以4开头的客户端错误状态码

400 bad request:表示请求报文中存在语法错误。
401 unauthorized:表示发送的请求需要有通过HTTP认证。
403 forbidden:表示客户端对资源的访问请求被服务器拒绝了。从未授权的发送源ip地址试图访问就可能出现403。
404 not found:表示我们请求的资源在服务器上不存在,类似访问越界。
413 request entity too large:表示请求提交的URL实体数据大小超过了浏览器或服务器愿意或者能够处理的范围。

  • 以5开头的服务器错误状态码
    500 inernal server error:表示服务器端在执行请求时发生了错误,也可能是web应用出现了错误。
    503 service unavailable:表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

HTTP协议格式示例

http协议在日常生活中很容易见到,因为我们在使用浏览器时用到的都是http协议,双击浏览器输入栏就可以看到隐藏的http/https。我这里借鉴了其他人的一篇文章,讲的也很清晰,可供参考~
htpp请求格式和响应格式

我对于应用层HTTP的详解还很浅显,以后学习到新内容会继续补充,也欢迎大家留言讨论,共同进步~

猜你喜欢

转载自blog.csdn.net/ly_6699/article/details/100084132