关于HTTP推送的一些问题

简介:

上周我在斯达哥尔摩住了几天,出席了 HTTP 研讨会,参与了不少吸引人的讨论。其中一次是关于 HTTP 推送及其优缺点、早期实验结果的。

由于早期实验部署结果不那么理想,人们对 HTTP 推送大体持着怀疑态度,不过我想分享下自己更乐观一些的观点。

HTTP 推送能做哪些预加载不能做的事?

从怀疑者那里一再听到的观点是,“推送相对于预加载来说,只不过节省了一次 RTT(Round Trip Time)而已”。在实践中,这并非总是对的,有一个使用案例,推送可以完成,但预加载无法做到。

利用服务器思考时间(think-time)

如今,HTML 响应很少只是单纯的静态资源了。它们通常都是通过数据库获取所需的信息、使用高级语言(可能略微慢一些)动态生成的。虽然后端响应时间确实可以而且应当优化,但几百毫秒的响应时间也并不常见。

有一个常见的建议,“提早 flush” HTML,在查询数据库并构建动态内容的同时,发送 HTML 的首个 chunk 块。但是,并非所有服务端的构架都能这么简单地实现。

另外一个让问题变得困难的因素是,需要开始向浏览器发送数据时,我们尚无法确定响应的构建是否会完全成功。为避免出现响应创建逻辑出错(比如说,数据库错误或者服务端代码运行失败),我们需要在应用逻辑中创建一种“回滚”已发送响应数据的方式,并向用户展示错误信息。

尽管这肯定有可能做得到(甚至是自动化的),但目前还没有一种通用的方式能够作为协议的一部分。

因此一般场景是,Web 服务器等待后端数百毫秒以构建页面,而后开始返回数据。这时候我们就碰到了慢启动(译者注:slow start,可参考此文),所以首次 RTT 只能发送大约 14 KB 数据,第二次 28 KB 左右,如此等等。由此我们知道,将 HTML 发送出去,需要用去服务器思考时间加上慢启动时间。在思考时间期间,浏览器对接下来所需的资源一无所知,故也不会针对接下来所需资源的关键路径发送任何请求。

而且,即使我们试着耍小聪明,针对那些资源添加 preload 报头,若我们不提早 flush 文档开头,那还是没有对思考时间加以利用。

现在,将这个与使用 HTTP 推送能做的事情做个对比。服务器可以利用思考时间来推送相关的关键性资源 —— 尤其是 CSS 和 JS。这样一来,当思考时间结束时,我们极有可能已将所有关键性资源都推送给浏览器了。

还有额外好处,这些资源也预热了 TCP 连接,也提升了拥塞窗口(congestion window),确保思考时间之后的首个 RTT 中,可以使用 28 KB,56 KB,乃至更大的拥塞窗口发送 HTML(这取决于思考时间的长短,以及在此期间我们推送了多少资源)。

一起来看下具体案例:一个 120 KB 的 HTML 页面,关键 CSS 有 24KB,关键 JS 有 74 KB,在 100ms RTT、无限带宽的网络环境下是如何加载的?

没有 HTTP 推送的情况下,生成 HTML 等待了 300ms,接着 4 次 RTT 发送 HTML,因为慢启动的缘故,使用了一个 RTT 请求 JS 和 CSS。在首次渲染之前,时间超过了 800 毫秒。

 无推送情况下的页面加载

使用 HTTP 推送,CSS 和 JS 会在 HTML 请求到达之后尽快推送出去,发送它们需要 3 个 RTT(又一次因为慢启动),它们将拥塞窗口增大至 128 KB 左右,将要发送 HTML 时,一个 RTT 就能可以了。首次渲染总时间: 400 毫秒。

 HTTP 推送情况下的页面加载

首次渲染加速了 50%!也不算很差嘛。。。

HTTP 推送不尽如意的地方

我认为人们在错误地使用 HTTP 推送的原因之一是,他们在某些并不能提供任何好处甚至损害效率的场景下使用它。

盲目推送静态资源

使用 HTTP 推送可能做的错事之一就是告诉你自己,“啊,这些资源是所有页面都需要的,把它们配置成所有页面都推送”。

这很糟糕,原因是缓存。在访问第一个页面之后,这些资源很可能就在用户的浏览器缓存中,然而你却在闷头推送。你可能会争辩说,这可比内联所有这些资源好多了。是这样的,不错,但,我必须反过来告诉你,内联资源也是糟糕的主意。

所以,若你在以这种方式盲目推送资源,请确保它是你想要内联在页面中的唯一的资源,也就是关键的 CSS。否则,你就是在冒险让重复的请求变慢。

你可能会以为,流重置(stream resets)会帮助推送已缓存的资源去避免浪费带宽和时间。你可能错了。很显然,并非所有浏览器会检查缓存并终止已缓存资源的推送。就算它们会这样,在流重置信号到达服务器之前,还是使用了一整个 RTT 时间发送数据。尤其是有多个资源时,这样做将可能带来大量数据浪费。

将内容放入浏览器缓存

你可能以为,推送会将资源放入浏览器缓存,可以用来做一些像使当前资源失效这样的工作。至少目前不是如此。研讨会上的讨论的话题之一就是现实问题,可能我们需要改变当前的推送行为,支持与浏览器缓存直接交互。不过当前,推送还做不到这些。推送响应进入推送缓存,只有真实请求它们时才会放到 HTTP 缓存中。

因此,如果你在推送资源,希望它们在未来的某个页面中使用,那么浏览器有可能在用到它们之前已经将它们扔出推送缓存之外了。

至少目前的实现是这样的。

填补 HTML 下发之后的管道

通常,在页面的下载循环中,使用的带宽之间会存在间隙。这意味着我们没能尽快下发资源,通常这是因为浏览器发现资源的延迟。

尽管我们应当尽量下发页面所需资源以填满这些间隙,但通常使用预加载比推送更好。预加载将缓存、cookie以及内容协商纳入考虑,它不会像推送那样存在着过度发送或错误发送的风险。就填补这些间隙而言,推送并无任何优势,所有的只是劣势。故最好不要使用推送达成此目的,使用预加载吧。

缓存摘要(Cache Digests)

从上面我们可以看到,HTTP 推送的一大缺点就是,服务器并不必然清楚浏览器的缓存状态,因此在推送时我们可能会将已在缓存中存在的资源推送出去。

有一个标准扩展的提案,叫做 Cache Digests。其基本思想是浏览器在 HTTP/2 连接初始化之后,向服务器发送摘要,服务器在下发资源之前能够精确判断资源是否已在浏览器缓存中存在。

该提案尚处于早期,可能需要简化,这样实现起来花费更少,不过我敢说,离开这个特性,HTTP 推送只能算半成品。

总结

HTTP 推送可以用来显著提升加载性能。正确使用时能为首个关键路径加载提速,带来性能指标的改善。

推送依然是非常新的技术,像其他所有新工具一样,在找到使用的最优方式之前,还有很长的路要走。这一路多少会有点痛苦。

是故早期实验的初始结果,可能并非全如我们所希望的那样。让我们把那些结果作为标志,指示我们关于推送的使用需要更多聪明才智吧,别妄下结论说它是无用的特性。


作者:Yoav Weiss

来源:51CTO

相关文章
|
存储 安全 算法
|
Web App开发 安全 网络安全
HTTPS 常见问题解答
百度从 14 年开始对外开放了 https 的访问,并于 3 月初正式对全网用户进行了 https 跳转。 很多用户看到这个新闻都比较好奇,在新闻站点,微博,微信和贴吧,知乎等站点进行了热烈的讨论,这里我们也从一个普通用户容易理解的角度来看看大家的问题。
|
监控 安全 搜索推荐
设置 HTTPS 协议以确保数据传输的安全性
设置 HTTPS 协议以确保数据传输的安全性
|
12月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
354 18
|
网络安全 开发者
如何解决HTTPS协议在WordPress升级后对网站不兼容的问题
以上就是解决WordPress升级后HTTPS协议对网站的不兼容问题的方法。希望能把这个棘手的问题看成是学校的管理问题一样来应对,将复杂的技术问题变得更加有趣和形象,并寻觅出解决问题的方式。希望你的网站能在新的学期得到更好的发展!
309 19
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
1070 20
|
12月前
|
安全 网络协议 算法
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
本文系统探讨了构建企业级双协议隧道代理系统的挑战与实现。首先对比HTTP/HTTPS和SOCKS5协议特性,分析其在工作模型、连接管理和加密方式上的差异。接着提出兼容性架构设计,包括双协议接入层与统一隧道内核,通过协议识别模块和分层设计实现高效转换。关键技术部分深入解析协议转换引擎、连接管理策略及加密传输方案,并从性能优化、安全增强到典型应用场景全面展开。最后指出未来发展趋势将更高效、安全与智能。
567 1
|
网络协议 安全 网络安全
HTTP与HTTPS协议入门
HTTP协议是互联网的基石,HTTPS则是其安全版本。HTTP基于TCP/IP协议,属于应用层协议,不涉及数据包传输细节,主要规定客户端与服务器的通信格式,默认端口为80。
764 25
HTTP与HTTPS协议入门
|
安全 网络安全 数据安全/隐私保护
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
723 3
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
1048 3