[翻译]关于 HTTP/2 需要知道的事情

Source:
>what you need to know-about-http-2

看住你的浏览器地址栏。看到它前面的那些字母"HTTP"了吗?那代表着超文本传输(转移)协议,浏览器使用这一机制(mechanism)来从一个服务器上面获取信息并且以网页的形式展现你的屏幕上面。一份可靠并且待普及的新版本HTTP协议最近有由管理创造互联网标准的组织公开了这一草案,互联网工程任务组。这意味着旧版本,从1999年就开始使用的HTTP/1.1,最终将会被新的给取代,也就是HTTP/2。这次更新将会改善浏览器与服务器通信,使得更快的传输信息的同时减少通信过程中需要的链接数量。

为什么那么重要?

HTTP/1.1已经从1999年就开始使用了,同时也很好地服务了这么多年,也开始表现出的它的不足之处。如今的网页除了包含标准的HTML还包含了多种不同的组成成分,比如设计元素(CSS),客户端脚本(JavaScript),图片,视频以及Flash动画。为了传输这些信息,浏览器得创建几个网络连接,并且每个连接包含源ip地址,目标通信ip地址还有通信包或者协议的内容。这给服务器传递内容以及你的浏览器增加了巨大的负担。

这些连接以及处理这些连接需要的计算机资源会随着越来越多的元素增加到网站中而变慢。如果对此一无所知,人们会变得十分的不耐烦。我们已经到了需要更快的网络,甚至是即便轻微的延迟都有可能导致用户抓耳挠腮。从公司角度来看,一个访问速度很慢的网站意味着失去金钱,尤其对于线上服务来说,过长的网页加载时间意味糟糕的用户体验。

自从使用拨号上网开始以及这一加快网络速度的目标同时存在,人们就已经着手寻找加快网络速度的方式了。一种很常见的技术就是使用缓存,将合适的信息存储在本地,而不是每次请求都重新获取所有的东西。但是还有其他技巧,比如降低图片和视频的的分辨率。其他人依旧花费不可估量的几个小时去转换和优化代码,目的就是为了减少网页加载时,那毫秒级的加载时间。这一选择是不能说没有用,但是确实只是暂时性解决办法。所以Google决定大服务改革HTTP/1.1并且创造了SPDY;这一结果可以说是卓有成效。
通常情况下,在服务器和浏览器之间使用SPDY通信是更快的,即使是使用加密的情况下。最小情况下,使用SPDY的传输速度可以提高到大概10%,在某些情况下,甚至可以很接近40%。有如此大的成就的SPDY项目,在2012年,这一项目背后的Google工程师组决定基于这一技术创造一份新的协议,因此也开启了目前我们能够看到HTTP/2草案的故事。

什么是协议?

你可以认为协议是将信息如何从一台计算机传输到另一台的计算机的规则集合。每个协议都有些不同点,但通常都会包含有一个头部(header),数据载荷(payload)以及脚部(footer)。头部包含计算机源地址以及要通信的计算机的目的地址,以及一些关于数据载荷(数据类型,数据大小等等)。数据载荷包含了实际的通信信息,脚步包含一些错误的检测形式。一些协议也支持一种称为"封装"("encapsulation"),这一特性是在数据载荷内部区域包含其他协议。

你可以认为这就像是在使用snail mail发送邮件。在这个例子中,使用的协议是由USPS定义的。这封信会需要一个指定格式的目的地址,一个返回地址和邮票。“数据载荷"(payload)就是信件本身并且错误检测就是信封上面的印章。如果新建到达的时候撕开了,并没有信在里面,你就会知道这其中出了问题。

为什么HTTP/2更好?

总而言之:HTTP/2能更快的加载网页,省去每个人在这一过程中会浪费的时间。
下面的例子,来自发表在HTTPWatch的文章,文章中也展示出,传输速度增加到了20%以上,并且这只是一次在网页服务器还没有经过完全优化的情况下进行的测试(这一技术需要一些时间让其变得成熟)。事实上,提升大概30%似乎常见一些。

下图是未使用HTTP/2的页面加载速度

使用HTTP/2之后的页面加载速度

HTTP/2主要是在服务器和浏览器之间创建一个固定的网络连接来提高速度,而不是每次根据需要的信息来创建网络连接。这显著地减少了数据的传输量。再加上,它以二进制的方式进行传输数据,这是计算机可以直接理解的方式,而不是用文本的方式传输。这意味着,计算机没必要在浪费时间将信息以自己可理解的格式进行翻译。HTTP/2的其它特性就是复用(multiplexing)——同时发送和接收消息,优先权的使用(重要数据优先传输),压缩(压缩信息到更小的块中)和服务器推送(server push),服务器推送是一个服务器知道下一个请求会是什么数据,并且提前发送数据。

那么什么时候享受到HTTP/2带来的便利性?

就没有真正开始使用的HTTP/2的日期,很多人可能已经不知不觉的使用上了。这份草案在2月11号的时候提交上去的,六个月将会过期(8月15号,准确地说)。在过期之前,需要确认并且形成最终的文档,也就是所谓的"RFC",或者一份经过修改再次公开的草案。

作为一篇旁注,我们应该提到“RFC”这个术语来自“Request For Comments",但确实是IETF用来命名最终文档的短语。并且,”RFC“不是一种需求,而更多的是如何进行设计的一些建议。(有点混淆,对吧?)然而,为了让一份协议恰当地工作,每个人得遵循同样的规则。

HTTP/2这项技术现在已经整合进了网页服务器(web server)与浏览器中,即使它还只是一份草案。例如,微软在windows 10 technical preview上运行的IE支持HTTP/2
Chrome 也支持了(虽然默认情况是关闭的状态,但是你可以很容易的开启它)。还有Mozilla在Firefox Beta36已经使这项功能可用了。

2018.10.16
现在的Chrome已经是默认开启了HTTP/2, Firefox 目前的版本是Firefox Quantum 63.0.3都已经有这个特性。

Chrome Version 69.0.3497.100

b3ecc3c15fd54414.png

Firefox Quantum 63.0.3

2504c999ab0a4737.png

如果我们谈论网页服务器(web server),你应该知道IIS(Windows web server)在Windows 10下已经支持HTTP/2,期待Apache和Nginx将会很快支持(通过扩展模块,SPDY已经支持了)。

本站现在使用Nginx也已经支持了。因为Apache我没用过,但是经过一番搜索,也是支持的。该篇文章发布时间为2016年。Nginx 现在直接安装也都是支持。

那么Nginx是如何开启HTTP/2呢?

只需要在server块里面listen的端口后面空格并加上http2即可。

总结

  1. 协议是一种通信规则。
  2. HTTP/2在浏览器和服务器之间创建一个固定的网络连接,减少数据传输,提升速度。
  3. HTTP/2实现连接复用(同时发送和接受消息), 使用二进制的方式进行数据的传输,服务器推送。

-- EOF --