SPDY是否可以替代Websockets?

25

首先-我知道 SPDY 和 Websockets 不是同一种东西,你可以像使用HTTP一样在 SPDY 上运行 Websockets。

然而,如果我想提供一个支持服务器推送(双向通信)的 REST 风格 API,我想知道是否可以用 SPDY 代替 Websockets。

我的当前原型使用的是 Websockets(node+socket.io),工作得很好。但是,我的问题是我必须自己想出 JSON 协议来路由请求到和从服务器。我更愿意在请求中使用 REST 风格的 URI 和 Headers,这更适合基于 REST 架构。SPDY 似乎更好地支持这一点.

此外,由于缺少头部信息,我担心 Websockets 在我们的部署网络中不太合适,考虑使用 SPDY 可能更好。

然而,我还没有看到许多关于双向 SPDY 请求的示例,除了将文件推送到浏览器之外。我想向浏览器推送事件和数据,例如:

Content-Type: application/json
{
   "id": "ca823f3e233233",
   "name": "Greg Brady"
}

但我不清楚浏览器/JavaScript如何“监听”和响应这些事件,就像使用WebSocket和socket.io API一样。

3个回答

37

让我们从头开始:为什么你想要在 SPDY 上运行 WebSockets,而不是进行 HTTP 升级呢?如果你将一个 HTTP 连接升级到 WS,则没有其他东西可以使用该 TCP 流 - WS 连接可能为空闲,但连接仍被阻塞。使用 SPDY,您可以在相同的基础 TCP 流上多路复用多个请求/响应和 WebSocket 连接(甚至多个)。实际上,截至 2012 年 7 月,WS 在 SPDY 上仍处于正在进行中的状态,因此您将不得不等待使用 SPDY 进行 WebSockets - 希望等待时间不会太长!

但假设支持已经存在...之所以不清楚如何从 JavaScript 监听 "SPDY Push" ,是因为没有这样的方式!推送的资源进入浏览器缓存 - 不多也不少。如果需要将数据流式传输到您的 JavaScript 回调函数,则 WebSockets 或服务器推送事件 (Server-Sent Events, SSE) 是答案。

那么,把它们全部放在一起:

  • 对于单个小请求,HTTP 添加了很多开销(标头等)
  • WebSockets 为您提供了低开销通道,但需要您自己实现路由
  • SPDY 将大大减少小型 HTTP 请求的开销和成本(胜利)
  • SSE 是将数据推送到客户端的良好简单替代方法(在 SPDY 上工作良好)

您可以使用 SPDY+SSE 来实现您的目标,并且所有通信都可以在同一 TCP 通道上运行。SPDY 请求发送到服务器,SSE 推送从服务器传递。


2
啊,谢谢你的回答 - 我看到我完全没有听说过服务器发送事件。这听起来正是我正在寻找的,我会尝试一下。 - 7zark7
这里有一些有用的信息:http://www.html5rocks.com/en/tutorials/eventsource/basics/ - 7zark7
2
只是为了澄清,WebSockets(IETF 6455)并不在HTTP上运行,它们只是具有与HTTP兼容的初始握手。WebSocket over SPDY提案使用WebSocket的语义和标头字段,但将其转换为SPDY字段。 - kanaka
SPDY通过压缩HTTP头和多路复用等方式来增强HTTP,以提高HTTP请求的性能。其主要目的是提高网页的性能。 - Faisal Naseer
HTTP和WebSocket之间的区别是架构上的,而不是逐步增量的。SPDY是HTTP的修订形式,因此它共享相同的架构风格和语义。它解决了HTTP中许多非固有问题,添加了多路复用、工作流水线等其他有用的增强功能。WebSocket消除了请求-响应式通信,实现了实时交互和替代架构模式。 - Faisal Naseer
显示剩余2条评论

6

首先澄清一些问题:

  • 基础WebSocket协议(IETF 6455)不是建立在HTTP之上。WebSocket连接的初始握手与HTTP兼容,但一旦握手完成,该协议就是一个帧式、双向全双工连接,开销非常低(通常每个帧的头部只有2个字节)。

  • WebSocket over SPDY的想法是一个提案,可能会也可能不会实现。在这种情况下,WebSocket实际上是建立在SPDY之上的。由于WebSocket头字段被映射到SPDY头字段中,因此初始连接/握手可能会更快,但数据帧将具有更多的开销。

SPDY旨在成为HTTP的更高效替代品。WebSocket则是完全不同的东西,它使客户端和服务器之间的双向/全双工消息传递延迟非常低。

如果您对具有简单API的服务器推送感兴趣,并且不需要超低延迟,则可以考虑使用服务器发送事件,其API简单且类似于WebSocket API。或者您可以查看许多优秀的Comet库之一,这些库可以实现服务器推送,但与上述任何解决方案不同,它们将更好地支持旧浏览器。

1
谢谢,我的问题的本质是想了解 SPDY 是否提供了一些固有的双向支持或优势,超过了基于 HTTP 的推送方法。在进一步阅读后,得到的有用解释是 SPDY 推送由浏览器解释,而 websocket 数据由在浏览器中运行的应用程序解释。https://groups.google.com/forum/?fromgroups=#!topic/spdy-dev/FAbyg-fWE5A - 7zark7

0
然而,我对WebSockets的问题在于我必须为路由请求到和从服务器的JSON协议自己构思解决方案。
正是出于这个原因,我编写了一个薄的RPC层覆盖socket.io,将网络调用包装在承诺中。你可以在这里看一下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接