弱网络性指手机不断移动(例如地铁、汽车)的特性,处于快速移动中,出现信号不稳、响应时间过长、出现丢包等情况。
因此针对弱网络环境,开发者设计协议的时候必须考虑尽量减少数据往返次数,降低耗时。
由于弱网络性,App以长连接的形式连接服务器,可能出现App和服务器连接忽然中断的情况,而且这种情况无法通过连接端口的异常判断。例如当地铁高速行驶的时候网络中断,App无法向服务器的端口发送断开的信息,服务器还以为App一直保持连接,这种现象称为TCP half-open
TCP half-open的危害:
有效防止TCP half-open的方法是使用应用层心跳包:在App和服务器保持连接过程中,App在规定时间间隔内向服务器发送一个数据(为节省流量,数据可以是单字节字符,因为数据是隔一定时间发送一次,这种数据被形象的称为"心跳数据")。对于未收到心跳数据的连接,服务器主动断开连接。
服务器检查App的连接有三种方式:
服务器记录每个连接收到心跳包的最后时间,每隔一段时间检查所有连接,若某个连接最后收到心跳包时间减去当前时间大于超时时间,断开连接。这种方式主要缺点是需要同时检查所有连接,如果连接数量过大,检查连接是对系统的性能影响大。
服务器为每一个连接建立一个定时器,到了规定的超时时间没有收到心跳包定时器就触发,把当前连接断开,如果收到心跳包,就重置定时器,不断重复过程。这种方法主要缺点,为每一个连接设置独立定时器,如果连接数量过大,会建立大量定时器,耗费系统资源。
这种方式是方式1和方式2的折中,称为时间轮片。按照超时时间的长短,每秒设置一个桶,如果超时时间为60秒就设置60个桶,60个桶组成一个循环队列,第一个桶放一秒后将要超时的连接,第二个桶放置两秒后将要超时的连接,每一个连接一收到心跳包就把自己放到第60个桶,然后每秒的定时器把第一个桶中的连接断开,把这个空桶放到队尾。这种服务器检查App的连接方式,好处是不需要检查所有的连接,节省大量的系统资源。
非Wi-Fi环境下用户使用手机流量上网,对流量敏感。
<iq id="rostersetl" type="set">
<query XMLns="jabber:iq:roster">
<item jid="user@jabbercn.org" name="user"/>
</query>
</iq>
<presence from="contact@rooyee.biz" to=user@jabbercn.org type="subscribe">
one. MySQL协议格式
MySQL协议中一个数据包的前3个字节是数据包长度,第4个字节是数据包的序列号,剩下字节是数据。
two. Redis 协议格式(Redis协议是以CR LF结尾的)
Redis协议格式如下:
*参数个数 CR LF
$第一个参数的字符串占用字节数 CR LF
参数数据 CR LF
......
$第N个参数的字符串占用字节数 CR LF
参数数据 CR LF
举例子(Redis命令:"set name jeff"):
*3\r\n$3\r\n\set\r\n\$4\r\n\name\$4\r\n\jeff\r\n
1.问题的由来:由于移动物联网的弱网络性,经常出现丢包的情况。 需要处理的问题:
2.解决方案:
传统的IM协议是基于队列的消息发送和反馈机制。
服务器按照顺序把队列中的消息依次发给客户端,当客户端收到消息后给服务端发送"确认收到"的应答,如果过了一段时间还没有收到客户端的应答,就重发该消息。
这样就存在两个问题:
one.如果客户端已收到消息且发送了"确认收到"的应答,网络中断,造成服务器收不到应答,服务器重发,导致客户端收到重复的消息。
two.每条消息都需要应答极其费时间,服务器要维护每个消息的状态也容易出错。
该层提供数据存取服务,数据包含用户的身份信息、消息、统计信息等。
根据不同数据对存取速度的不同要求,可使用不同的软件存储不同的业务数据。例如用户身份信息这种高频读写的数据,可存储在Redis、Memcached等内存数据库中。
2).推拉模式
引用自:
https://github.com/zqmath1994/Note/blob/master/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/%E5%A4%A7%E5%AD%A6%E5%90%8E%E5%8F%B0%E5%BC%80%E5%8F%91%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E6%95%B4%E7%90%86/%E5%90%8E%E5%8F%B0%E6%9E%B6%E6%9E%84%E5%89%96%E6%9E%90.md
原文:http://www.cnblogs.com/lushilin/p/6475974.html