让网站和应用更快速、更简洁、更稳健,从而有效提升用户体验,这无疑是众多开发者梦寐以求的。然而互联网发展日新月异,HTTP/1.1 协议已经难以满足现今的需求。在众多 Web 性能提升方案中,HTTP/2 值得尝试。
本书是 HTTP/2 实用指南,介绍了 HTTP/2 的设计初衷和新特性,以及如何才能充分利用这些特性来打造高性能网站及应用。作者用定量分析方法,对比了不同网络环境下及不同浏览器上 HTTP/1.1 与 HTTP/2 的性能差异,并指出了网站迁移到 HTTP/2 需要注意的问题及对策。
本书主要内容:
Stephen Ludin,Akamai 公司 Web 性能部门 CAO,带领 Akamai 公司的 Foundry 团队,负责研发下一代 Web 技术。
Javier Garza,Akamai 公司高级企业架构师,专注于公司的主要客户及战略合作伙伴。他也是 Web 性能优化和 HTTP/2 的布道者,为 Akamai 的产品开发团队提供技术建议和客户反馈。
HTTP/2 已经渗入普通人的生活。如果你平时多个心眼,会发现很多网站已经悄然采用了 HTTP/2,享受了 HTTP/2 带来的诸般好处,甚至在一些技术大会上已经有相关的主题分享。
另一方面,大家对它的了解还相当粗浅。从我主持面试的经历来看,在我认为“应当了解 HTTP/2”的候选人——不管后端还是前端——当中,大部分人还处在“听说过有这么回事”的阶段,只有不到 20% 的候选人能够说出一点实质性的内容。如果继续问“HTTP/2 和 HTTPS 是什么关系”“从 HTTP/1.1 升级到 HTTP/2 有什么要注意的”“HTTP/2 为什么不叫 HTTP/2.0”,能答上来的人就寥寥无几了。
为什么会出现这种情况?我觉得和 HTTP/2 的中文资料匮乏有关。
纵观近年来的中文技术图书市场,无论是涉及的领域,还是作品的质量,都有明显的进步,众星捧月追求英文原版的情况已经是过去时。这对广大技术从业者来说,无疑是好事。但是另一方面,这种情况也间接造成了中英文技术资料的割裂:没有中文图书,大家最多看看网上的文章,没有那么多人愿意去研读英文图书了。关于 HTTP/2,到目前为止,还没有看到过任何中文图书。
难道是因为 HTTP/2 不重要吗?答案显然是否定的。
我最早进入互联网行业时,仅仅满足于“写好程序在网上能跑就行”。随着工作经历的丰富,我越来越深刻地意识到,只要你在这个行业从事技术,无论是前端还是后端,网络相关的基础知识这一课终究是躲不过去的。无论是服务器端要面对的大负载和高并发,还是客户端要面对的有限计算资源和弱网通信环境,最后都离不开对网络的深入理解。
对 TCP/IP 的了解越深,我们往往越会感叹其层次设计的巧妙。各种新出现的优化并不会破坏原有的体系结构。但是,对 HTTP 的了解越深,我们往往越会感叹它的过时——Web 的发展太迅猛了,相比之下,定稿于 1999 年的 HTTP/1.1 时常让人以为是“上古卷轴”。所以,大家才会想出各种“优化黑魔法”来避开 HTTP/1.1 的各种限制和缺陷。域名拆分、资源域名分离、精灵图(用 CSS 选择大拼图中的小区域)等,都是如此。
不幸的是,这些“高招”往往并非标准统一的解决方案,所以并不能直接放心享用。和 CDN 厂商打过交道就会知道,网络设备成千上万,规范的实现程度也参差不齐,由此产生形形色色的问题,简直让人不胜其烦。再加上各种“优化黑魔法”,只会让本来杂乱的网络世界变得更加混沌。除非自己技术实力足够强,否则只能望洋兴叹。
有没有造福大家的统一的解决办法? Google 先揭竿而起,发明制订了 SPDY 规范。继而大家才发现,原来所有人都在翘首期盼新的 HTTP 协议。于是,顺理成章地,HTTP/2 诞生了。虽然制订过程是漫长而痛苦的,但首部压缩、分帧传输、服务端推送等新特性,直击 HTTP/1.1 这种“古董协议”的痛点,让广大开发者大呼过瘾,迫不及待想要投入 HTTP/2 的怀抱。
然而,天下没有免费的午餐。要想享受 HTTP/2 带来的诸般好处,“简单升级”协议是行不通的。没错,HTTP/1.1 显得简单直白,相当一部分的开发人员甚至把它理解为一问一答的简单通信模型(和编程语言中的方法调用一样),也不妨碍自己的开发。可惜,HTTP/2 不能这么玩。首部压缩等应用层特性或许还很好懂,但是,新出现的帧传输层绝对要花一番功夫才能理解。不理解这些新特性背后的原理,许多时候就没法调试;不能调试,很多问题就束手无策;束手无策,就无法享受新技术带来的诸般好处。
所幸,《HTTP/2 基础教程》中文版面世了。在我看来,这本书相当适合作为广大开发人员了解 HTTP/2 的资料,大家也确实需要这样一本书,理由如下。
第一,它的范围足够广,HTTP/2 中有价值的新特性基本都有覆盖,不是就概念而概念,而是会讲解各种新特性适合哪些场景以及不适合哪些场景。比如,如果你的网站大量引用第三方资源,那么域名拆分能带来的获益就相当小。
第二,它的编排很用心,不是单纯罗列 HTTP/2 的好处,而是通过与 HTTP/1.1 的对比加以讲解,更有一章专门讲解从 HTTP/1.1 升级到 HTTP/2 的一般过程,以前做的优化哪些必须变更、哪些可以保留,翔实可靠。比如,精灵图这种优化手段依然有助于提升响应速度,但会丧失缓存的便利性。
第三,它不是简单通过定性分析来论证 HTTP/2 的好处,而是大量使用了定量分析的方法。 HTTP/2 比 HTTP/1.1 要好,到底好多少,提升的幅度会受哪些因素的影响?书中对这类问题都给出了严谨详细的分析。我读了这本书才知道,光在光纤中的传输速度只有真空中的 2/3。
第四,作为一本优秀的技术图书,其中的分析和思考会让读者在今后的工作中获益更多。本书不仅告诉读者 HTTP/2 的首部压缩采用的是 HPACK 算法,还讲解了为什么采用 HPACK 而不是沿用 SPDY 的 gzip 算法。我相信,如果了解了 CRIME 漏洞的原理,我们在今后的工作中会有更多样的思考角度,以及更完善的安全意识。
《HTTP/2 基础教程》的两位译者罗正龙、郑维智都是沪江优秀的前端开发工程师,本身就对 HTTP 协议有丰富的开发经验,对工作也有高度的责任感,在繁忙的工作之余迅速完成了这本书的翻译。我在审校过程中,经常发现他们就书中的具体问题展开细致的讨论——因为不满足于“翻译文本”,更注重理解和思考背后的原理,所以发现了原书的若干错漏,也确定了很多符合中文开发者习惯的更容易理解的表达方式。我敢说,在今天的中文技术图书译者里,有这样认真精神的人,不超过十分之一。有这样的精神为支撑,图书的翻译质量是有保证的。
写完这篇文章的时候,我再次确认了一番,目前中文技术图书里确实还没有任何一本 HTTP/2 的专著。如果没有估计错误,《HTTP/2 基础教程》中文版的出版只会落后英文原版半年左右,不出意外的话,它应当算中文世界里第一本 HTTP/2 的专著了。我相信,它的质量不会辜负“第一”的名次。
大仲马说过,人类的一切智慧都包含在两个词里——等待与希望。你是不是深深被 HTTP/1.1 所困扰,面对 HTTP/2 又有困惑?那好,现在《HTTP/2 基础教程》终于和读者见面了,让我们共同期待 HTTP/2 的美好未来吧。
——余晟,技术图书翻译写作爱好者,现任沪江教育集团技术中心研发总监
如果有一种远程通信协议堪称“万能协议”的话,那一定非 HTTP 莫属。除了那些对于性能和实时性要求极高的通信场合之外,几乎所有的远程通信都可以基于 HTTP 来实现。 Web(全称 World Wide Web)的四大技术基石是 URI、HTML、HTTP 和 MIME,正是这四大基石支撑了宏伟的 Web 神殿。在这四大基石之中,HTTP 的重要性最为突出。今天有很多移动 Web 应用并没有使用 URI、HTML、MIME,只用了 HTTP,仍然可以称为“Web 应用”。从这个角度看,HTTP 几乎是 Web 的代名词。
HTTP 的上一个正式版本是 1.1 版,主设计师是 Roy T. Fielding 博士。HTTP/1.1 与 HTTP/1.0 相比,无论是设计思想还是技术细节方面都取得了巨大的进步。在设计思想方面,Fielding 系统化地提出了 REST 架构风格的理论,以 REST 理论指导 HTTP/1.1 的设计。在 HTTP/1.1 中引入了“资源”这个极为重要的抽象概念,将 HTTP 从一种面向文档的协议彻底转变为一种面向资源的协议。资源是一种非常强大的抽象工具,在 HTTP/1.1 发布之后,Web 之上不再只有大量具体、静态的“文档”,而是包括了无数抽象、动态的“资源”。从对 Web 的概念理解上看,这是一次革命性的转变,推动了 Web 应用的数量以几何级数速度爆发,Web 的范围扩展到了地球上有人类生存的所有地方。可以说,不理解“资源”和相关的“资源表述”,就不理解 HTTP/1.1,对 Web 的理解其实还没有入门。在技术细节方面,HTTP/1.1 也增加了很多新的内容,例如:HTTP 连接支持 keepalive、增加 CONNECT 方法来支持 HTTP tunnel,等等。
这里再强调一下 REST。REST 是 Web 自身的架构风格,也是 Web 取得巨大成功的技术层面的深层原因,理解 REST 就是理解 Web 技术架构的钥匙。前面提到的“资源”及“资源表述”只是 REST 理论之中入门级的概念,REST 还有很多其他重要的概念,例如对于超媒体的有力支持等。建议对 REST 非常感兴趣的读者去读一下 Fielding 的博士论文中文版《架构风格与基于网络应用软件的架构设计》。REST 理论有力地指导了 HTTP/1.1 的设计,也确保了后续 HTTP 协议沿着正确的方向发展,包括从旧版本到新版本的平滑升级。
尽管 HTTP/1.1 取得了辉煌的成就,但 HTTP/1.1 从 1998 年底发布之后,已经十几年都没有更新了,它的很多方面已经难以跟上时代发展的要求。特别是移动互联网普及之后, HTTP/1.1 在性能方面的瓶颈越来越突出,以至于有些公司研发出五花八门的私有二进制 RPC 协议来解决性能问题。这些应用连 HTTP 都不用了,还自称是“Web 应用”,这实在是挂羊头卖狗肉。改进 HTTP 以便跟上新时代 Web 发展的需要,已经迫在眉睫。经过各方参与者几年的不懈努力之后,HTTP/2 终于在 2015 年正式发布了。HTTP/2 是一次非常棒的升级,它在继续遵循 REST 架构风格的前提下,在性能方面取得了巨大的提升。
目前距离 HTTP/2 正式发布已经过去了两年时间,主流的 Web 服务器、浏览器、HTTP 客户端工具、开发库(例如最新的 JDK9)已经能够很好地支持 HTTP/2。可以预见,无论是国内还是国外,2018 年都会是 HTTP/2 迅速普及的一年。国内有很多从事 Web 开发、测试、运维的工程师对 HTTP/2 非常感兴趣,但是苦于缺乏详细的图书文档,难以开展学习。《HTTP/2 基础教程》正是这个领域的最佳图书。这本书虽然不厚,但是满满的都是干货,实战性非常棒。感谢本书的译者罗正龙、郑维智,审校者余晟的辛勤工作,在短时间内将这本高质量的图书贡献给中国的读者。正如本文开头所说的,HTTP 的重要性再怎么强调也不为过。《HTTP/2 基础教程》这本书值得所有软件开发者拥有,作为自己的案头常备图书。
——李锟,Web 架构师,Web 开发老兵
截至 2009 年,HTTP/1.1 面世已经超过 10 年了,并且无可争议的是,它依然是互联网上最受欢迎的应用层协议。这是因为它不仅用来浏览网页,还是很多其他东西的参考协议。它上手简单、实现容易,并被广大的开发者和运维工程师所理解,因此积累了很多优势,成为了无可替代的协议。一些人甚至开始说,HTTP 形成了互联网架构经典沙漏模型的“第二腰”。
尽管如此,HTTP 还是与时代脱节了。Web 如今已经发生了翻天覆地的变化,它的需求给 HTTP 协议造成了巨大的压力。现在,加载一个网页通常包含好几百个请求,总体开销在拖慢 Web。这就催生了一个新的行业,专治 Web 性能问题——Web 性能优化。
HTTP 社区很清楚这些问题,但是并没有授权大家修复它们。过往的努力,如 HTTP-NG,已经失败了。没有来自 Web 浏览器和服务器的强力支持的提案就动手的做法,看起来并不妙。这反映在 HTTP 工作组当时的纲领中,它说:
工作组不得制定 HTTP 的新版本,也不得给 HTTP 添加新功能。
相反,我们的使命是阐述清楚 HTTP 的规范,并且(至少对我而言)重建一个 HTTP 实现者的强大社区。
也就是说,还有人想实现 HTTP 语义的更高效表达,像 Roy Fielding 的 WAKA 提案 {1[https://tools.ietf.org/agenda/83/slides/slides-83-httpbis-5.pdf]}(很不幸,从未完成)和基于 SCTP{2[https://tools.ietf.org/html/draft-natarajan-http-over-sctp-00]} 的 HTTP(主要在特拉华大学)。
去 Google 做了一次有关上面这些话题的分享后,我收到了 Mike Belshe 留给我的一张便条,问我们是否可以碰个面。我们在 Mountain View 的 Castro 大街上吃了晚饭,他说 Google 正要发布 SPDY,替代 HTTP 协议。
SPDY 之所以不同,是因为 Mike 为 Chrome 浏览器工作,他和为 GFE(Google 的前端 Web 服务器)工作的 Roberto Peon 是搭档。他们控制着连接的两端,因而可以快速迭代,并且他们可以在 Google 的超大流量上测试新的协议,因此能够在大规模场景下验证协议的设计。
整个晚饭时间我都感到发自内心的高兴。他们在解决实际问题,并且已经测试过代码和数据。这些正是互联网工程任务组(IETF)所推崇的。
然而,直到 2012 年,SPDY 才开始流行开来。Firefox 实现了该协议,然后是 Nginx 服务器,接着是 Akamai。Netcraft 报告说,支持 SPDY 协议的网站数据激增。
显然,新版本的 HTTP 协议引起了广泛的关注。
2012 年 10 月,HTTP 工作组被授权发布 HTTP/2,使用 SPDY 作为起点。之后的两年间,来自各个公司和开源项目的代表在各地碰面讨论这个新的协议,解决其中的问题,并确保彼此的实现能互相兼容。
在这个过程中,我们有过意见不一致的时候,甚至也有过激烈的争辩。但是,每个人所表现出的专业能力、合作意愿和强烈信念仍然让我印象深刻。这真是一支了不起的、让人愿意共事的团队。
举个例子,有时候大家一致认为,取得进展比为某人的观点争论一整天更重要,所以我们掷硬币来做决定。有些人可能觉得这很疯狂,但我觉得这反映出了成熟的态度和深邃的洞察力。
2014 年 12 月,在规定的截止日期 16 天后(这对标准制定的工作来讲,已经很早了),我们向国际互联网工程指导委员会(IESG)提交了 HTTP/2,申请批准。
大家都说,实践才能出真知;对互联网工程任务组来说,可运行的代码才能说明一切。我们很快就有了拿得出手的东西,并得到了所有主流浏览器、多数 Web 服务器、CDN 和其他工具的支持。
HTTP/2 并不是完美的,但完美向来也不是我们的目标。我们的现实目标是化乱为治,并逐渐提升 Web 性能;远景目标则是为确保可以发布新版本的 HTTP 做好准备,这样 Web 才不会受制于一份过时的协议。
从这个角度来看,我们已经成功了。当然,我们要做的还有很多。
——Mark Nottingham
Mark Nottingham 在 HTTP 工作组已经 10 多年了。对本书来说尤其有意义的是,当 HTTP/2 完成的时候,他担任工作组主席。他现在是工作组负责 QUIC 的主席,也曾是 Akamai Foundry 团队的一员。
HTTP/2,简称 h2,是万维网(World Wide Web)所使用的 HTTP 网络协议的一个重大修订版本,其目的是提升加载 Web 内容时的感知性能。
自从 1999 年 HTTP/1.1(h1)通过以来,Web 发生了翻天覆地的变化。最早大小只有几千字节、包含资源只有个位数、主要基于文本的网页,如今已发展为平均大小超过 2MB{1[http://httparchive.org/trends.php?s=Top1000&minlabel=Oct+15+2015&maxlabel=Oct+1+2016]}、包含资源数平均为 140 的富媒体网站。然而,用来传输 Web 内容的 HTTP 协议这些年并没有什么变化。于是一个新的工种出现了:Web 性能专家,他们精于发掘变通办法,在原有协议上提升网页加载速度。大家对性能的期望也改变了——在 20 世纪 90 年代后期,大家愿意为一个页面等上 7 秒,而技术和市场调研公司 Forrester Research 在 2009 年的一项研究中发现,在线购物者期望单个页面能在 2 秒内完成加载,其中很大一部分用户会放弃加载时间超过 3 秒的页面。近期 Google 的一项研究表明,甚至 400 毫秒(一眨眼的时间)的延迟,都可能降低人们的搜索意愿。
这就是 h2 诞生的原因——该协议可以更好地适应如今的复杂页面,同时又不牺牲速度。 HTTP/2 的应用在不断增多,因为越来越多的网站管理员意识到,他们可以借此花很小的成本来提高他们网站的感知性能。
我们每天都在使用 h2——它支撑了若干最流行的网站,如 Facebook、Twitter、Google 和 Wikipedia——但很多人并不了解它。我们的目标是讲解 h2 的原理及其性能优势,这样你就可以充分利用它。
不管你在工作中扮演什么角色,只要你的工作涉及网站生命周期的任意部分,本书就会对你有所帮助。本书的目标读者是网站开发和运维人员,以及那些正考虑要实现 h2 或者希望了解 h2 如何工作的人。
阅读本书要求你熟悉 Web 浏览器、Web 服务器、网站和 HTTP 协议的基础知识。
本书的目标是讲解 h2,并帮你充分利用新版的 HTTP 协议。本书不是一份针对所有 h2 客户端、服务器、调试工具、性能基准测试的全面指南。本书虽然是为不太熟悉 HTTP/2 的人而准备的,但专家没准儿也会觉得这是份称手的资源。
你可以浏览本书在 O'Reilly 网站上的页面(http://shop.oreilly.com/product/0636920052326.do)获取更多信息。此外,我还推荐以下这些书。
本书使用了下列排版约定。
黑体
表示新术语或重点强调的内容。
等宽字体(constant width)
表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
加粗等宽字体(constant width bold
)
表示应该由用户输入的命令或其他文本。
等宽斜体(constant width italic
)
表示应该由用户输入的值或根据上下文确定的值替换的文本。
补充材料(代码示例、练习等)可以从 https://github.com/oreillymedia/learning-http2 下载。
本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无需联系我们获得许可。比如,用本书的几个代码片段写一个程序就无需获得许可,销售或分发 O'Reilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。
我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和 ISBN。比如:“Learning HTTP/2 by Stephen Ludin and Javier Garza (O'Reilly). Copyright 2017 Stephen Ludin and Javier Garza, 978-1-491-96244-2.”
如果你觉得自己对示例代码的用法超出了上述许可的范围,欢迎你通过 [email protected] 与我们联系。
Safari(前身为 Safari Books Online)是为企业、政府、教育机构和个人提供的会员制的培训和参考平台。
会员可以观看和收听来自 250 多家出版商的上千种图书、培训视频、学习路径、互动教程和推荐歌单。这些出版商包括 O'Reilly Media、Harvard Business Review、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology,等等。
欲知更多信息,请访问 https://www.safaribooksonline.com/。
请把对本书的评价和问题发给出版社。美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街 2 号成铭大厦 C 座 807 室(100035)
奥莱利技术咨询(北京)有限公司
O'Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:http://shop.oreilly.com/product/0636920052326.do。
对于本书的评论和技术性问题,请发送电子邮件到:[email protected]。
要了解更多 O'Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:
http://www.oreilly.com。
我们在 Facebook 的地址如下:http://facebook.com/oreilly。
请关注我们的 Twitter 动态:http://twitter.com/oreillymedia。
我们的 YouTube 视频地址如下:http://www.youtube.com/oreillymedia。
我们要感谢 Akamai 的 h2 核心团队和 Moritz Steiner(Akamai 的研究员,也是 Foundry 团队的一员,与 Stephen 共同撰写了几篇有关 h2 的论文);Pierre Lermant(感谢他的幽默和对细节的关注,也感谢他审阅本书并贡献了部分内容);Martin Flack(也是 Akamai Foundry 团队的一员,时常会提出颇具启发意义的 Lisp 实现);Jeff Zitomer(感谢他的支持、鼓励,以及富有感染力的微笑);Mark Nottinghan(感谢他对 h2 协议的贡献);Pat Meenan(感谢他为 Webpagetest.org 做出的数不清的贡献,这可能是测试 Web 性能最棒的免费工具了);Andy Davies(本书中广泛使用的工具 WebPagetest Bulk Tester 就是他开发的)。
感谢本书的编辑 Brian Anderson、Virginia Wilson 和 Dawn Schanafelt,有了他们,一切才变得简单。还要感谢为本书提供反馈和意见的每一位 h2 专家:Ilya Grigorik、Patrick McManus、Daniel Stenberg、Ragnar Lonn、Colin Bendell、Mark Nottingham、Hooman Beheshti、Rob Trace、Tim Kadlec 以及 Pat Meenan。
首先,我要感谢妻子 Tina 的支持、鼓励和理解。感谢我的孩子们(Keona、Diego 和 Lani),在我花费无数个夜晚和周末以及大段的暑假时间写作本书的时候,他们一如既往地爱着我。感谢我的经理 Aditi 和 Austin,在工作非常紧张的情况下,依然鼓励我写作本书。
我最想感谢的是身边人的耐心。我家人的耐心——感谢 Sarah、Tomas 和 Liam 容忍我以及令人抓狂的出版过程。在写作过程中,他们的支持是无价的。感谢我的雇主 Akamai 允许我在工作非常忙的时候写这本书。感谢 O'Reilly 工作人员的耐心,他们非常理解 O'Reilly 作者平日里的工作已经非常繁忙,只能利用零散的碎片时间来写作。最后,感谢我父母的耐心,他们的付出我无以为报,唯有珍惜当下——在我 9 岁的时候,父亲带回家一台 Atari 800,那时他是否知道,这使我从此走上了一条路,并且如今依然奋力前行。
扫描如下二维码,即可购买本书电子版。
阅读全文: http://gitbook.cn/gitchat/geekbook/5c0e2207edba1b6834591eeb