在XMPP扩展协议XEP-0124中定义了一个传输协议来模拟两个实体 (例如一个客户端和一个服务器) 之间的长连双向TCP连接的语义,它有效地运用多个同步的HTTP"请求/应答"对,而不需要使用频繁的轮询或者分块响应。该协议简称BOSH(Bidirectional-streams Over Synchronous HTTP),协议的设计目标之一是提供准TCP的连接性能同时兼容受约束的运行环境。
web im是一种具有较高实时性需求的应用,应用要求服务器能实时的将更新信息推送到浏览器客户端。而面向浏览器的消息推送技术到目前已经有了很大发展,各种技术各有优缺点和局限性,这里我们先来比较下各类“面向浏览器的服务器推”技术:
1. Flash XML Socket
该技术要求浏览器安装Flash插件,在Html页面中潜入一个使用了XML Socket类的Flash程序,通过javascript与其交互实现和服务器的长连接通信。
这项技术曾在淘宝旺旺历史上被使用过,后来因为各类兼容性问题而放弃使用。
2. 基于HTTP长连接的Comet
该技术要求客户端浏览器支持HTTP/1.1,HTTP/1.1协议定义的一些技术规范被应用与实践中,例如持久连接、chunked transfer-encoding、pipeline等。
对于一些受限的客户端(移动终端等)可能不能很好的支持像chunked(块传输)、pipeline等特性。
3. Websocket
这是HTML5的一种新协议,可能是将来实现服务器端推送的最佳方式,但不是现在。
4. long-polling(长轮询)
BOSH协议正是采用该方式实现,也是目前最常用的方式(兼容性和性能平衡度最好)。
因为HTTP是一个同步请求/应答协议,传统的通过HTTP模拟双向流的解决方案是让客户端HTTP间歇性地轮询服务器来查询是否有任何等待发送给客户端的数据。当没有数据需要传输的时候,这种幼稚的做法在轮询的时候浪费了很多网络带宽,它也降低了应用程序的响应,因为数据要花时间排队直到服务器从客户端接收下一次轮询 (HTTP 请求) 。 这导致了响应速度和带宽之间难免顾此失彼, 因为增加轮询频率将在减少延迟的同时增加带宽消耗 (如果轮询频率降低的话,反之亦然)。长轮询比之传统轮询的优势就在于如何实现“长”这个字上。
BOSH使用的技术可以描述为:
- 客户端请求服务器后,服务器在有数据发送给客户端之前不去应答请求。服务器hold住了来自客户端的连接并等待发送给客户端的数据准备好。
- 在服务器hold住客户端连接时,若客户端需要发送数据,假如客户端支持HTTP pipline技术则只需在该连接上再发送一个请求,若不支持,则新起一个连接发送请求。
- BOSH要求同一个客户端不能同时建立超过2个并发连接
- 一旦客户端发送的第二个请求到达时,服务器立刻应答第一个请求并释放hold住的第一个请求连接,保证客户端始终能立刻发送更多数据。
- 一段时间内连接双向都无数据传输时,服务器以空数据包应答客户端,客户端收到应答后立刻发起一个新的请求,这模拟了TCP长连接的心跳机制。
- BOSH推送的每一个数据块都是完整的HTTP应答,不提供chunked传输。所以和Comet技术不像,BOSH能够绕过一些代理和缓冲机制,并完全兼容HTTP/1.0
下面看一下具体BOSH会话过程的示例:
1. BOSH会话创建请求
POST /webclient HTTP/1.1
Host: httpcm.example.com
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 104
<body content='text/xml; charset=utf-8' // 指定客户端在应答中支持的内容编码
from='user@example.com' // 客户端JID
hold='1' // 指定服务器在会话过程中允许同时保持的最大数量
rid='1573741820' // 请求id
to='example.com' // 服务domain,对应JID中的domain
route='xmpp:example.com:9999' // 该domain下具体的主机(一个域下可能有多个主机)
ver='1.6' // BOSH协议版本
wait='60' // 服务器允许hold住连接的等待时间(单位秒)
ack='1' // 表示客户端支持确认机制
xml:lang='en'
xmlns='http://jabber.org/protocol/httpbind'/>
若将wait或hold中的一个置为0,那么长轮询将退化为传统轮询
2. BOSH会话创建应答
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 128
<body wait='60' // 必须小于请求中指定的值
inactivity='30' // 若超出该期限没有客户端连接被保持则服务端中止会话(类似TCP超时机制)
polling='5' // 指定允许客户端最小轮询间隔(不低于5秒的轮询间隔)
requests='2'
hold='1'
ack='1573741820' // 对应rid
accept='deflate,gzip' // 服务器支持的内容编码
maxpause='120' // 表示服务器支持临时会话暂停的最大长度
sid='SomeSID' // session id
charsets='ISO_8859-1 ISO-2022-JP'
ver='1.6'
from='example.com'
xmlns='http://jabber.org/protocol/httpbind'/>
3. BOSH传输信息
POST /webclient HTTP/1.1
Host: httpcm.example.com
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 188
<body rid='1249243562'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<message to='contact@example.com'
xmlns='jabber:client'>
<body>Good morning!</body>
</message>
<message to='friend@example.com'
xmlns='jabber:client'>
<body>Hey, what's up?</body>
</message>
</body>
4. BOSH空应答
在一个等待周期里没有数据准备好,则应答一个空body
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 64
<body xmlns='http://jabber.org/protocol/httpbind'/>
分享到:
相关推荐
老板代理 文档: 松弛:#bosh在 邮件列表: CI:[ ] 路线图:(标签:agent) 开发者须知 请参阅。
构建系统工作流下图总结了构建系统的预期工作流程(一旦一切都实现了): 目前,它监视以下 BOSH 版本的变化:cf-release(cf-services-release 和 cf-services-contrib-release 后续),并从 BOS
Guard BOSH 是一个插件,可以更轻松地开发版本。 目前,它会监控您的模板和部署清单是否有任何更改,并报告丢失的 BOSH 属性或模板错误。 示例设置 $ git clone ...
波什实用程序从bosh-agent和bosh-init提取的通用软件包开发测试做出改变以发展和推动。 一旦测试通过,CI管道[此处]( )将提升为精通。 请注意,该管道不可公开访问。
克隆git仓库并创建BOSH版本: git clone https://github.com/APShirley/sslxip-release.git cd sslxip-release # download the PowerDNS source curl -L ...
将某物的平面 BOSH 清单转换为一组 Spiff 模板。 正在开发它以帮助将平面 BOSH 清单迁移到可以部署任何东西的标准化 Concourse 管道中。 用法 给定 BOSH manifest manifest.yml ,多次运行该命令以将数据提取到 ...
Docker 中的 BOSH 命令行 背景: 安装 BOSH 命令行 (bosh_cli) 需要时间,此 docker 文件可帮助您快速入门。 使用以下指令构建环境: 要求: 这个 DockerFile 已经在 Ubuntu:14.04 上测试过。 请使用以下命令...
Harbor BOSH发布 注意:港口boshrelease项目已移至 。 那是现在的正式版本。 Project Harbor是一个企业级注册表服务器,用于存储和分发Docker映像。 Harbor通过添加企业通常需要的功能(例如安全性,身份和管理)...
Cloud Foundry Python Buildpack BOSH版本 这个仓库是一个版本,用于部署Cloud Foundry 。
该文档来自于Docker Meetup深圳站,华为蒙泽超带来了题为“使用CloudFoundry 的BOSH管理Docker的集群”的演讲。
bosh-cpi-go:用于在Go中编写BOSH CPI的库 有关示例,请参阅 ;有关接口的详细信息,请参见 。 使用此库的CPI: 托多斯 将apiv1重命名为api包
VMWare BOSH平台介绍.pdf
bosh-init 部署 bosh 新的 CLI 不仅仅可以部署 Micro BOSH。 但在这个项目中,这正是我们要做的 - 使用新的bosh-init CLI 部署一个 Micro BOSH。 该项目将在运行 BOSH 的 AWS EC2 us-east-1 区域上部署单个服务器...
Redis BOSH 部署流水线 注意:这个自述文件是首先编写的,然后开发了管道,我还没有更新自述文件来反映我到目前为止实际实现的内容。 但这里是连续部署 Redis 3 次的基本管道的图片: 此存储库是从 BOSH 部署到...
注意:在所有示例中,我们bosh将bosh2称为bosh2 CLI的别名。 先决条件 在系统上安装Minikube 。 按照获取所需的工具。 启动您的Minikube minikube start 可能需要一些时间才能看到Kubectl is now configured to ...
详细介绍了Cloud Foundry的BOSH各个部分和功能。
汽车电气与电子BOSH.pdf
Can总线协议,英文版(BOSH),很好的内容,适合汽车电子。
波什 Azure CPI Microsft 的 Azure 产品的云提供商接口 (CPI) 实现环境设置目前,BOSH 对 CPI 有一些限制。 我已经进行了必要的修复并将它们提交给位于以下位置的存储库: git@github.com:nterry/bosh.git以下是准备...
社区共享 BOSH 版本 该项目引用了来自整个 BOSH 社区的 BOSH 发布 tarball。 此外,它还允许将 BOSH 发布 tarball 上传到共享 blobstore。 这对于尚未共享其 tarball 的 BOSH 版本(例如,核心 Cloud Foundry 项目...