1.网络传输协议的对比与选择
目前用于实现即时通讯的网络协议通常有TCP协议和UDP协议,下面我们看一下两者有何区别。
TCP:TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。
UDP:UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。UDP把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地,也即不提供可靠性。
通过以上定义我们不难看出,TCP具有更好的稳定性并且相对安全可靠,而UDP则更不可靠但也正因为其缺少了保证可靠性的一系列校验使得其并不需要维持TCP这样的连接,所以UDP的资源占用率更低并且往往传输效率也更高,因为不必进行收发数据的确认,所以UDP的实时性也更好。
最后结合考虑移动端要面临的两大挑战:移动网络的不稳定性、智能终端频繁的系统休眠与网络切换。显然UDP比TCP更适合。但是由于数据完整性、安全性的需要,又不应完全放弃TCP的可靠与安全。所以更恰当的方式应该是两种通信协议同时使用,各有侧重。UDP用于保持大量终端的在线与控制,应用与业务则通过TCP去实现。手机QQ就是采用这样的方式:用UDP来保持在线,通过TCP来上传和下载数据。
2.数据通讯协议的选择
Protobuf协议
一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明显的。protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言。protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。
XMPP协议
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中。
缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。
MQTT协议
简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已应用到企业领域,且已有C++版的服务端组件rsmb。
缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。
我们初步确定选择的是MQTT格式,其一是因为移动端必须考虑流量因素,所以首先淘汰了XMPP,其次由于我们团队之前并没有IM开发经验所以还需要考虑到开发难度与开发周期问题,虽然protobuf优点众多但毕竟目前使用protobuf的应用极少,所以我们选择了MQTT.