从HTTP发展角度研究HTTP

前言

做为前端开发者,咱们有必要了解数据在网络中是怎样传输的,而HTTP是浏览器中使用最多的与服务器进行通讯的协议,经过对协议的学习,使咱们对浏览器工做流程及解决项目优化瓶颈都有很重要的意义。所以本文就HTTP的发展历程及发展各个阶段作了哪些优化进行总结说明。也算是对本身这一阶段的学习作个总结。css

HTTP/0.9

主要功能是在网络之间传输HTML超文本文件,因此又叫超文本传输协议,实现较为简单,只是基于请求与响应。整个传输过程是基于TCP下的,因此传输以前要首先创建TCP链接。具体流程图以下图所示: html

HTTP/0.9请求流程图
总结HTTP/0.9具备如下特色:

  • 只有一个请求行,没有请求头请求体
  • 服务器没有响应头,只返回数据就OK。
  • 文件传输采用ASCll字符流传输。

HTTP/1.0

随着互联网的不断发展,咱们对浏览器展现的页面要求也愈来愈高,在浏览器中加载的资源不能只局限于HTML,还包括JS、CSS、IMG、video、audio等其余类型资源,因此HTTP在数据传输过程当中加入了请求头响应头(以key-value对形式存在),用来传输更多信息。流程图以下: 前端

HTTP/1.0请求流程
有了请求头和响应头后,浏览器和服务器就能够交换更多的信息,而且作不一样的处理,比较典型的几个头信息以下:

  • 经过Accept/Content-Type协商接收/传输文件类型,包括html、image、application等。
  • 经过Accept-Encoding/Content-Encoding协商压缩类型,包括gzip、br、deflate等。
  • 经过Cache-Control肯定是否缓存。
  • 经过Accept-Language支持国际化。
  • 加入用户代理User-Agent用于服务端统计客户端数据。
  • 引入状态码,可让浏览器根据不一样状态码处理不一样逻辑。

HTTP/1.1

HTTP/1.0的大幅度改进,增长了客户端与服务端的拓展性,但因为客户端对性能或者用户体验的要求不断提升,当资源过多时没法知足咱们的需求,所以HTTP/1.1又作了大量改进,主要改进有如下几点:浏览器

1. 改进持久链接

首先HTTP/1.0采用的是短链接,也就是每次请求都要创建TCP链接、断开链接的操做,无形增大了不少开销。因此HTTP/1.1增长了持久链接,意思是链接一旦创建,就能够传输屡次HTTP请求,经过头信息Connection: keep-alive实现,默认开启,而且容许同一域名下最多同时创建6个TCP链接。如需关闭传入close便可。缓存

2. 对动态内容提供支持

在HTTP/1.0 时,经过响应头中设置Content-Length告知浏览器资源大小,但目前不少页面的内容都是动态生成的,传输前没法判断资源大小,因此浏览器不知道何时传输完。安全

HTTP/1.1 经过引入 Chunk transfer 机制来解决这个问题,服务器会将数据分割成若干个任意大小的数据块,每一个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块做为发送数据完成的标志。这样就提供了对动态内容的支持。服务器

3. 引入 Cookie、安全机制

经过引入cookie记录和保存用户信息,由服务器端生成,经过set-cookie告知客户端,浏览器将其存放在内存或磁盘中,set-cookie只能包含一个name/value名值对,可是服务器能够发送多个set-cookie头部,客户端经过cookie请求头将cookie发送服务端验证,响应头不一样的是,他只能发送一个cookie请求头,但它能够包含多个名值对cookie

  • cookie在HTTP中明文传递,因此有安全性问题(https解决)。
  • 大小不该超过4k,若是过大在某些代理服务器或浏览器中会出现问题。

HTTP/2.0

在HTTP/1.1中仍然存在不少能够优化的问题好比TCP慢启动、带宽利用率不高、并发链接的限制、在同一TCP链接内每一个请求时串行的、不支持服务器推送等问题。网络

在HTTP/2.0版本中对上述问题主要作了如下改进:并发

1. 经过多路复用改善串行请求

具体实现是在应用层添加二进制分帧层,数据经过二进制分帧层变成一个个标有streamID的数据流,每一个stream能够包含一个或多个数据帧。接收端能够经过streamID将消息进行组装。这样就实现了同一TCP中能够并发传送多个HTTP请求。

2. 设置请求优先级

对于某些关键性资源,例如js、css咱们每每但愿服务端优先处理,在HTTP/2.0中能够经过stream中的Priority设置帧来配置优先级

3. 服务端推送

对于HTML页面中引用的资源,若是咱们在请求html时,服务端解析到须要哪些js或css资源文件而且一并发送给客户端,而不是等到客户端解析html后去请求资源文件。这种对于页面的加载的速度提高是很是大的。

HTTP/2.0中能够实现将资源提早推送到客户端进行缓存。由服务端把请求放到PUSH_PROMISE帧,再额外推送资源。客户端再解析到资源请求时就能够直接在缓存中读取

服务端推送流程图

4. 支持同一域名维护一个TCP链接

这样减小TCP链接个数,从而优化TCP慢启动的问题

相关文章
相关标签/搜索