超文本传输??协议(HTTP)是万维网和网络空间的基础。虽然HTTP已经有些落伍了,但作为使用最广泛的协议版本,HTTP1.1已经快20年了——这让我们不得不赞叹“老而强”。1997年首次获批时,软盘驱动器和调制解调器仍是当时PC设备的必备外设,而Java只是一门新兴的编程语言,显示出大有可为的发展前景。到2015年5月,HTTP/2正式亮相,致力于解决现代网络时代HTTP1.1无法应对的一些性能问题。在过去的一年里,对HTTP/2的支持已经或即将在浏览器、Web服务器、商业代理和每个主要的内容分发网络中得到广泛支持。不幸的是,对于负责编写Web代码的开发人员来说,HTTP/2过渡工作并不是很直观,它在处理速度上的提升永远不会单独出现。面对高性能Web应用程序和各种尚不支持它们的现有工具,例如调试代理,这种新协议继续挑战程序员的大脑和技能。在今天的文章中,我们将介绍HTTP/2的基本概念以及它如何改变Web性能的最佳实践。二进制帧:HTTP/2的“基本单元”HTTP1.1的一大优势(至少与非安全连接相比)是它支持在端口80上的telnet会话中使用文本与Web服务器交互:键入GET/HTTP/1.1能够在大多数Web服务器上返回HTML文档。由于这是一个文本协议,它的调试过程比较直观。与1.1版本的文本相比,HTTP/2中的请求和响应是以二进制帧流的形式来表达的,我们称之为HTTP/2RFC中的“基本协议单元”。每个框架都有自己的类型,用于不同的目的。HTTP/2作者意识到HTTP1.1无疑会继续存在(毕竟Gopher协议仍在广泛使用)。因此需要将HTTP/2二进制帧请求映射到HTTP1.1请求,以保证其向后兼容。HTTP/2中还有其他新功能无法直接映射到HTTP1.1。服务器推送(也称为“缓存推送”)和流重置是使用二进制帧类型实现的新功能。框架也可以优先排序,允许客户端向服务器提供排序想法,从而优先处理某些资产类别。除了使用Wireshark2.0之外,实际查看单个二进制帧的最佳方法之一是使用GoogleChome中的net-internals选项卡(在地址栏中键入chrome://net-internals/#http2)。大型网页的数据通常难以理解。RebeccaMurphey编写了一个非常有用的工具来在命令行上可视化它。此外,这套用于获取资产的协议也可以在ChromeWebDeveloperTools中显示——右键点击列标题,选择“Protocol”:在GoogleChromeDeveloperTools中显示协议类型。此处列出的所有HTTP/2请求都使用通过传输层安全性(简称TLS)建立的安全连接。目前,所有主流浏览器都强制HTTP/2以安全的形式存在。这种方法有其自身的实际原因:一组称为应用层协议协商(简称ALPN)的TLS扩展允许服务器了解浏览器支持HTTP/2(和其他协议)的能力,从而避免额外的数据往返。这也有助于不理解HTTP/2的服务,例如代理——它们只接收加密传输。通过多路复用减少延迟HTTP1.1中的核心性能挑战之一是延迟级别,或者表示请求和接收响应所需的总时间。典型网页上图像数量的增加以及JavaScript和CSS元素的激增加剧了这个问题。每当获取资产时,它通常需要创建一个新的TCP连接。这个要求主要基于两个原因:每个主机同时打开的TCP连接数受浏览器限制;建立新连接需要一定程度的性能损失。如果物理网络服务器距离用户较远(例如服务器位于新加坡,用户请求源自托管在美国东海岸数据中心的页面),则等待时间将相应增加。这种情况并不少见——根据最近的一份报告,全球70%以上的互联网流量都经过北弗吉尼亚州的数据中心。HTTP1.1为延迟问题提供了几种不同的解决方案,包括隧道和Keep-Alive标头。但是通道传输已经被广泛采用,Keep-Alive头面临着线路拥塞的问题:当前请求必须完全完成才能正确发送下一个请求。在HTTP/2中,单个TCP连接中的多个资产请求可以被多路复用。与使用Keep-Alive头的HTTP1.1请求不同,HTTP/2的每个请求和响应二进制帧是交错的,这意味着行头拥塞将不再存在。建立连接(也称为“三向握手”)的成本仅在每个主机上完成一次。多路复用对于安全连接特别有用,因为传统的多TLS协商方案会带来显着的性能成本。在HTTP/2中,单个主机内的多个资产请求仅使用单个TCP连接。Web性能影响:告别内联、级联和ImageSprites?HTTP/2多路复用对前端Web开发人员具有广泛的影响。它消除了通过捆绑相关资产来减少连接数的几种长期解决方案的需要,包括:JavaScript和CSS文件级联:将多个小文件聚合为一个大文件,从而减少整体请求数。ImageSprites:将多个小图像组合成一个大图像。域碎片:跨多个域拆分对静态资产的请求,从而增加浏览器可以允许的打开的TCP连接总数。内联资产:将资产绑定到HTML文档源,包括base-64编码图像或直接写入
