互联网推送消息的方式很常见,特别是移动互联网上,手机天天都能收到好多推送消息,通过研究发现,这些推送服务的原理都是维护一个长链接(要不不可能达到实时效果),但普通的socket链接对服务器的消耗太大了,因此才会出现像MQTT这种轻量级低消耗的协议来维护长链接。服务器
那么要如何维护长链接呢: 网络
维护任何一个长链接都须要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就造成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的链接是没有断开,客户端是在线的。若是超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来讲则断开与服务器的链接从新创建一个链接,对服务器来讲只要断开这个链接便可。socket
Keep Alive指定链接最大空闲时间T,当客户端检测到链接空闲时间超过T时,必须向Broker发送心跳报文PINGREQ,Broker收到心跳请求后返回心跳响应PINGRESP。若Broker超过1.5T时间没收到心跳请求则断开链接,而且投递遗嘱消息到订阅方;一样,若客户端超过必定时间仍没收到心跳响应PINGRESP则断开链接。
链接空闲时发送心跳报文能够下降网络请求,弱化对带宽的依赖。spa
建立链接时,在CONNECT报文中指定,单位s。.net
场景:客户端与Broker链接正常,而后客户端快速重启(小于1.5T),再从新链接Broker,在未达到1.5T这段时间内,客户端与Broker存在两条链接。
处理措施: 先断开以前的链接再创建新的链接。线程
实现MQTT协议须要客户端和服务器端通信完成,在通信过程当中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者能够同时是订阅者。代理
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:orm
(1)Topic,能够理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);blog
(2)payload,能够理解为消息的内容,是指订阅者具体要使用的内容。ip
MQTT会构建底层网络传输:它将创建客户端到服务器的链接,提供二者之间的一个有序的、无损的、基于字节流的双向传输。
当应用数据经过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。
一个使用MQTT协议的应用程序或者设备,它老是创建到服务器的网络链接。客户端能够:
(1)发布其余客户端可能会订阅的信息;
(2)订阅其它客户端发布的消息;
(3)退订或删除应用程序的消息;
(4)断开与服务器链接。
MQTT服务器以称为“消息代理”(Broker),能够是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它能够:
(1)接受来自客户的网络链接;
(2)接受客户发布的应用信息;
(3)处理来自客户端的订阅和退订请求;
(4)向订阅的客户转发应用程序消息。
1、订阅(Subscription)
订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话能够包含多个订阅。每个会话中的每一个订阅都有一个不一样的主题筛选器。
2、会话(Session)
每一个客户端与服务器创建链接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络链接。
3、主题名(Topic Name)
链接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每一个客户端。
4、主题筛选器(Topic Filter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
5、负载(Payload)
消息订阅者所具体接收的内容。
MQTT协议中定义了一些方法(也被称为动做),来于表示对肯定资源所进行操做。这个资源能够表明预先存在的数据或动态生成数据,这取决于服务器的实现。一般来讲,资源指服务器上的文件或输出。主要方法有:
(1)Connect。等待与服务器创建链接。
(2)Disconnect。等待MQTT客户端完成所作的工做,并与服务器断开TCP/IP会话。
(3)Subscribe。等待完成订阅。
(4)UnSubscribe。等待服务器取消客户端的一个或多个topics订阅。
(5)Publish。MQTT客户端发送消息请求,发送完成后返回应用程序线程。
参考: