问题描述
|
解决方法
首先让我解决WebSockets的准备情况:
在Chrome,Safari和iOS(iPhone和iPad)中,默认情况下出厂并启用了Hixie-76协议的WebSockets实现。还随附了Hixie-76协议,但在Firefox 4和Opera 11中默认情况下将其禁用。web-socket-js项目是Flash填充程序/ polyfill,可为使用Flash的任何浏览器添加WebSocket(Hixie-76)支持。
换句话说,WebSockets几乎可用于几乎所有浏览器。
Opera和Mozilla之所以选择默认情况下禁用协议,是因为从理论上讲,使用协议的Hixie版本可能会破坏或破坏某些HTTP代理/中介。同样的担忧也适用于Flash,但Mozilla和Opera对其发布的代码负有更高的责任。该协议的HyBi版本(该协议已移至IETF HyBi工作组)解决了安全问题。
Mozilla,Opera,Google和Microsoft都在研究HyBi协议的实现(尽管Microsoft暂时将其作为单独的下载进行维护)。有一个支持HyBi-07的web-socket-js分支。
更新:自2013年2月起,Chrome 14,Firefox 7,IE10,Opera 12.1,Safari 6.0和web-socket-js Flash填充程序/ polyfill支持最新的HyBi / IETF RFC 6455规范。在移动设备上,iOS 6.0上的Safari,Opera Mobile 12.1,Android的Chrome 14,Android的Firefox 7和Blackberry 7均支持IETF6455。原始的默认Android浏览器不支持任何WebSocket。
WebSocket服务器易于实现。有许多独立和插件实现,其中大多数都支持Hixie-76和HyBi协议版本:
libwebsockets
码头
pywebsockets
websockify
套接字
phpwebsocket
协议:: WebSocket(perl)
em-websocket(红宝石)
节点网络套接字服务器
BOSH与WebSockets:
延迟:虽然BOSH草案文档声称延迟很短,但是BOSH很难与WebSocket竞争。除非您有理想的条件,即所有中介机构和目标服务器一直都支持HTTP / 1.1,否则BOSH客户端和连接管理器将需要在每个数据包和每个请求超时后重新建立连接。这将显着增加延迟和延迟抖动。对于实时应用而言,低抖动通常比平均延迟更重要。 WebSocket连接的延迟和抖动与原始TCP连接非常相似。即使在理想条件下,BOSH通信(因此也就是往返)的客户端到服务器延迟都将始终高于WebSockets:BOSH仍必须遵守HTTP请求-响应语义。 HTTP流支持对每个请求启用多个响应(通过将“单个”响应分成多个部分),反之则不行(每个客户端消息都是一个新请求)。
小数据包开销:在WebSockets中,有两个字节的小数据包开销
消息。在BOSH中,每个消息都有HTTP请求和响应标头(每个往返轻松地有180多个字节)。此外,每条消息都以XML封装(可能是可选的,但规范未定义方式),并带有多个与会话相关的属性。
复杂性:虽然BOSH使用浏览器中的现有机制,但它需要适度复杂的JavaScript库来实现BOSH语义。与本机/浏览器(甚至Flash)实现相比,用Javascript管理此操作还将增加延迟和抖动。
牵引力:BOSH开始生活是使XMPP更有效率的一种方式。它从XMPP社区中成长而来,据我所知,在该社区之外几乎没有什么吸引力。 BOSH和XMPP的文档草案是分开的,但是没有XMPP的BOSH在现实世界中似乎很少使用。
更新:
刚刚找到一个视频,其中Ian Fette讨论了WebSockets与Channel API相比的优势,该视频类似于BOSH(在44:00)