在互联网的基础设施 – 或物理网络层 – 之上是互联网协议,作为TCP / IP或传输层的一部分。它是我们所有或大部分互联网通信的基础。
我们在此基础上使用的更高级别的协议层是应用程序层。在此级别上,各种应用程序使用不同的协议来连接和传输信息。我们有SMTP,POP3和IMAP用于发送和接收电子邮件,IRC和XMPP用于聊天,SSH用于远程服务器访问,等等。
其中最着名的协议是HTTP(超文本传输协议),它已成为互联网使用的同义词。这是我们每天用来访问网站的内容。早在1989年,它就由Tim Berners-Lee在欧洲核子研究中心设计。版本1.0的规范于1996年发布(RFC 1945),1999年发布1.1。
HTTP规范由万维网联盟维护,可以在http://www.w3.org/standards/techs/HTTP找到。
这个协议的第一代 – 版本1和1.1 – 主导了网络直到2015年,当时HTTP / 2发布,业界 – 网络服务器和浏览器供应商 – 开始采用它。
HTTP / 1
HTTP是一种基于请求 – 响应结构的无状态协议,这意味着客户端向服务器发出请求,并且这些请求是原子的:任何单个请求都不知道先前的请求。(这就是为什么我们使用cookie – 在一个用户会话中弥合多个请求之间的差距,例如,能够为登录用户提供经过身份验证的网站版本。)
传输通常由客户端启动 – 即用户的浏览器 – 服务器通常只响应这些请求。
我们可以说HTTP的当前状态非常“愚蠢”,或更好,低级别,需要向浏览器和服务器提供大量“帮助”,以便有效地进行通信。这个领域的变化并不是那么容易引入,现有的网站很多,其功能取决于与任何引入的变化的向后兼容性。为改进协议而采取的任何措施都必须以无缝方式完成,不会破坏互联网。
在许多方面,当前模型已经成为这种严格的请求 – 响应,原子,同步模型的瓶颈,并且进步主要采取黑客的形式,经常由谷歌,Facebook等行业领导者带头。通常的情况,正在以各种方式改进,供访问者请求网页,当他们的浏览器从服务器接收它时,它解析HTML并找到呈现页面所需的其他资源,如CSS,图像和JavaScript。当遇到这些资源链接时,它会停止加载其他所有内容,并从服务器请求指定的资源。在收到此资源之前,它不会移动一毫米。然后它请求另一个,依此类推。
加载世界上最大的网站所需的请求数量往往是几百个。
这包括很多等待,以及很多往返旅程,在此期间我们的访客只能看到白色屏幕或半渲染网站。这些浪费了几秒钟。在这些请求周期中,许多可用带宽只是闲置在那里。
CDN可以缓解很多这些问题,但即使它们只是黑客攻击。
正如Mozilla的Daniel Stenberg(致力于HTTP / 2标准化的人之一)指出的那样,协议的第一个版本很难充分利用底层传输层TCP的容量。
一直在努力优化网站加载速度的用户知道这通常需要一些创造力,温和地说。
随着时间的推移,互联网带宽速度急剧增加,但HTTP / 1.1时代的基础设施并没有完全利用这一点。它仍然在解决像HTTP流水线这样的问题- 在同一个TCP连接上推送更多资源。浏览器中的客户端支持拖延最多,Firefox和Chrome默认禁用它,或根本不支持它,如IE,Firefox版本54+等。
这意味着即使是小资源也需要打开新的TCP连接随着它的所有膨胀 – TCP握手,DNS查找,延迟……由于行头阻塞,一个资源的加载导致阻止所有其他资源加载。
同步,非流水线连接与流水线连接,显示可能节省的加载时间。
一些优化巫术Web开发人员不得不求助于HTTP / 1模型来优化他们的网站,包括图像精灵,CSS和JavaScript连接,分片(分散访问者对多个域或子域的资源请求),等等。
改进是应有的,它必须以无缝,向后兼容的方式解决这些问题,以免中断现有Web的工作。
SPDY
2009年,谷歌宣布了一个项目,该项目将成为新一代协议SPDY(发音为speedy)的提案草案,增加对Chrome的支持,并在随后几年将其推向其所有网络服务。然后跟随Twitter和服务器供应商,如Apache,nginx和他们的支持,Node.js,以及后来的Facebook,WordPress.com和大多数CDN提供商。
SPDY引入了多路复用 – 通过单个TCP连接并行发送多个资源。默认情况下连接是加密的,数据是压缩的。首先,在前25个站点上进行的SPDY白皮书的初步测试显示速度从27%提高到超过60%。
在证明自己正在生产之后,SPDY版本3成为 2015年超文本传输协议工作组httpbis 制定的HTTP / 2初稿的基础。
HTTP / 2旨在通过以下方式解决困扰协议第一版本的问题 – 延迟问题:
- 压缩HTTP标头
- 实现服务器推送
- 通过单个连接复用请求。
它还旨在解决线头阻塞问题。它传输的数据是二进制格式,提高了效率,默认情况下需要加密(或者至少是主要浏览器强制要求)。
使用HPACK算法执行标头压缩,解决SPDY中的漏洞,并将Web 请求大小减少一半。
服务器推送是旨在通过在浏览器需要之前向访问者的浏览器提供资源来解决浪费的等待时间的功能之一。这减少了往返时间,这是网站优化的一大瓶颈。
由于所有这些改进,可以在此示例页面上通过imagekit.io 看到HTTP / 2为表带来的加载时间的差异。
网站拥有的资源越多,加载时间的节省就越明显。
如何查看网站是否通过HTTP / 2服务资源
在主要浏览器(如Firefox或Chrome)中,我们可以通过打开“ 网络”选项卡并右键单击资源列表上方的条带来检查网站对检查器工具中HTTP / 2协议的支持。在这里,我们可以启用Protocol项。
另一种方法是安装一个基于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规范本身并不需要。
服务器
Apache 2.4通过其mod_HTTP2模块支持它,现在它应该是生产就绪的。需要通过--enable-HTTP2
在./configure
命令中添加参数来构建Apache 。我们还需要确保至少libngHTTP2
安装了1.2.1版的库。在系统找不到它的情况下,我们可以./configure
通过添加提供路径--with-ngHTTP2=<path>
。
下一步是通过将指令添加到Apache的配置来加载模块:
LoadModule HTTP2_module modules/mod_HTTP2.so
然后,我们将添加Protocols h2 h2c HTTP/1.1
到我们的虚拟主机块并重新加载服务器。在启用HTTP / 2时,Apache的文档警告我们注意事项:
在Apache服务器上启用HTTP / 2会对资源消耗产生影响,如果您有繁忙的站点,则可能需要仔细考虑其影响。
启用HTTP / 2后,第一个值得注意的事情是您的服务器进程将启动其他线程。这样做的原因是HTTP / 2将它收到的所有请求提供给它自己的工作 线程进行处理,收集结果并将它们流出到客户端。
您可以在此处阅读有关Apache配置的更多信息。
从版本1.9.5开始,nginx 支持HTTP / 2,我们通过简单地将http2参数添加到我们的虚拟主机规范来启用它:
server {
listen 443 ssl http2 default_server;
ssl_certificate server.crt;
ssl_certificate_key server.key;
然后重新加载nginx。
遗憾的是,在撰写本文时,服务器推送尚未正式实施,但已添加到计划于明年发布的开发路线图中。对于更具冒险精神的人来说,有一个非官方的nginx模块,它增加了对HTTP / 2服务器推送的支持。
LiteSpeed和OpenLiteSpeed 也支持HTTP / 2。
在服务器端激活HTTP / 2 之前的一个警告是确保我们有SSL支持。这意味着我们上面提到的所有虚拟主机片段 – 对于Apache和nginx – 需要进入SSL版虚拟主机块,监听端口443.一旦我们安装了Apache或nginx,我们就配置了常规虚拟主机获得LetsEncrypt SSL证书,并将其安装在任何主要的Linux发行版上应该只需要几行代码。Certbot是一个命令行工具,可以自动完成整个过程。