一 为什么需要优化应用层通讯协议? 因为存在数据丢包现象,用户体验不好! 二 为什么会有丢包发生? 应用层协议基于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是无状态的,不需要消耗服务器资源来维护
|
|