HTTP 2 将支持服务器推送,这是啥意思?

Posted

技术标签:

【中文标题】HTTP 2 将支持服务器推送,这是啥意思?【英文标题】:HTTP 2 will support server push, what does this mean?HTTP 2 将支持服务器推送,这是什么意思? 【发布时间】:2013-01-14 08:15:00 【问题描述】:

我已经阅读了很多关于HTTP 2(仍在开发中)的内容,所以我也听说过服务器推送功能,但我的脑袋,这还不清楚。

此服务器推送功能是否意味着服务器将能够向客户端发送响应而无需客户端发出请求?就像普通的 TCP 连接一样?还是我没抓住重点?

【问题讨论】:

接受的答案是错误的。 a) HTTP/1.1 在配置的时间间隔内保持连接打开。 b) HTTP/2.0 确实允许服务器推送到连接的客户端(没有客户端发出请求)。这要归功于 HTTP 2.0 中的“流” @jgauffin 你能添加一些参考资料吗?为什么评论问题而不是您认为错误的答案?你也可以随意给减分。 @Epoc 如果您想使用 HTTP 推送,可以使用 SSE。您不需要 HTTP2,SSE 也适用于 HTTP1.1。据我所知,HTTP2 推送的作用与多部分消息非常相似。您可以在一个包中发送多个文件作为响应。 【参考方案1】:

HTTP2 推送机制不是像 websocket 或服务器发送事件那样的通用服务器推送机制。

它专为 HTTP 会话的特定优化而设计。具体来说,当客户端请求资源(例如 index.html)时,服务器可以猜测它接下来会请求一堆相关资源(例如,theme.css、jquery.js、logo.png 等)通常,一个网页可以有 10 个这样的关联请求。

使用 HTTP/1.1,服务器必须等到客户端实际发送对这些关联资源的请求,然后客户端受到连接的限制,一次只能请求大约 6 个。因此,在实际发送网页所需的所有相关资源之前,可能需要多次往返。

使用 HTTP/2,服务器可以发送对 index.html GET 推送承诺的响应,告诉客户端它也将发送 theme.css、jquery.js、logo.png 等,就好像客户要求他们。然后,客户端可以取消这些推送,或者只是等待它们被发送,而不会产生多次往返的额外延迟。

这是一个使用 SPDY(HTTP2 的基础)和 Jetty https://www.youtube.com/watch?v=4Ai_rrhM8gA 进行推送的演示。这是一篇关于jetty中HTTP2和SPDY推送API的博客:https://webtide.com/http2-push-with-experimental-servlet-api/

【讨论】:

AFAIK HTTP2 不能预测发送给客户端的内容,因为它是一种传输协议。针对多个文件请求发送多个文件的作用。 由应用程序决定要推送哪些文件。在 Jetty 中,我们提供了一个过滤器,它使用引用标头来学习资源之间的关系,但是像 JSF 这样的框架可能已经知道关系,因此可能能够推送关联的资源。 这是一篇关于 HTTP/2 新特性的易于理解的文章:mnot.net/blog/2014/01/30/http2_expectations AFAIK 推送承诺正在原始响应的 HTTP 标头中发送。这些是特殊的标头,然后被客户端删除,这意味着从 javascript 的角度来看它们是不可见的。这种机制与 HTTP/2 引入的多路复用配合得很好,可以同时发送资源以充分利用可用带宽。【参考方案2】:

基本上你的理解是正确的,但是还有很多。

只有在请求 HTTP 页面并且该页面正确呈现所需的资源(即图像、JavaScript 文件、CSS 等)后,服务器才能向客户端发送资源确定。负责此的机制是服务器端框架。在 Java 中,这将是 Servlet 4 并且可能是 JSF。

服务器不能随意发送任何资源给客户端。只有在上述情况下才会发生,并且客户端总是能够拒绝服务器请求推送资源。

HTTP/2 服务器推送的机制设计得非常好,为了掌握它,我推荐这个overview of HTTP/2,这篇深入探讨HTTP/2 protocol 内部的文章。

【讨论】:

以上是关于HTTP 2 将支持服务器推送,这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Gmail API 推送通知速率限制究竟是啥意思?

nginx HTTP/2 模块是不是支持服务器推送?

Wse这个是啥意思

如何让我的用 Golang 编写的 Web 服务器支持 HTTP/2 服务器推送?

使用 GCM 发送推送消息时,错误代码“notRegistered”是啥意思?

谁能解释一下nginx反向代理是啥意思?