HTTP/2 背景、性能及使用

在互联网的基础结构上有一个网络协议,它是TCP/IP或传输层的一部分。网络协议是互联网通讯的基础。

OSI的最上面是应用层。该层的不同应用使用不同协议互联和传输信息。比如,HTTP以及邮件收发用的SMTP、POP3和IMAP,网络聊天用的IRC、XMPP,主机远程登录用的SSH,等等。

所有协议中最广为人知的就是HTTP,它甚至成为了互联网的同义词。我们每天通过HTTP协议访问不同站点。万维网于1989年被英国计算机科学家Tim Berners-Lee在CERN(欧洲核子研究组织)发明。HTTP 1.0 于1996(RFC 1945)年发布,1.1于1999年发布。

HTTP协议由万维网联盟维护,协议内容可在http://www.w3.org/standards/techs/HTTP找。

第一代HTTP协议——1.0和1.1——在2015年之前在互联网领域占主导地位,HTTP/2发布之后行业内——web服务器、浏览器厂商——使用逐渐多了起来。

HTTP/1
HTTP是一个没有状态的协议,它基于请求响应的一一对应结构,有客户端向服务器发送原子请求。请求之间互不干涉。因此,我们必须用cookie来记录同一会话(session)的多次请求,比如,用户登录的cookie实现。

请求通常由客户端也就是浏览器发起,服务器端只是响应请求。

HTTP就像一个哑巴或者其他有缺陷的存在,需要浏览器和服务端提供很多帮助才能有效跟别人沟通。协议的变更并不像说起来那么简单,必须要考虑到现有网站功能对协议变更的兼容性。任何变更都应该无缝进行不能导致任何问题。

HTTP要求通信双方遵循严格的请求响应模式,而且还要保证通信的同步及原子性,以上三个特点已经让HTTP协议成为了互联网发展的瓶颈。技术进步只能由行业巨头比如Google, Facebook等,以“非法”方式实现。原来的使用场景(已经用各种方式改进过)是用户请求一个网页,浏览器接收到服务器的响应信息时,会解析HTML并且加载页面渲染需要的必要资源,比如CSS,图片和JavaScript。浏览器渲染页面过程中遇到资源链接时会向服务器请求该资源并停止加载其他任何东西。资源总是以同样方式加载。


加载一个大网站通常就有几百个请求


这些请求里面包含大量等待时间以及重复提交的请求,在请求的过程中用户看到的只有白屏或者部分渲染的页面。这个站点请求浪费了大量时间及带宽。

CDN可以缓解这些浪费,但是CDN也仅仅是前面提到的“非法”方式而已。

就像Daniel Stenberg说的那样,HTTP 1.1很能完全用好TCP。往往需要很多具有创造新的办法才能提高网页加载速度。

目前,宽度速度已经大幅提升,但是HTTP/1.1时代的系统并不能充分利用,并且一直被HTTP管线化(HTTP pipelining)—— 一个TCP连接发起多个请求——这样的问题困扰。浏览器作为客户端被拖累得尤甚,目前Firefox和Chrome默认禁用HTTP管线化,IE及Firefox version 54+等则彻底放弃支持该技术。这也就意味着,即使是少量资源请求也要创建一个新的TCP连接,及其他性能需求——TCP握手,DNS查找,延迟等等,并且因为排头阻塞(head-of-line blocking),一个资源的加载会阻止其他资源同时加载。




同步,非管线化连接 vs 管线化连接,管线化看上去能节省加载时间


在HTTP/1模型下,web开发人员不得不采用的优化方式有image sprites(图片合并),CSS及JavaScript合并,分布式(把用户请求分配到其他域名或者子域名)等等。

改进是应该的,但是改进的原则是无缝解决这些问题,并且要向后兼容不影响现有网站的运行。

SPDY

2009年,Google发布一个名为SPDY(音speedy)的项目,它也许会成为下一代协议的提案草案,Chrome已支持该协议,而且以后会逐渐用到其他的web服务器中。此外Twitter和web服务器厂商例如,Apache,nginx,开始支持该协议,Node.js,Facebook,WordPress.com和大部分的CDN提供者也支持该协议。


SPDY应用了多路复用技术(multiplexing)——同一个TCP连接发送多个请求。连接默认是加密的,数据经过压缩处理。SPDY白皮书显示全球前25个站点的渲染速度最少提高了27%,多的达到60%。

该协议在生产环境中证明自己的之后,SPDY的第三版成为了HTTP/2(于2015年由超文本传输协议工作组拟定)的草案

HTTP/2计划在第一版解决网络延迟问题,方式是:
.HTTP报头压缩
.服务器推送(客户端不请求,服务器也可以向客户端推送资源)
.多路复用技术

数据已二进制格式进行传输。
报头压缩使用了HPACK算法,解决了SPDY的漏洞,请求大小减半。

服务器推送旨在解决加载时间过长问题,在浏览器请求前推送资源给浏览器,这样可以节省大量通信时间(网站优化最大的难点)。


网站是否使用了HTTP/2查看

firefox->web控制台->网络->类型右键选协议->刷新


关于HTTP/2的使用问题


nginx 1.9.5以上的版本支持HTTP/2,在虚拟主机的配置里面添加http2参数就可以使用该协议。

server {

listen 443 ssl http2 default_server;

ssl_certificate server.crt;

ssl_certificate_key server.key;



http2必须在ssl配置好后才能开启。


原文:HTTP/2: Background, Performance Benefits and Implementations


资料: HTTP/1.1 vs HTTP/2: What's the Difference?

评论0条