HTTP/2.0学习
HTTP/1.1时代
特性
对HTTP/1.0做了许多优化,也是现如今使用最多的HTTP协议:
持久化连接以支持连接重用
1.0时代每个请求都会重新创建一个TCP连接,一旦响应返回就立即关闭。而建立一个TCP连接,需要3次握手(https则需要8步),这造成了极大的性能浪费,所以1.1增加了持久化连接以达到重用。
请求管道支持并发请求处理
持久连接解决了连接复用问题,但还是存在着一个问题:在一个 TCP 连接中,同一时间只能够发送一个请求,并且需要等响应完成才能够发送第二个请求。
因此 HTTP/1.1 制订了 PipeLining 管道,通过这个管道,浏览器的多个请求可以同时发到服务器,但是服务器的响应只能够一个接着一个的返回 ( 但各大浏览器有些不支持/默认关闭,因此这功能可以说是鸡肋)。
因为每一条连接同时只能够返回一个响应,因此浏览器为了改善这种情况,会同时开启2~8(比如Chrome 6个)个 TCP 连接进行发送请求。
更好的缓存机制
优化
基于以上特性,在HTTP/1.1上web前端的优化基本上如下:
资源合并
合并js和css文件,雪碧图等以减少http连接,但是副作用就是一个小的文件改动都会引起整个缓存资源失效。
一般合并大小建议为30~50kb
域名分区
由于1.1浏览器对于并发请求数有限制,所以可以使用多域名或者子域名来达到减少排队延迟的目的。
资源内嵌
对于不常用的,较小大资源内嵌在文档中,比如base64的图片,以减少HTTP请求,但是这样的资源不能在浏览器中缓存,也不可能被其他页面共享,同时还有可能编码之后的资源变等更大了。在HTTP2中,这样的资源就可以使用SERVER PUSH来推送。
建议:
- 只考虑嵌入1~2 KB 以下的资源,因为小于这个标准的资源经常会导致比它自身更高的HTTP 开销
- 如果文件很小,而且只有个别页面使用,可以考虑嵌入。理想情况下,最好是只用一次的资源
- 如果文件很小,但需要在多个页面中重用,应该考虑集中打包
- 如果小文件经常需要更新,就不要嵌入了
- 通过减少 HTTP cookie的大小将协议开销最小化
HTTP/2.0时代
说到此,就必须先说一下SPDY,由于现代网页的不断丰富,HTTP/1.1显然满足不了此带来的性能开销,因此Google在2012年起草了SPDY,实际上2.0就是以此协议为原型进行开发的,特性如下:
SPDY 现已经被大多数浏览器以及 WEB 服务器所支持,但为了推进 HTTP/2.0, Google 已经宣布在 2016年对其停止开发。下来说说我们的主角,HTTP/2.0特性如下:
二进制分帧
HTTP1时代都是明文传输,HTTP/2.0则改为了二进制传输,实现低延迟和高吞吐量,将传输信息切分为更小的消息(帧),采用二进制格式编码。
头部压缩
IO多路复用
在一条连接上可以发送无限请求,并且可以响应并成功返回。一个TCP连接就相当于一个管道,一个http请求就相当于管道中的一个流(stream),数据在流中进行传输,因为采用二进制帧传输,数据在客户端乱序传输,到服务端后会进行数据重组,并不会因此造成信息错乱,所以在2.0上,之前的资源合并优化并不适用。
请求优先级
服务端推送
服务端推送的优化:可以缓存。
强制SSL(Chrome浏览器)
虽然 HTTP/2.0 协议并没声明一定要用 SSL,但是最新版本的Chrome浏览器已经强制要求使用HTTPS。