As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




已关闭8年。




BOSH是...



听起来像WebSockets和HTTP长轮询,不同之处在于它使用两个开放的HTTP连接而不是一个,并且不扩展HTTP协议(protocol)。

两种协议(protocol)之间有什么区别,哪种用例更喜欢WebSockets而不是BOSH?

最佳答案

首先让我解决WebSockets准备就绪:

默认情况下,Chrome,Safari和iOS(iPhone和iPad)中已交付并启用了Hixie-76协议(protocol)的WebSockets实现。还随附了Hixie-76协议(protocol),但默认情况下在Firefox 4和Opera 11中禁用了该协议(protocol)。web-socket-js项目是Flash填充程序/ polyfill,可向使用Flash的任何浏览器添加WebSocket(Hixie-76)支持。

换句话说,WebSockets几乎可用于几乎所有浏览器。

Opera和Mozilla选择默认禁用该协议(protocol)的原因是由于理论上的担忧,即使用协议(protocol)的Hixie版本可能会破坏/破坏某些HTTP代理/中介。同样的问题也适用于Flash,但是Mozilla和Opera对其发布的代码负有更高的责任。该协议(protocol)的HyBi版本(该协议(protocol)已移至IETF HyBi工作组)解决了安全问题。

Mozilla,Opera,Google和Microsoft都在研究HyBi协议(protocol)的实现(尽管Microsoft暂时将其保留为separate download)。有一个Hyt-07支持的branch of web-socket-js

更新:自2013年2月起,Chrome 14,Firefox 7,IE10,Opera 12.1,Safari 6.0和HyBi/IETF RFC 6455 spec Flash填充程序/ polyfill支持最新的web-socket-js。在移动设备上,iOS 6.0上的Safari,Opera Mobile 12.1,Android的Chrome 14,Android的Firefox 7和Blackberry 7均支持IETF6455。原始的默认Android浏览器不支持WebSocket。

WebSocket服务器易于实现。有许多独立和插件实现,其中大多数都支持Hixie-76和HyBi协议(protocol)版本:

  • libwebsockets
  • Jetty
  • pywebsockets
  • websockify
  • Socket.IO
  • phpwebsocket
  • Protocol::WebSocket (perl)
  • em-websocket (ruby)
  • node-websocket-server

  • BOSH与WebSockets :
  • 延迟:尽管BOSH草案文档声称延迟很短,但BOSH很难与WebSocket竞争。除非您有理想的条件,即所有中介机构和目标服务器一直支持HTTP / 1.1,否则BOSH客户端和连接管理器将需要在每个数据包和每个请求超时后重新建立连接。这将显着增加延迟和延迟抖动。对于实时应用而言,低抖动通常比平均延迟更重要。 WebSocket连接的延迟和抖动与原始TCP连接非常相似。即使在理想条件下,BOSH通信(因此也就是往返)的客户端到服务器的延迟将始终高于WebSockets:BOSH仍必须遵守HTTP请求-响应语义。 HTTP流支持对每个请求启用多个响应(通过将“单个”响应拆分为多个部分),反之则不行(每个客户端消息是一个新请求)。
  • 小数据包开销:在WebSockets中,有两个字节的小数据开销
    消息。在BOSH中,每个消息都有HTTP请求和响应 header (每个往返轻松地有180多个字节)。此外,每条消息都以XML封装(据说是可选的,但规范未定义方式),并带有多个与 session 相关的属性。
  • 复杂度:虽然BOSH使用浏览器中的现有机制,但它需要适度复杂的JavaScript库来实现BOSH语义。与本机/浏览器(甚至Flash)实现相比,使用Javascript管理此操作还将增加延迟和抖动。
  • 牵引力:BOSH开始生活是使XMPP更加有效的一种方式。它从XMPP社区中成长而来,据我所知,在该社区之外几乎没有什么吸引力。 BOSH和XMPP的文档草案是分开的,但是没有XMPP的BOSH在现实世界中似乎很少使用。

  • 更新:

    刚刚找到了一段视频,其中Ian Fette讨论了advantages of WebSockets over the Channel API which is similar to BOSH(44:00)

    10-07 23:38