MQTT协议为什么这么轻量级
1、MQTT协议如何做到轻量级
MQTT是二进制的协议,控制字段是精确到Bit级别的。这就是MQTT轻量级的根本原因。
MQTT协议简单,最小的头部只需2个字节,特别适合于嵌入式中。
但MQTT是不支持分包等机制,并不适宜一些数据包特别大的应用场景。
MQTT协议控制报文的格式包含以下三个部分,以固定报头,可变报头和有效载荷,其中固定报文头是所有的控制报文都有, 可变报头和有效载荷都是部分控制报文包含。
1)固定报头
固定报头是两个字节组成,其具体的格式如下所示:
控制报文类型:第一个字节的二进制位7-4无符号整数表示控制报文的类型,具体类型对应的值为:
其中预留值15已经在MQTT5中使用到AUTH中了。
标志:
第一个字节的二进制位3-0包含每个MQTT控制报文类型特定的标志, 控制报文中的标志为必须按照如下表格进行设置,如果设置有问题,则接收者必须断开连接。
剩余长度:
第二个字节表示当前报文剩余部分的字节数,包括可变报头和有效载荷。剩余长度不包括用于编码剩余长度字段本身的字节数。剩余长度字段使用一个变长度编码方案,对小于128的值使用单字节编码,超过128的值,最高有效未用于指示是否有更多的字节,因此每个字节可以编码128个数值和一个延续位,剩余长度字段最大4个字节。 举例:十进制64被编码为一个字节,十六进制表示为Ox40。十进制数字321编码为两个字节,最低有效位在前,第一个字节65+128=193,第二个字节为2。 剩余长度最大为256M的报文,而且报文是不支持分包处理的,所以MQTT协议并不适合一些数据量特别大的场景,比如视频直播等数据包比较大的场景。
2)可变报头
可变报头介于固定报头和有效载荷中间。不同的控制报文有着不同的可变报头,其中PacketId是一个在多个控制报文中存在一个报文。 PacketId包含两个字节,现在包含该字段的控制报文有,PUBLISH(Qos>0), PUBACK, PUBREC, PUBREL,PUBCOMP,SUBSCRIBE,SUBACK, UNSUBSCRIBE, UNSUBACK。
其中,PUBLISH Qos0的报文是不能又packetId的。
有些对应的控制报文中的packetId必须和与该控制报文绑定的其它控制报文保持一直,例如PUBLISH Qos1对应的是PUBACK,PUBLISH Qos2对应的PUBCOMP。
发送者和接收者是分开维护各自的packetId,所以会出现交互双方出现相同packetId的两个不同的控制报文。
关于不能有packetId的控制报文,可能是由于packetId是可以复用的,没有办法确认可以复用的场景不能使用报文,比如Qos0的PUBLISH报文,由于没有回应,所以发送者无法得知packetId何时可以释放复用,故不允许存在该字段。
3)有效载荷
有效载荷即为应用消息。 目前MQTT3.1.1中包含如下的控制报文CONNECT, CONNACK, PUBLISH, PUBACK,PUBREC, PUBREL, PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE,UNSUBACK,PINGREQ,PINGRESP,DISCONNECT的协议
2、MQTT协议的官方介绍
It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is
required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios.
It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers
MQTT是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。例如通过卫星和代理连接,通过拨号和医疗保健提供者连接,以及在一些自动化或小型设备上,而且由于小巧,省电,协议开销小和能高效的向一和多个接收者传递信息,故同样适用于称动应用设备上。
3、MQTT协议背景
MQTT于1999年由Andy Stanford-Clark(IBM)和Arlen Nipper(Arcom,现为Cirrus Link)发明,当他们的是创建一个协议,以最小的电池损耗和最小带宽连接把石油管道通过卫星进行连接。他们指定了以下目标,未来的协议应该有:
1)简单的实现
2)提供优质的服务数据传递
3)轻量级和带宽效率高
4)数据不可知
4)连续环节的认证
大约3年后首次出版,据宣布,MQTT应在OASIS的标准化下进行,OASIS是一个开放组织,旨在提高标准,AMQP,SAML,DocBook只是已经发布的几个标准标准化过程大约需要1年时间,2014年10月29日,MQTT被正式批准为OASIS标准。 MQTT 3.1.1现在是该协议的最新版本。
MQTT现状:今年年4月7日,OASIS正式发布了MQTT v5.0官方开源标准。
4、MQTT协议实战
目前开源的MQTT协议相关实现主要是个人版,社区或企业版本比较受认可的是Mosquitto、emqx。
其中:
Mosquitto是一款「An Open Source MQTT v3.1/v3.1.1 Broker」——开源的MQTT代理服务器;
https://www.emqx Broker 是基于高并发的 Erlang/OTP 语言平台开发,支持百万级连接和分布式集群架构,发布订阅模式的开源 MQTT 消息服务器。
上一篇: MySQL优化实战
推荐阅读