分享

关于移动即时通讯协议的点滴思考

 WindySky 2018-03-06

一 为什么需要优化应用层通讯协议?

    因为存在数据丢包现象,用户体验不好!

二  为什么会有丢包发生?

    应用层协议基于TCP,TCP协议本身提供可靠的端到端的数据传输,但前提是网络良好;在弱网络环境中,TCP连接会经常中断(防火墙掐断、网络无信号心跳包不到达、终端网络切换、终端故障......),而TCP连接两端对中断感知较迟,发现中断后,TCP缓冲区中的数据会被清空,即发生丢包。

    总结一句话:在应用层中,发送出去的数据,如果没有收到对方的确认信息,则不能认定数据已送达。

三  我们需要怎样的协议?

    1 可靠:消息必达

    2 高效:在弱网络环境中数据包能快速收发

    3 低带宽:数据包要尽可能占用少的网络资源

四  针对上述问题设计的几种协议方案 

    1 基于队列的消息协议,如mqtt, 流程如下:

      a  server->发信息->client

      b  client->确认->server

      c  重复上面两步

      优点:实现简单、保证消息可达

      缺点:数据传输效率慢、带宽利用率低、没有利用TCP全双工特性

    2 基于双队列的消息协议,通过TCP全双工特性,对上述协议进行改进,流程如下:

      a  server->发信息1->client

      b server->发信息2->client

      c  server->发信息3->client

      d  client->确认1->server

      e  client->确认2->server

      f  client->确认3->server

      优点:保证消息可达、数据传输效率高

      缺点:实现稍复杂、网络中仍充斥着大量的确认包,带宽利用率低

    3 基于批量消息的协议,为了解决带宽利用率低的问题,流程如下:

      a server->发信息1、信息2、信息3->client

      b client->确认->server

      c 重复上面两步

      优点: 保证消息可达、数据传输效率高、带宽利用率高

      缺点:  实现稍复杂、数据包过大、重发机率增高

    4 基于序列号的消息协议,如ActiveSync,流程如下:

      a  server->发通知->client

      b  client->发客户端最大序列号->server

      c  server->发信息1->client

      d  server->发信息2->client

      e  server->发信息3->client

      f  client-> 确认最大的序列号->server

      g  重复上述步骤

      优点:保证消息可达、减少了数据重发机率、数据传输效率高、带宽利用率高

      缺点: 实现复杂


     weichst对ActiveSync进行了改进,采用tcp+http的方式实现消息通讯。

     个人倾向于基于序列号的消息协议,可完全采用基于TCP协议进行实现。


五   后续改进

       带宽是提升服务端性能的一个瓶颈,为解决该问题,个人更倾向于在传输层使用udp协议,原因如下:

       a udp比tcp实时性更好;

       b tcp为了实现网络拥塞控制、数据安全有序等目标,使得网络中存在大量的ack包,带宽利用率低,而udp不存在这方面的问题

       c udp是无状态的,不需要消耗服务器资源来维护

        

       

  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多