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