为了账号安全,请及时绑定邮箱和手机立即绑定

HTTP / 2的来历与应用,向现代Web进击!

HTTP在互联网基础设施之上 ,或者说物理网络层,位于互联网协议之上,作为TCP / IP或传输层的一部分。这是我们大部分互联网通信的基础。

来历

我们在此之上使用的更高层协议层是应用程序层。在这个层面上,各种应用程序使用不同的协议来连接和传输信息。我们有用于发送和接收电子邮件的SMTP,POP3和IMAP,用于聊天的IRC和XMPP,用于远程服务器访问的SSH等等。

其中最着名的协议是HTTP(超文本传输​​协议),它已成为互联网使用的代名词。这就是我们每天用来访问网站的内容。它早在1989年就由CERN的Tim Berners-Lee设计。版本1.0的规范于1996年发布(RFC 1945),1999年发布于1.1。

HTTP规范由万维网联盟维护,可以在http://www.w3.org/standards/techs/HTTP找到。

第一代协议版本1.0和1.1直到2015年,当HTTP / 2发布以及行业中的网络服务器和浏览器供应商开始采用2时,1.1一直占主导地位。

HTTP/1

HTTP是一种基于请求 - 响应结构的无状态协议,这意味着客户端向服务器发出请求,并且这些请求是原子的:任何单个请求都不知道以前的请求。 (这就是我们使用cookie的原因 - 在一个用户会话中弥补多个请求之间的差距,例如,能够为登录的用户提供经过验证的网站版本。)

发送请求通常由客户端启动(意味着用户的浏览器)而服务器通常只是响应这些请求。

我们可以说HTTP的当前状态非常“愚蠢”,或者更好的来形容它是低层次的,需要给浏览器和服务器提供很多“帮助”,以便有效地进行通信。这个领域的变化并不那么简单,有许多现有网站的功能取决于与任何引入的变化的向后兼容性。为了改进协议而做的任何事情都必须以不会中断互联网的无缝方式完成。

在许多方面,目前的模型已经成为这种严格的请求响应,原子,同步模型的瓶颈,而且进展主要采取Hack的形式,经常由像谷歌,Facebook等行业领导者牵头。通常情况下正在以各种方式得到改进,访问者请求一个网页,当他们的浏览器从服务器接收到它时,它解析HTML并找到其他必要的资源来渲染页面,如CSS,图像和JavaScript。在遇到这些资源链接时,它会停止加载其他所有内容,并从服务器请求指定的资源。在收到此资源之前,它不会做出任何动作。然后它才能再去请求下一个,依此类推。

图片描述

这包括许多等待,以及许多往返旅程,在此期间,我们的访客只能看到白色屏幕或半呈现网站。这些都是浪费时间。在这些请求周期中,大量可用带宽只是坐在那里但是未使用。

CDN可以缓解许多这些问题,但即使它们只不过是Hack罢了。

正如来自Mozilla的Daniel Stenberg(从事HTTP / 2标准化工作的人之一)指出的那样,该协议的第一个版本正在充分利用底层传输层TCP的容量。

一直致力于优化网站加载速度的开发者知道这通常需要一定的创造力,才能使其变快一些。

随着时间的推移,互联网带宽速度急剧增加,但HTTP / 1.1时代的基础设施并没有充分利用这一点。它仍然面临诸如HTTP流水线这样的问题 - 通过相同的TCP连接推送更多的资源。浏览器中的客户端支持一直在拖拉,Firefox和Chrome默认禁用它,或根本不支持它,比如IE,Firefox版本54+等。

这意味着即使是小的资源也需要打开一个新的TCP连接,伴随着它的内部步骤 - TCP握手,DNS查找,延迟......并且由于头部阻塞,加载一个资源会导致阻塞所有其他资源来自加载的资源。

图片描述
一个同步的非流水线连接与一个流水线连接比较,可以节省加载时间。

一些优化网站开发者不得不依靠HTTP / 1模型来优化他们的网站,包括图像精灵,CSS和JavaScript拼接,分片(在一个以上的域或子域中分发访问者对资源的请求)等等。

改进有一个前提,就是它必须以无缝,向后兼容的方式解决这些问题,以免中断现有网络的运作。

SPDY

在2009年,谷歌宣布了一个项目,该项目将成为新一代协议草案的提案,即SPDY(发音速度很快),增加对Chrome的支持,并在随后的几年中推广到它的所有Web服务。然后跟随Twitter和服务器供应商如Apache,nginx以及他们的支持Node.js,后来还有Facebook,WordPress.com和大多数CDN提供商。

SPDY引入了多路复用 - 通过单个TCP连接并行发送多个资源。连接默认是加密的,数据是压缩的。首先,在SPDY白皮书上前25个站点进行的初步测试显示,速度从27%提高到60%以上。

SPDY版本3于2015年成为超文本传输​​协议工作组httpbis制定的HTTP / 2初稿的基础。

HTTP / 2旨在通过以下方式解决处理第一版协议 - 延迟问题的问题:

  • 压缩HTTP头
  • 实施服务器推送
  • 通过单个连接复用请求。

它也旨在解决头部阻塞问题。它传输的数据是二进制格式,提高了效率,并且默认情况下需要加密(或者至少这是主流浏览器强加的要求)。

使用HPACK算法执行头压缩,解决SPDY中的漏洞,并将Web请求大小减少一半

服务器推送Server Push是通过提前向访问者的浏览器提供资源来解决浪费的等待时间的功能之一。这减少了往返时间(这是网站优化的一大瓶颈)。

由于所有这些改进,HTTP / 2带来的加载时间差异可以在imagekit.io的示例页面中看到。

网站拥有的资源越多,加载时间节省越明显。

如何查看网站是否通过HTTP / 2提供资源

在Firefox或Chrome等主流浏览器中,我们可以通过打开“网络”选项卡并右键单击资源列表上方的条状图,检查网站对检测器工具中HTTP / 2协议的支持。在这里,我们可以查看Http协议。

图片描述

另一种方法是安装一个基于JavaScript的小工具,它允许我们通过命令行检查HTTP / 2支持(假设我们安装了Node.js和npm):

npm install -g is-HTTP2-cli

安装后,我们应该可以像这样使用它:

is-HTTP2 www.google.com

 HTTP/2 supported by www.google.com
Supported protocols: grpc-exp h2 HTTP/1.1

实现

在撰写本文时,所有主流浏览器都支持HTTP / 2,尽管需要加密所有HTTP / 2请求,而HTTP / 2规范本身并不需要。

Servers

Apache 2.4支持它的是mod_HTTP2模块,该模块现在应该可以生产了。 Apache需要通过在./configure命令中添加--enable-HTTP2参数来构建它。我们还需要确保至少安装了libngHTTP2库的1.2.1版本。在系统遇到问题的情况下,我们可以通过添加--with-ngHTTP2 = <path>来为./configure提供路径。
下一步是通过将指令添加到Apache的配置来加载模块:

LoadModule HTTP2_module modules/mod_HTTP2.so

然后,我们会将Protocols h2 h2c HTTP/1.1添加到我们的虚拟主机模块并重新加载服务器。 Apache的文档在启用HTTP / 2时警告我们注意以下事项:

在Apache服务器上启用HTTP / 2会影响资源消耗,如果您的网站很繁忙,则可能需要仔细考虑这些影响。 启用HTTP / 2后第一个值得注意的事情是您的服务器进程将启动其他线程。原因是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;

然后重新加载nginx。

不幸的是,编写本文时的服务器推送server push并未正式实施,但它已被添加到计划于明年发布的开发计划中。对于更冒险的人来说,有一个非官方的nginx模块,增加了对HTTP / 2服务器推送的支持。

LiteSpeed和OpenLiteSpeed也支持HTTP / 2。

在服务器端激活HTTP / 2之前需要注意的一点是确保我们拥有SSL支持。这意味着我们上面提到的所有虚拟主机片段 - 对于Apache和nginx - 都需要进入SSL版本的虚拟主机模块,在端口443上侦听。一旦我们安装了Apache或nginx,并且我们已经配置了常规虚拟主机,获得LetsEncrypt SSL证书,并将其安装在任何主要的Linux发行版上应该只是几行代码。 Certbot是一个可以自动执行整个过程的命令行工具。

点击查看更多内容
8人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消