BOSH 是一种传输协议,通过高效利用多个同步的HTTP请求/响应对模拟了两个实体(例如客户端和服务器)之间的长期双向TCP连接语义,而不需要频繁轮询或分块响应。
BOSH使用两个开放的HTTP连接而不是一个,并且不扩展HTTP协议。这听起来像WebSockets和HTTP长轮询,那么这两个协议有什么区别,并且在什么情况下会优先选择使用WebSockets而不是BOSH呢?
BOSH 是一种传输协议,通过高效利用多个同步的HTTP请求/响应对模拟了两个实体(例如客户端和服务器)之间的长期双向TCP连接语义,而不需要频繁轮询或分块响应。
BOSH使用两个开放的HTTP连接而不是一个,并且不扩展HTTP协议。这听起来像WebSockets和HTTP长轮询,那么这两个协议有什么区别,并且在什么情况下会优先选择使用WebSockets而不是BOSH呢?
首先让我谈一下WebSockets的准备情况:
Chrome、Safari和iOS(iPhone和iPad)默认安装并启用了实现Hixie-76协议的WebSockets。Firefox 4和Opera 11也默认安装但禁用了Hixie-76协议。web-socket-js项目是一个Flash shim/polyfill,可以将WebSocket(Hixie-76)支持添加到任何带有Flash的浏览器中。
换句话说,WebSockets几乎适用于所有主流浏览器。
Opera和Mozilla选择禁用该协议的原因是理论上存在一些破损的HTTP代理/中介可能会被使用Hixie版本的协议攻击/污染。Flash也存在同样的问题,但Mozilla和Opera认为他们对所提供的代码有更高的责任感。HyBi版本的协议(该协议已移至IETF HyBi工作组)解决了安全问题。
Mozilla、Opera、Google和Microsoft都在开发HyBi协议实现(尽管Microsoft目前仍将其维护为单独下载)。web-socket-js也有一个支持HyBi-07的分支。
更新:截至2013年2月,Chrome 14、Firefox 7、IE10、Opera 12.1、Safari 6.0支持最新的HyBi/IETF RFC 6455规范,并由web-socket-js Flash shim/polyfill提供支持。在移动设备上,iOS 6.0上的Safari、Opera Mobile 12.1、Android上的Chrome 14、Android上的Firefox 7和Blackberry 7都支持IETF6455。原始的默认Android浏览器没有任何WebSocket支持。WebSocket服务器易于实现。有许多独立的和插件实现,其中大部分支持Hixie-76和HyBi协议版本:
BOSH vs WebSockets:
BOSH与WebSockets的比较:更新:
刚刚发现一段视频,Ian Fette在其中讨论了WebSockets相比于类似BOSH的Channel API的优势(在44:00处)