深刻浅出HTTP

咱们知道目前不少应用系统中的内容传输协议采用的HTTP协议,所以无论你是前端人员、后端人员、运维人员,甚至是管理人员,都须要掌握HTTP知识!!

HTTP发展历史

  • HTTP/0.9  

该版本只有一个命令GET;没有HEADER等描述数据的信息; 服务器发送完毕,就关闭TCP链接。前端

  • HTTP/1.0  

该版本增长了不少命令;增长status code 和header;多字符集支持、多部分发送、权限、缓存等。web

HTTP/1.1   算法

该版本增长了持久链接Pipeline,增长host和其余一些命令。持久链接会在HTTP特性中介绍;若是没有pipeline,那么Web服务器就须要串行处理请求,而有了pipeline,Web服务器就并行处理请求;而增长host实现了一台物理设备能够运行多个web服务。后端

  • HTTP/2.0   

全部数据以二进制传输,以前版本使用字符串进行传输;同一个链接 里面发送多个请求再也不须要按照顺序来;头信息压缩以及推送等提升效率的功能。跨域

HTTP三次握手

image.png

为何要三次握手?由于网络是有可能延迟的,当客户端没有收到服务端的确认包,若是没有第三次握手,那么服务端不知道上次传输是否是被客户端正常接收了,若是没有接收,服务端的这个端口也是打开的,这就比较浪费资源。浏览器

HTTP报文

image

HTTP报文分为请求报文响应报文,请求报文和响应报文分为起始行、首部(header)和主体(body),请求报文的首部包括三部分,分别是HTTP方法、资源目录和协议,而响应报文的首部包括协议版本、状态码和状态吗对应的意思,好比200状态的意思是ok。须要注意的是:HTTP header和HTTP body之间以一行分隔。缓存

  • HTTP方法  

HTTP方法定义对资源的操做,经常使用的有GET、POST等,这就就不详细展开了。服务器

  • HTTP Code  

HTTP Code用于定义服务器对请求的处理结果,各个区间的code有不用的语义。1xx  表示信息响应类,表示接收到请求而且继续处理;2xx 表示成功;3xx 表示重定向;4xx 表示客户端出错;5xx 表示服务器出错。cookie

HTTP特性

  • 跨域请求   

同源策略,也就是说当两个请求的URL的协议、host和端口都相同的状况下,咱们才认为这两个请求是同域的即同源,而只要协议、host和端口只要有一项是不一样的,咱们就认为是不一样源的,即跨域,例如:网络

http://www.mukedada.com:80

http://www.mukedada.com:8080

上述两个请求就是跨域请求。须要注意的是跨域请求不是说浏览器限制了发起跨站请求,浏览器只是将返回结果拦截下来,最好的例子就是CSRF跨站脚本攻击。若是咱们想让浏览器放行返回结果,则经过如下方法:

  1. 服务端设置Access-Control-Allow-Origin参数为容许,例如'Access-Control-Allow-Origin' : '*'
  2. <link>、<img>和<script>三标签中的请求是容许跨域的,这也是JSONP的跨域作法。
  • Cache  Control 

对于静态资源,好比说image、js等,它们是不会常常方式变动的,并且它们的容量比较大,若是咱们每次访问都要从服务器从获取相应数据,那么性能就会变得比较差,所以HTTP协议定义一些和缓存相关的参数。

可缓存性,表示在哪些地方能够缓存,好比说客户端浏览器、代理服务器等,它有三个经常使用的参数:public、private、no-cache。public 代表响应能够被任何对象缓存,包括发送请求的客户端浏览器、代理服务器等等;private 表示响应只能被单个用户缓存,不能做为共享缓存,即代理服务器不能缓存它;no-cache代表强制全部缓存了该响应的缓存用户,在使用已存储的缓存以前,发送带验证器的请求到源始服务器。

到期,max-age=<seconds>,设置缓存存储的最大周期,超过这个时间缓存就被认为过时。s-maxage=<seconds> 它的做用域仅在共享缓存(好比各个代理)。max-stale=<seconds> 代表客户端愿意接收一个已过时的资源。

验证,must-revalidate,缓存必须在使用以前验证旧资源的状态,而且不可以使用过时资源。proxy-revalidate,与must-revalidate做用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。

其余。no-store,客户端和代理服务器不存储任何缓存,而是直接从服务器获取内容。no-transform:不得对资源进行转换或转变。Content-Encoding, Content-Range, Content-Type等HTTP头不能由代理修改。例如,非透明代理能够对图像格式进行转换,以便节省缓存空间或者减小缓慢链路上的流量。 no-transform指令不容许这样作。

  • Cookie   

服务端经过Set-Cookie将相关数据保存到浏览器中,而这些相关数据就是Cookie,那么,下次在同域的请求中就会带上这些Cookie,Cookie是键值对,能够设置多个。Cookie中经过max-age和expires设置过时时间,Secure值在https的时候发送,HttpOnly没法经过document.cookie访问。具体能够参考Session 和 Cookie

  • 资源验证  

在Cache Control中咱们介绍当设置no-cache参数时,代表每次请求都要到服务器验证,验证结果代表能够读取本地缓存才能够从本地读取缓存。只有到数据发生修改时,咱们才须要从服务端读取最新数据,不然从本地读取缓存。此时,判断数据是否发生修改就变得尤其重要,一般咱们采用Last-Modfied和Etag两个验证头来验证数据是否发生修改。其中Last-Modifed 一般配合If-Modified-Since或者If-UnModified-Since使用,而Etag 一般配合If-Match或者If-Non-Match使用。为了帮助你们理解,我举一个栗子。假设咱们访问mudedada.com返回头信息包含:

Last-Modified:888

Etag:123

下一次访问mukedada.com的请求头中就会包含:

If-Modified-Since:888

If-Non-Match:123

服务器会比较请求头中的Last-Modified、Etag 和服务器中的对应值是否相同,若是不相同则从新获取,不然从本地缓存中获取。

  • 长链接   

咱们知道一个HTTP须要建立一个TCP链接,完成以后就关闭TCP链接,这个成本比较高(由于建立一个TCP链接须要经过三次握手),因此在HTTP/1.1开始支持长链接,请求头标识是Connection:keep-alive。以下图所示,同一个Connection ID表示同一个链接。须要注意的是同一个链接只能是同域请求。

image.png

  • 数据协商   

数据协商指的是客户端向服务端发送请求时,客户端会声明它但愿服务端返回个格式是什么?服务端根据客户端的声明来判断返回什么要的数据。其中客户端经过Accept、Accept-Encoding等参数进行设置,而服务端经过Content-Type等参数进行设置。

客户端相关参数

  1. Accept指定返回数据类型;
  2. Accept-Encoding指定服务端的数据压缩方式,目前服务端的压缩算法有gzip, deflate, br等;
  3. Accept-Language指定返回数据的语言,例如 Accept-Language:  zh-CN,zh;q=0.9,en;q=0.8,其中q表示的是权重,也就是说浏览器更但愿服务器返回的是中文;
  4. User-Agent表示浏览器的相关信息,它能区分是移动端浏览器仍是PC端浏览器,从而返回特定的页面。

服务端相关参数:

  1. Content-Type指的是服务端返回的数据类型;
  2. Content-Encoding对应客户端的Accept-Encoding,指的是数据压缩方式;
  3. Content-Language服务端语言。

    image

image

相关文章
相关标签/搜索