跳至主要内容

关于Web-based IM通信模式的思考

摘要:

本文从Instant Messaging 出发,讨论了Web_based IM信息通信的特殊性,并在此基础上详细分析了现有的实现方案及其各自优缺点。

引言:

Instant Messaging(读成I-M),是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,现主要用于网络即时聊天软件和特殊设备的网络实时监控。该技术普遍采用C/S架构,基于TCP/UDP协议,通过服务器协作,利用防火墙穿透(代理)或基于UDPNAT穿透技术,保持客户端之间的持续长连接,实现客户端之间信息的实时交互。但是,该类模式下的软件系统要求下载安装专用的客户端程序,导致系统部署成本高昂,系统维护困难。同时,为保证即时通信的顺利完成,一般还要求客户端防火墙开放特定端口,引起系统安全问题。因此,这种模式的IM技术在网络环境下的广泛使用还存在一些局限性。

Web-based IM,是基于HTTP协议,系统采用B/S模式,客户端通过访问特定的网页而实现的及时通信技术。这种即时通信技术以网页为载体,避免下载安装庞大的客户端程序,系统功能在服务器端统一维护,既减少了系统部署费用,也降低了维护难度。因此,Web-based IM技术将在基于Web的远程监控、网站客服等方面有重大的意义。

然而,Web-based IM在技术实现上存在难以逾越的困难:首先,Web-based IM采用HTTP作为主要的通信协议,因此,HTTP的非连接、无状态特性将导致通信状态管理非常困难;其次,HTTP访问的单向性只允许客户端(Web浏览器)主动去联系服务器,而服务端却无法主动联系特定的客户端,更不用谈多个客户端之间的互访。所以,要实现Web环境下的实时通信,必须首先要解决这个问题,即充分利用HTTP的特性,在技术实现上做出适当的调整,以适应即时通信的需要。本文将在前人的基础上,从客户端"拉"和服务器"推"的角度,总结归纳基于Web的即时通信方案,并进一步分析比较各自的优劣点。

Web IM通信实现方式

1.     客户端"拉"(Client_pull)模式

传统的HTTP请求模式为:客户端主动向服务器发送信息更新请求,服务器响应请求,客户端接收完响应之后显示更新信息,这也称为客户端"拉"。为实现客户端信息(准)实时更新,一般采用客户端轮询的方案,即实时信息通过网络发送到服务器,保存到服务器内存甚至服务器实时数据库中,客户端根据实际情况,每隔一定时间就自动向服务器重新请求页面数据,以保证客户端内容的实时性。然而,传统的做法是客户端页面整体刷新,导致大量无用信息的重复下载,不但浪费客户端、服务器以及网络资源,而且这种同步的请求方式还将致使客户端页面长时间处于等待响应阶段,而无法继续操作,严重影响客户端体验效果。因此,随着 AJAX技术的成熟,人们常使用XMLHttpRequest对象,采用异步方式访问服务器定时获取更新信息。

2.       服务器"推"(Server-push)模式

服务器"推"模式,即服务器在信息变化之后主动发送新的信息到客户端,客户端接收之后自动进行更新。但是,由于HTTP无状态的特性,服务器响应完毕客户端请求之后,二者之间的通信在默认情况下会自动断开,加上NAT、客户端防火墙等因素的影响,服务器随时向客户端发送更新信息的条件还很不成熟,除非二者之间保持实时的连接。要实现客户端与服务器的实时连接,目前存在以下两种方案值得考虑。

1)基于客户端套接字的服务器推技术

要实现客户端与服务器的实时连接,传统的方式是采用在客户端页面中嵌入ActiveXFlashApplet之类的插件,插件基于TCP/UDP协议,通过套接字方式,实现客户端与服务器的持久连接,保证二者信道的持续通畅,以达到服务器在获取新信息之后可以主动发送到客户端,进行更新。一般而言,在不考虑通信信息的完整性的情况下,为减轻服务器的负载,服务器可以基于UDP协议向客户端发送更新信息。由于UDP是一种不可靠的协议,所以如果需要考虑通信信息的一致性等,则必须使用具有信息完整性验证的TCP协议进行通信。

2)Comet技术

近年来,由于Ajax技术的发展和推广,一种基于HTTP长连接、无需在浏览器端下载安装插件服务器"推"技术,即Comet技术,成为新宠。其实现模型有以下两种:基于 AJAX 的长轮询(long-polling)方式和基于 Iframe  htmlfile 的流(streaming)方式。

长轮询的基本思想就是服务器不立即响应客户端请求,直到服务器接收到针对该客户端的新的信息的时候才响应客户端的请求。客户端一收到服务器的响应就马上发送下一个请求,这样就保证了客户端总是处于请求等待响应的状态,从而使得服务器处于"主动"的地位,当其有数据要发送时可以准确无误地找到客户端,这就类似于一个持久的TCP连接,如图所示

 

 

如果在双方规定的时间内,在两个方向上都没有反应(如客户端没有需要更新的信息,而连接即将超时的情况),则服务器可以用一个没有数据的空响应来进行响应。这个响应将立即触发一个新的客户端请求,这样就可以保证在网络连接不正常的情况下双方都可以在一个合理的时间内知道。为了避免传统HTTP请求导致页面整体刷新的情况,客户端请求一般采用AJAX技术,利用XMLHttpRequest对象向服务器发送异步请求以更新数据。

流(streaming)方式的基本思想是: HTML 页面里嵌入一个隐蔵帧,然后将这个隐藏帧的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。然而,iframe服务器端并不返回直接显示在页面的数据,而是返回对客户端 Javascript 函数的调用,如"<script type="text/javascript">js_func("data from server ")</script>"。服务器端将返回的数据作为客户端 JavaScript 函数的参数传递;客户端浏览器的 Javascript 引擎在收到服务器返回的 JavaScript 调用时就会去执行代码。

 

从上图可以看到,每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接,服务器端可以设置一个超时时间,超时后通知客户端重新建立连接,并关闭原来的连接)。

实现方式比较

采用纯粹的HTTP+AJAX技术实现网页的实时通信,技术简单,成本低,但是存在一些不足:第一,所有客户端的更新消息通过服务器进行"被动"地中转,客户端通过对服务器进行轮询,实现客户与客户之间的消息交互,因此客户端获取的信息是"伪实时"的。第二,轮询的时间间隔的设定异常困难:如果时间间隔过短,就会产生大量的无用请求,加重网络的负担;如果时间间隔过长,又不能保证客户端及时获取更新信息。由此可见,该方案的成功实现必须解决低响应等待时间和低网络带宽之间的矛盾问题。倘若服务器仅在数据发生变化之后,才向客户端发送更新信息,那么这一切问题都能得到妥善处理。

Comet技术可以解决低响应等待时间和低网络带宽之间的矛盾问题,并且在信息实时性方面有所改善,但是仍然存在一些问题需要注意:首先,该模式会仍然导致部分无用信息的下载;其次,对于某些对信息实时性要求很高的应用,它也表现出心有余而力不足;再者,基于HTTP1.1规范,同一客户端不能同时使用超过2个的HTTP长连接;最后,由于Web 服务器会为每个连接创建一个线程,如果在大型的商业应用中使用 Comet,服务器端需要维护大量并发的长连接,因此在这种应用背景下,服务器端需要考虑负载均衡和集群技术,或是在服务器端为长连接作一些改进。

基于插件的解决方案利用Socket连接服务器的确可以保证客户端信息的实时更新,但一些因素值得考虑:首先,部分页面插件需要客户端下载安装(如ActiveX),因此在特定客户端环境下可能因为插件安装失败而导致实时通信无法使用;其次,页面插件使用套接字接口,需要服务器开放一个通信端口,在实现过程中甚至可能需要程序员解决防火墙穿透问题;再次,页面插件在接收到服务器返回的信息之后,可能无法通过脚本语言(如JavaScript)去更新HTML页面(如Applet);最后,客户端连接数量增多会加重网络负担和服务器负载,直接影响客户端并发访问数量。

展望:

以上几种解决方案虽然都存在一定的不足,但在特定的情况下却具有一定的优势。因此,在实际的工作中,可以针对特定网络状况、服务器性能、信息有效期限等现实情况从有效信息率(单位时间系统内产生的有效信息的数量)、客户端并发数量、数据一致性、信息实时性、服务器负载等方面考察各种方案。

 

参考文献:

1.       Comet:基于 HTTP 长连接的"服务器推"技术

2.       B_S模式下基于JabberIM系统的构建方法

3.       IM:聊天进化谱

4.       基于Ajax的即时消息系统的设计与实现

5.       基于P2P技术实现即时通信系统的研究

6.       基于Web的远程实时监控系统研究及应用

7.       即时通信研究综述

8.       即时消息

9.       网页即时通信的研究及应用

10.   Ajax技术在基于Web的实时监控系统中的应用研究

11.   Ajax技术在实时WEB监测中的应用研究

12.   Flash在基于Web的远程实时监控系统中的应用研究

13.   动态Web技术在实时监测系统中的实现

14.   基于B_S的海洋平台远程监控系统设计

15.   基于Web的告警实时显示系统的设计与实现

16.   基于Web的工业信息实时监控系统研究

17.   基于WEB的工业远程监控系统研究与实现

18.   基于Web的实时控制系统的研究与设计

19.   基于服务器推送和事件流处理技术的实时Web系统研究

20.   Anil Bhatt 张凯峰(译)Ajax推送与拉取方式的比较

21.   JerryQu WebIM开发之通讯模式介绍

22.   赵宏华  基于WEBIM实现考虑

23.   及时通讯原理

24.   WebIM开发之多页面数据同步

评论

此博客中的热门博文

面试二代:二逼大猜谜

    Sent to you by Gang.Rock via Google Reader:     面试二代:二逼大猜谜 via 译言-精品外文翻译 by rose-tattoo on 11/29/08 译者: rose-tattoo   几年前,微软发现在资源上出了点乱子,说白了吧,是人力资源上出了乱子。其实是这个样子滴: 招聘的大门常打开,应聘的人也不少来,可是来应聘的人跟岗位怎么看也对不上号啊。于是他们觉得该重新设计面试方法了。          按照老路子,面试就确定俩事儿:一个是这个人能不能胜任工作,二是这个人不能太各色,要能融入组织。微软的面试2。0呢,除了这俩条,还加了一个:冷不丁的给应聘的一个根本不靠谱的问题,甚至是让人摸不找头脑,极其二B的提问,看看他们怎么个反映。         一般来说吧,一个应聘的如果本来就爱玩文字游戏,他(她)在面试的时候也会乐于解答二b问题。换句话说,如果应聘人爱吃烙饼,那他面试的时候也会爱吃。看明白了么?这个大猜谜跟面试程序员跟本他妈的挨不上边儿。       如果你还不知道面试2。0都有什么样的问题,我给你展一眼。   波音747有多重? 有个暗盒子,里面仨灯泡,外面仨开关,线全接好了后盒子只能开一次,你怎么知道那个开关开那个灯? 你和仨人在峡谷里要过一个破桥,你一分钟能过去,另外哪仨人得分别用二,五,十,分钟才能过去。过桥得用手电,你们只有一个,你们怎么才能用最快的时间过去?      其实吧,这样的问题都是扯淡,你要是非用常识和实践方法去解答那就更二了。就拿我来说吧,我肯定过不了这些问题,而且非常有可能答成这个操性:         那我得问问波音公司。。。什么?我不能问他们?啊。。。那我就问图书馆里的人儿,你想啊,他们一天到晚就查书啊,他们就是干这个的啊! 这是谁他妈的弄的破盒子啊?你放心,我肯定能弄好,不过我还没看见这盒子什么样儿呢,你怎么知道我弄不好啊??? 太明显了。我们必须扔...

看看资本主义是如何“充分剥夺”员工的剩余价值的

初中那阵子学的"资本主义如何剥削员工的剩余价值"我一直记忆犹新,老师说:他们通虚伪的福利和看上去不错的工作环境来拉拢员工、掩盖他们的丑陋行为,这 些都是资本家用来更大程度地榨取员工的剩余价值的无耻的方法。当时真是痛恨这些资本家,发誓今后一定要去解放哪些受苦受难的员工,虽然放学回家还不知道有 没有饭吃饱。今天在网上看到一些google的瑞士苏黎世的办公室环境图片,不由得佩服恩师啊,他说得太JB正确了,google就是用如下图的糖衣炮弹 来麻醉他的员工,让员工一辈子被榨取剩余价值。 还是我朝那些在自由落体公司的员工好啊,没有糖衣炮弹的腐蚀、生活在民族大企业的环境里,无论男女都喜欢玩极限运动----自由落体运动。 好了,上图吧!

冉云飞:向成都人推荐本期《亚洲周刊》

作者:冉云飞 | 评论(0) | 标签:环保, 权益, 分子 大地震前的5月,有香江一行,与梁文道兄一起做了一期爱国主义和愤青节目,在独立中文笔会做了个"博客写作和言论自由"的演讲,《亚洲周刊》总编辑邱立本先生邀我到他们刊物去做一个小型的交流。这个交流,后来经马楠女史的录音整理(我还没校过,真是时不我待啊),刊载于敝博,名叫《中国民间维权运动:以成都为例》( http://www.bullog.cn/blogs/ranyunfei/archives/156288.aspx ),大家可以看到。当初讲四川民间维权运动的时候,我还没有讲到现在已在狱中的黄琦先生创办的"六四天网",我也没有讲到在四川组党的刘贤斌、欧阳懿等先生,现在一并作个小补充,算是向他们致敬。以后我用一本书来写我认识的四川牛人、汉子(包括长期在四川生活,或者与四川关系极深者)官方称为"反动分子"的人,书名就叫《四川反动分子》,相当于太史公给诸位写列传。现初步罗列一个名单(挂一漏万,以后会续补):胡平、余杰、王怡、廖亦武、徐友渔、陈奎德、齐家贞、武宜三、廖天琪、谭作人、蔡楚、蔡咏梅、周钰樵、肖雪慧、黄琦、陈云飞、郭发财等。"老一辈反动分子"我会写胡绩伟、谢韬、流沙河、曾伯炎、黄一龙、张和光、张先痴、陆清福、朱国干、郭炎、黄承勋、王建军、杨泽泉等。自由与民主之追求者,岂止川人哉!各地的朋友,都可以写写你们本地的"反动分子",为吾国之终得民主自由做出我们自己的贡献。 为什么想到要写《四川反动分子》一书呢?就是想起一位我认识多年的四川汉子:谭作人。我与老谭交往多年,知道这"老几"(川语,不好翻译,在这里相当于"哥们儿",但这翻译哪能罄其义呢)常年为民主自由做贡献,常从实事做起,从不懈怠。而且最好玩的是,我后来才知道他是我母校的子弟,说起自己的父亲是川大历史系的老师,我马上猜到他父亲是谭英华,真可谓其来有自啊。说起他父亲许多人可能不知晓,但我可以是受惠非浅,早年读关于食货志的书,我可是把《两唐书食货志校读记》当作我读新、旧唐书最重要的参考书来读的啊。能在谭先生身后认识其哲嗣并成为朋友,真是快何如哉!说起四川大学历史系,很多人只知徐中舒、缪彦威(杨联陞先生内兄)二先生,其实川大历...