基于二进制分帧层,HTTP2.0可以在共享TCP连接的基础上,同时发送请求和响应 。HTTP消息被分解为独立的帧,而不破坏消息本身的语义,交错发送出去,最后在另一端根据流ID和首部将他们重新组合 。对比看一下HTTP1.x和HTTP2.0,这里不考虑HTTP1.x的pipeline机制http1.x
文章插图
http2.0
文章插图
HTTP2.0成功解决了HTTP1.x的队首阻塞问题(TCP层的阻塞仍无法解决),同时,也不需要通过pipeline机制多条TCP连接来实现并行请求与响应 。减少了TCP连接数对服务器性能有很大提升,同时也消除不必要的延迟,从而减少页面加载的时间 。
请求优先级把HTTP消息分为很多独立帧之后,就可以通过优化这些帧的交错和传输顺序进一步优化性能
每个流都可以带有一个31bit的优先值:0表示最高优先级;2的31次方-1表示最低优先级 。
客户端明确指定优先级,服务端可以根据这个优先级作为交互数据的依据,比如客户端优先设置为.css>.js>.jpg 。服务端按此顺序返回结果更加有利于高效利用底层连接,提高用户体验 。然而,在使用请求优先级时应注意服务端是否支持请求优先级,是否会引起队首阻塞问题,比如高优先级的 慢响应请求会阻塞其他资源的交互 。
服务器推送HTTP2.0增加了服务端推送功能,服务端可以根据客户端的请求,提前返回多个响应,推送额外的资源给客户端
如下图,客户端请求stream 1(/page.html) 。服务器在返回stream 1的消息的同时推送了stream 2(/script.js)和stream4(/style.css)
文章插图
- PUSH_PROMISE帧是服务端向客户端有意推送资源的信号 。
- PUSH_PROMISE帧中只包含预推送资源的首部 。如果客户端对PUSH_PROMISE帧没有意见,服务端在PUSH_PROMISE帧后发送响应的DATA帧 。如果客户端已经缓存了该资源,不需要推送,可以拒绝PUSH_PROMISE帧 。
- PUSH-PROMISE必须遵循请求-响应原则,只能借着对请求的响应推送资源 。
- PUSH_PROMISE帧必须在返回响应之前发送,以免客户端出现竞态条件(竞态条件是指在多线程的情况下不同的执行顺序会导致计算机执行出不同的结果正确性不同)
- HTTP2.0连接后,客户端与服务端交换SETTINGS帧,借此限定双向并发的最大数量 。因此,客户端可以限定推送流的数量,或者通过把这个只设置为0来完全禁止服务器推送 。
- 所有推送的资源都必须遵守同源策略 。换句话说,服务器不能随便将第三方资源推送给客户端,而必须是经过双方的确认才行
文章插图
那么在nginx中如何配置支持HTTP/2?很简单,只需要在server中的listen部分添加http2即可 。
怎么测试http2是否已开启,方法很多,这里介绍三种方法:
1、浏览器开发者工具
2、Chrome扩展HTTP/2 and SPDY indicator
推荐阅读
- 免费申请 HTTPS 证书,开启全站 HTTPS
- Linux性能实时监测工具 Netdata
- 如何给域名配置https证书
- 图文教程 阿里云申请免费SSL证书实现网站HTTPS化
- MySQL中,索引,主键对数据库的性能有什么影响
- 小程序性能优化总结
- mysql优化实战:千万级数据表如何进行分页查询?
- Python密码系统速查表
- 一份SEO优化操作方案具体讲解
- JS全局变量是如何工作的?