咱们知道目前不少应用系统中的内容传输协议采用的HTTP协议,所以无论你是前端人员、后端人员、运维人员,甚至是管理人员,都须要掌握HTTP知识!!
该版本只有一个命令GET;没有HEADER等描述数据的信息; 服务器发送完毕,就关闭TCP链接。前端
该版本增长了不少命令;增长status code 和header;多字符集支持、多部分发送、权限、缓存等。web
HTTP/1.1 算法
该版本增长了持久链接、Pipeline,增长host和其余一些命令。持久链接会在HTTP特性中介绍;若是没有pipeline,那么Web服务器就须要串行处理请求,而有了pipeline,Web服务器就并行处理请求;而增长host实现了一台物理设备能够运行多个web服务。后端
全部数据以二进制传输,以前版本使用字符串进行传输;同一个链接 里面发送多个请求再也不须要按照顺序来;头信息压缩以及推送等提升效率的功能。跨域
为何要三次握手?由于网络是有可能延迟的,当客户端没有收到服务端的确认包,若是没有第三次握手,那么服务端不知道上次传输是否是被客户端正常接收了,若是没有接收,服务端的这个端口也是打开的,这就比较浪费资源。浏览器
HTTP报文分为请求报文和响应报文,请求报文和响应报文分为起始行、首部(header)和主体(body),请求报文的首部包括三部分,分别是HTTP方法、资源目录和协议,而响应报文的首部包括协议版本、状态码和状态吗对应的意思,好比200状态的意思是ok。须要注意的是:HTTP header和HTTP body之间以一行分隔。缓存
HTTP方法定义对资源的操做,经常使用的有GET、POST等,这就就不详细展开了。服务器
HTTP Code用于定义服务器对请求的处理结果,各个区间的code有不用的语义。1xx 表示信息响应类,表示接收到请求而且继续处理;2xx 表示成功;3xx 表示重定向;4xx 表示客户端出错;5xx 表示服务器出错。cookie
同源策略,也就是说当两个请求的URL的协议、host和端口都相同的状况下,咱们才认为这两个请求是同域的即同源,而只要协议、host和端口只要有一项是不一样的,咱们就认为是不一样源的,即跨域,例如:网络
上述两个请求就是跨域请求。须要注意的是跨域请求不是说浏览器限制了发起跨站请求,浏览器只是将返回结果拦截下来,最好的例子就是CSRF跨站脚本攻击。若是咱们想让浏览器放行返回结果,则经过如下方法:
对于静态资源,好比说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指令不容许这样作。
服务端经过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表示同一个链接。须要注意的是同一个链接只能是同域请求。
数据协商指的是客户端向服务端发送请求时,客户端会声明它但愿服务端返回个格式是什么?服务端根据客户端的声明来判断返回什么要的数据。其中客户端经过Accept、Accept-Encoding等参数进行设置,而服务端经过Content-Type等参数进行设置。
客户端相关参数:
服务端相关参数: