SPDY作为WebSocket的替代品?

SPDY作为WebSocket的替代品?,websocket,spdy,Websocket,Spdy,首先,我知道SPDY和Websockets不是一回事,你可以在SPDY上运行Websockets,就像在HTTP上一样 然而,如果我试图提供一个REST(类似)API,它也支持服务器推送(通过相同连接的双向调用),我想知道SPDY是否是WebSocket的可行替代品 我当前的原型使用websockets(node+socket.io),运行良好。然而,我的websockets问题是,我必须设计自己的JSON协议,用于将请求路由到服务器和从服务器路由到服务器。我更愿意在请求中使用REST样式的UR

首先,我知道SPDY和Websockets不是一回事,你可以在SPDY上运行Websockets,就像在HTTP上一样

然而,如果我试图提供一个REST(类似)API,它也支持服务器推送(通过相同连接的双向调用),我想知道SPDY是否是WebSocket的可行替代品

我当前的原型使用websockets(node+socket.io),运行良好。然而,我的websockets问题是,我必须设计自己的JSON协议,用于将请求路由到服务器和从服务器路由到服务器。我更愿意在请求中使用REST样式的URI和头,这更适合基于REST的体系结构。斯普迪似乎会更好地支持这一点

此外,由于缺少标头,我担心WebSocket无法很好地适应我们的部署网络,我认为SPDY会再次成为更好的选择

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

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

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

让我们从头开始:为什么要在SPDY上运行WebSocket,而不是进行HTTP升级?如果您将HTTP连接升级到WS,那么其他任何东西都不能使用该TCP流—WS连接可以是空闲的,但连接仍然被阻止。使用SPDY,您可以在同一底层TCP流上多路复用多个请求/响应和websocket连接(甚至多个)。从实际情况来看,截至2012年7月,WS-over-SPDY仍在进行中,因此您将不得不等待将SPDY用于WebSocket—希望不会太久

但是让我们假设支持是存在的。。。不清楚如何从JavaScript中监听“SPDY Push”的原因是因为没有办法做到这一点!一个推送的资源进入浏览器缓存——没有更多,也没有更少。如果需要将数据流传输到javascript回调,那么WebSockets或服务器发送事件(SSE)就是答案

因此,把所有这些放在一起:

  • HTTP为单个小请求(标头等)增加了大量开销
  • WebSockets为您提供了一个低开销通道,但要求您实现自己的路由
  • SPDY将显著降低小型HTTP请求(win)的开销和成本
  • SSE是将数据推送到客户机的一个好的、简单的替代方案(目前,它在SPDY上有效)

您可以使用SPDY+SSE来实现您的目标,所有这些通信都可以通过相同的TCP通道运行。SPDY向服务器请求,SSE从服务器推送。

首先需要澄清:

  • 基本WebSocket协议(IETF 6455)未分层到HTTP上。WebSocket连接的初始握手是HTTP兼容的,但一旦握手完成,该协议就是一个有帧的双向全双工连接,开销非常低(通常每帧头只有2个字节)

  • “网索克凌驾于斯普迪之上”的想法是一个可能会或可能不会看到曙光的想法。在本例中,WebSocket实际上是在SPDY上分层的。由于SPDY与HTTP的特性,初始连接/握手可能发生得更快,但是,由于WebSocket头字段映射到SPDY头字段,因此数据帧的开销会更大

SPDY的目标是更有效地替代HTTP。WebSocket是一种完全不同的beast,它支持客户端和服务器之间的低延迟双向/全双工消息传递

如果您感兴趣的是用简单的API推送服务器,而不需要超低的延迟,那么您可以考虑服务器发送的事件,该事件具有与WebSoSAPI API简单且类似的API。或者,您可以研究许多优秀的Comet库中的一个,这些库支持服务器推送,但与上述任何解决方案不同,它将更好地支持旧浏览器

然而,我对websockets的问题是,我必须想出自己的方法 用于将请求路由到服务器和从服务器路由到服务器的JSON协议


正是出于这个原因,我在socket.io上编写了一个精简的RPC层,将网络调用包装在承诺中。你可以看一眼

啊,谢谢你的回答-我看我完全没听说过服务器发送的事件。这听起来正是我想要的,我会尝试一下。这里有一些有用的信息:澄清一下,WebSocket(IETF 6455)不是通过HTTP运行的,它们只是有一个与HTTP兼容的初始握手。WebSocket over SPDY方案使用WebSocket的语义和标题字段,但将其转换为SPDY字段。尽管WebSocket和SSE连接都以HTTP请求开始,但您看到的性能优势和它们的功能可能会有很大不同。例如,SSE无法将流数据从客户端向服务器上游发送,并且只支持文本数据。SPDY通过压缩HTTP头和多路复用等操作增强HTTP以提高HTTP请求的性能。它的主要目的是提高web页面的性能。多谢了,我的问题的根本在于SPDY是否提供了一些内在的双向支持,或者比基于HTTP的推送方法更具优势。进一步阅读后,一个有用的解释是,SPDY push由浏览器解释,而websocket数据由浏览器中运行的应用解释。