写点什么

Google 性能工程师 Ilya Grigorik 谈 HTTP/2

  • 2014-11-12
  • 本文字数:1701 字

    阅读完需:约 6 分钟

HTTP/2,也就是超文本传输协议第 2 版,是下一代 HTTP 协议。该版本是自 1999 年 HTML 1.1 发布后的首个更新,目前它正由互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis (httpbis) 工作小组进行开发。

对于 HTTP/2,来自于 Google 的性能工程师 Ilya Grigorik最近发布了一个 PPT 对此进行了详细的说明。在该呈现中,Ilya Grigorik 首先提到了一组数据:目前平均每个 Web 页面大约会访问 12 个不同的主机,包含 78 个不同的请求,传输 1232KB 的数据,导致一个页面的渲染时间通常会在 2.6s 至 5.6s 之间。而在渲染占用的整个时间里面,网络大约占 69.5%,JavaScript 占 6.6%,布局占 5.1%,绘制占 4.5%,因此网络传输的效率对整体性能有明显的影响。

Ilya Grigorik 认为 HTTP/1.1 在性能方面有明显的缺陷,主要体现在以下几个方面:

a) 并行能力有限

  • 每一个源最大只支持 6 个请求
  • 管道在实际使用时不起作用
  • 竞争性的 TCP 流,强制快速重传(Spurious retransmissions)
  • 额外的握手、内存缓冲等

b) 客户端请求队列

  • 队首阻塞
  • 延迟的请求分发

c) 较高的协议负载

  • 头信息和 Cookies 大约要 800 字节
  • HTTP 元数据没有压缩

另外,HTTP/1.1 只允许由客户端主动发起请求,服务端只能等待客户端发送请求,这对于满足预加载的现状是一种桎梏。

针对这些问题,虽然我们可以通过一些变通的方法进行处理,但是这不可避免的会引发另外的问题。例如,针对请求数的限制我们可以把多个小文件打包到一个大文件中,但是由于并不是每一个页面都需要所有的小文件,所以这样做会造成带宽的浪费。那么 HTTP/2 是否能够帮助我们解决这些问题呢?它都包含哪些内容呢?

实际上 HTTP/2 是为了在万维网上进行低延迟的数据传输而设计的一个协议,它提供了 HTTP 语义的传输优化,支持 HTTP/1.1 的所有核心特征,并且在其他方面做的更高效。在 HTTP/2 中,基本的协议单位是帧,每个帧都有不同的类型和用途。例如,报头 (HEADERS) 和数据 (DATA) 帧组成了基本的 HTTP 请求和响应;其他帧,例如设置 (SETTINGS) 和推送承诺 (PUSH_PROMISE) 则用来实现 HTTP/2 的其他功能。

HTTP/2 基于 SPDY 协议,充分解决了 TCP 连接的限制。它允许多个并发 HTTP 请求共用一个 TCP 会话,而不是为每个请求单独开放连接,这样只需建立一个 TCP 连接就可以传送网页上所有资源,不仅可以减少消息交互往返的时间还可以避免创建新连接造成的延迟,使得 TCP 的效率更高。

针对只能由客户端发起请求的问题,HTTP/2 添加了一种新的交互模式,即服务器能够通过复用一个以 PUSH_PROMISE 帧发送的请求来实现推送。而对于数据冗余问题,在 HTTP/2 中帧包含的 HTTP 报头字段是压缩的,同时它还舍弃掉了不必要的头信息,因此能显著地减少请求和响应的大小。

如果你想了解与 HTTP/2 相关的更多信息,可以查看百度阅读提供的HTTP/2 中文版

对于Ilya Grigorik 所分享的内容 Hacker News 社区上也有一些人发表了自己的看法, byuu 认为:

首先 Firefox 以及一些其他的浏览器只能在 TLS 上使用 HTTP/2 ,这对很多人而言是一种阻碍。虽然加密非常好,但是 SSL 证书可能需要一定的成本以及额外的 CPU 资源。其次,使用一种新的、自定义的压缩算法对头信息进行处理并不一定合适,因为如果头信息只有 300 字节的数据,那么压缩数据所带来的带宽收益并不一定会比它所消耗的 CPU 成本高,况且这样还增加了程序的复杂性。最后,byuu 认为新协议可能会改变我们既有 Web 网站的工作方式,如果优化做的不好,那么性能可能会比 HTTP/1.1 更糟,同时兼容性也会阻碍大家对 HTTP/2 的采纳。

kator 则从另一个角度发表了自己的看法:

“我并不怀疑这里有大量可提升的空间,很明显 HTTP/2 有很多内容来自于 SPDY 以及其他的一些项目。我担心的是我们现在正在做的事情对那些可以将所有内容塞到一个流中的大公司而言有巨大好处,而对于小公司而言则更多的是劣势。另外,作为一个老家伙,我担心人们会丢失与这些服务对话,或者以文本的方式查看对话的能力。”


感谢崔康对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-11-12 00:386413
用户头像

发布了 321 篇内容, 共 130.4 次阅读, 收获喜欢 19 次。

关注

评论 1 条评论

发布
用户头像
Ilya Grigorik
2023-12-24 01:25 · 上海
回复
没有更多了
发现更多内容

在Gitlab-ce的Docker中使用自定义端口

天飞

Docker gitlab

看得懂的区块链及智能合约概念

石君

区块链 智能合约

《零基础学 Java》 FAQ 之 9-Java里的各种数据类型占用多少内存空间

臧萌

Java

你的c++团队还在禁用异常处理吗?

泰伦卢

c c++ C#

中小型城市商业银行数字化转型实践(二)集成关系ESB APIGateway ServiceMesh

泡菜小仙

架构设计 集成架构 ESB

中小型城市商业银行数字化转型实践(三)数据中台建设思路和路径

泡菜小仙

数据中台 数字化转型 数据架构

生活就是这么讽刺,有时候你嘲笑他,有时候你想成为他......

代码诗人

中年危机 文艺 短片小说

520 我用算法帮女朋友的闺蜜选男友

cherubines

Python 算法 数据分析 蒙特卡洛 最优解

看完这篇 HTTPS,和面试官扯皮就没问题了

苹果看辽宁体育

https

Android | Tangram动态页面之路(四)vlayout原理

哈利迪

android

奇怪知识点系列:Office 365 CDN 揭秘

手艺人杨柳

Office 365 Microsoft 365 SharePoint Online

2020年5月19日 Java并发编程专题

瑞克与莫迪

Java

Kubernetes时代的云容器平台:各家云产品模式逐渐丰富

韩超

腾讯云 阿里云 Kubernetes IaaS PaaS

比特币是新生事物吗?

Haiyung

比特币

实现一个比LongAdder更高性能的计数器有多难?

捉虫大师

Java jdk LongAdder

「Postman教程 」接口测试-2

Megatron7

测试 Postman

Oracle 数据恢复一例

wong

oracle windows dbf

我的读书笔记-樊登读书法

lmymirror

学习 读书笔记 方法论 读书方式

如何设计一款“高可用高性能”的发号器?

捉虫大师

Java 高可用 发号器 高性能 raft

从Deepl说起,聊一聊未来的“安全职业”

孤岛旭日

程序员 AI 职业

SQL 生成斐波那契数列

zero

sql 斐波那契 MySQ

程序员的晚餐 | 5 月 19 日 蒜香鸡腿,味道令人惊讶

清远

美食

linux文件系统-inode学习整理

戈坞昂

Linux inode

回“疫”录(21):你这样做的样子真丑

小天同学

疫情 心理 回忆录 现实纪录 纪实

MacOS 下使用VSCode进行GoLang Test报错

北纬32°

macos vscode Unit Test debug Go 语言

部门最漂亮的妹子离职了

Geek_6rptuk

团队管理 生涯规划 企业文化 职场

谁能让你安稳

Neco.W

工作 稳定性 努力工作

「Postman教程 」功能介绍-1

Megatron7

测试 Postman

关于键盘的一些事

BabyKing

vim 缓存 键盘 快捷键 karabiner

中小型城市商业银行数字化转型实践(一)整体技术架构转型(双态IT)

泡菜小仙

数字化转型 架构设计 技术架构

MyBatis支持的jdbcType 枚举类型

Kevin Liao

Google性能工程师Ilya Grigorik谈HTTP/2_语言 & 开发_孙镜涛_InfoQ精选文章