发展
HTTP协议的发展到2,0.一共经过了四个阶段。分别是HTTP/0.9,HTTP/1.0,HTTP/1.1,HTTP/2.0
HTTP/0.9
- 只支持GET方法
- 响应只能是HTML格式的字符串
- 不能保持长连接
HTTP/1.0
- 增加了POST和HEAD方法
- 可以传输任何格式的内容
- 请求和响应都加上了header
- 不能保持长连接
- 支持缓存
HTTP/1.1
- 支持长连接(Connection: keep-alive)和流水线
- 协商缓存支持Etag
- 支持断点续传(只请求一部分,header中的range字段)状态码是206
- 增加HOST头,一台物理服务器(一个ip)可以对应多个虚拟主机(域名)
HTTP/2.0
- 多路复用
- 服务端推送
- 二进制分帧
- header压缩
多路复用
HTTP协议基于TCP协议,故发送HTTP请求前都要建立TCP连接。
HTTP1.0,因为不支持长连接,每发送一次请求就要建立一次TCP连接。
HTTP/1.1,开始支持长连接,即可以串行复用TCP连接,如果向同时发送三个请求,就需要建立三个TCP连接,同时由于浏览器对同一个域名下TCP连接数量的限制,比如一个限制最大的TCP连接数是3个,那么第4~6个请求就会被阻塞(stalled)
HTTP/2.0,支持多路复用,即并行复用TCP连接,多个请求可以同时发送,对同一个域名的多个请求只用建立1个TCP连接了
多路复用带来的影响
- 页面加载速度的提升 这个网站通过在不同HTTP协议的版本下同时发起大量请求的效果差异The Future of Internet
在network中查看waterfall
在1.1版本下,请求被阻塞的时间很长(前面灰色部分),正是因为TCP连接一次只能服务于一个HTTP/1.1的请求。
在2.0版本时,请求可以被及时响应
但是会发现并不是所有请求都同时真正开始,因为处理HTTP协议版本可能造成阻塞,网络带宽也有最大限制
- 性能优化的效果反转 前端的性能优化可以分成网络资源请求优化和渲染优化。
由于多路复用的机制,很多1.1时代的网络资源请求优化手段会适得其反。
文件合并
在以前会用到JS文件合并和雪碧图来减少HTTP请求的数量来达到优化目的。因为在1.1时代的TCP只能穿行复用,而现在可以多个文件并行传输。 如果一个资源a更新,由于文件a,b,c合并,本地缓存合并文件abc都需要更新。在2.0时代,不压缩文件,能更精确更新资源,反而是更好的选择。
多域名
之前由于浏览器对同一个域名下TCP连接数量的限制,会把文件a,b放在两个不同的域名下,防止超过TCP最大连接数量的HTTP请求被阻塞。 但由于多路复用,放在同一个域名下ab文件可以被同时下载,并且减少对多个域名建立TCP连接的时间浪费。