内容简介:因为工作需要,了解了一下MQTT。顺便记下来,现在还不会用。MQTT(Message Queuing Telemetyr Transport 消息队列遥测传输协议):基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议之上。MQTT运行于TCP之上,属于应用层协议。
因为工作需要,了解了一下MQTT。顺便记下来,现在还不会用。
一、概述
MQTT(Message Queuing Telemetyr Transport 消息队列遥测传输协议):基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议之上。
MQTT运行于TCP之上,属于应用层协议。
二、MQTT消息格式
每条MQTT命令消息的消息头都包含一个固定的报头,有些消息会携带一个可变报文头和一个负荷。消息格式如下:
固定报文头|可变报文头|负荷
1、 固定报文头(Fixed Header)
最少有两个字节,第一个字节包含消息的类型(Message Type)和QoS级别等标志位。第二个字节开始是剩余长度字节,该长度是后面的可变报文头加消息负载的总长度,该字段最多允许四个字节。
剩余长度字段单个字节的最大值为0x7F. 也就是127个字节。MQTT协议规定,单个字节的最高位如果是1,表示后续还有字节存在,第八位起延续位的作用。
由于MQTT协议最多使用四个字节表示剩余长度,并且最后一个字节的最大值只能是0x7F,而不是0xFF。所以能发送的最大消息长度是256MB,而不是512MB。
2、 可变报文头(Variable Header)
主要包含协议名,协议版本,连接标志,心跳间隔时间,连接返回码,主题名等。
3、 有效负荷
实际上可以理解为消息的主体。当MQTT发送的消息类型是CONNECT(连接)、PUBLISH(发布)、SUBSCRIBE(订阅)、SUBACK(订阅确认)、UBSUNSCRIBE(取消订阅)时会带有负荷。
三、MQTT的主要特性
1、MQTT的消息类型
固定报文头中的第一个字节包含连接标志,连接标志用来区分MQTT的消息类型。MQTT协议拥有14中不同的消息类型。如下图:
可简单分为连接及终止、发布和订阅、Qos2消息的机制以及各种确认ACK。
2、消息质量(QoS)
MQTT消息质量有三个等级,QoS 0、Qos 1、Qos 2。
Qos 0:最多分发一次,消息的传递完全依赖底层的TCP/IP网络,协议里没有定义应答和重试。消息只会到达服务端一次,要么就没到达。
Qos 1:至少分发一次、服务器的消息接收由PUBACK消息进行确认,如果通信链路或设备异常,或指定时间内没有收到确认消息,发送端会重发这条在消息头中设置了Dup位的消息。
Qos 2:只分发一次。最高级别的消息传递,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外的开销。
3、遗愿标志(Will Flag)
在可变报文头的连接标志位字段(Connect Flags)里面有三个will标志位:Will Flag Will Qos和Retain Flag。这些will字段用于监控客户端与服务器之间的连接状况。
遗愿消息:服务器与客户端通信时,当遇到异常或客户端心跳超时的情况,MQTT服务器会替客户端发布一个will消息。当然如果服务器收到来自客户端的DISCONNECT消息则不会触发wiwll消息的发送。因此will字段可以应用于设备掉线后通知用户的场景
4、 连接保活心跳机制(keep Alive Timer)
MQTT客户端可以设置一个心跳间隔时间(keep Alive Timer),表示在每个心跳检测时间内发送一条消息。如果在这个时间周期内,没有业务数据相关的消息,客户端会发送一个PINGREQ消息,相应的,服务器会返回一个PINGRESP消息进行确认。
如果服务器在一个半(1.5)个心跳间隔时间周期内没有收到来自客户端的消息,就会断开与客户端的连接。心跳间隔时间最大值可以设置为18个小时,8表示客户端不会断开。
四、MQTT其他特点
1、异步发布/订阅实现
发布/订阅模式解耦了发布消息的客户(发布者)和订阅消息的客户(订阅者)之间的关系。发布者与订阅者并不需要直接建立联系。
这个模式的好处有:
1) 发布者与订阅者只需要知道同一个消息代理即可。
2) 发布者与订阅者不需要直接交互,不需要同时在线。
2、二进制格式实现
MQTT基于二进制而不是字符串。固定报文头仅有两个字节,相比于其他协议(HTTPS 和XMPP都是基于字符串实现,有冗长的头部),发送一条消息更省流量
3、MQTT的安全
由于MQTT运行于TCP层之上并且以明文传输,可以使用Wireshark看到MQTT发送的所有消息,消息指令一览无遗。这会带来一定的风险:
1) 设备可能会被盗用
2) 客户端和服务端的静态数据可能是可访问的(可能会被修改)
3) 协议行为可能有副作用(如计时器攻击)
4) 拒绝服务攻击
5) 通信可能会被拦截 修改 重定向或者泄露
6) 虚假控制报文注入
作为传输协议,MQTT只关注消息传输,提供安全功能是开发者的责任。
4、认证
支持两种层次的认证
1) 应用层:MQTT支持客户标识,用户名和密码认证
客户标识:MQTT客户端可以发送最多65535个字符作为客户标识,一般来说可以使用嵌入式芯片的MAC地址或芯片序列号。
用户名和密码:支持通过CONNECT消息的USERNAME和password字段发送用户名和密码。但是由于是用的明文传输,抓包 工具 很容易就获取。
2) 传输层:传输层可以使用TLS,除了加密通讯,还可以使用X509证书来认证设备。
在传输层认证是这样的:MQTT代理在TLS握手成功之后可以继续发送客户端的X509证书来认证设备,如果设备不合法就中断连接。
5、 选择用户数据格式
MQTT协议只实现了传送消息的格式,并没有限制用户协议需要按照特定风格。因此在MQTT协议之上,我们需要定义一套自己的通信协议。就可以有下面几种选择了、
1) 十六进制/二进制:
失去了可读性,可以将流量控制的比较小。单片开发可能会比较喜欢用这个。
2) 字符串:
这个会方便阅读。对于高级语言开发者来说,字符串依旧不是最佳选择。键值对(Key-value)才是最优形式。
3) JSON:
在这门语言中,一切都是对象。因此任何支持的类型都可以通过JSON来表示。例如字符串、数字、对象、数组等、
语法规则是:对象表示键值对、数据用逗号分开、花括号保存对象、方括号保存数组。
JSON层次结构简洁清晰,便于阅读和编写,易于机器解析和生成,有效提升网络传输效率。
4) XML:
综上,MQTT+JSON是最优解。
五、总结
MQTT基于异步发布/订阅的实现解耦了消息发布者和订阅者,基于二进制的实现节省了存储空间及流量,同时拥有更好的消息处理机制。
MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议
以上 参考 https://blog.csdn.net/anxianfeng55555/article/details/80908795
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【每日笔记】【Go学习笔记】2019-01-04 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-02 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-07 Codis笔记
- Golang学习笔记-调度器学习
- Vue学习笔记(二)------axios学习
- 算法/NLP/深度学习/机器学习面试笔记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
创新者的窘境(全新修订版)
克莱顿•克里斯坦森 / 胡建桥 / 中信出版社 / 2014-1-1 / 48.00元
全球商业领域中,许多企业曾叱咤风云,但面对市场变化及新技术的挑战,最终惨遭淘汰。究其原因,竟然是因为它们精于管理,信奉客户至上等传统商业观念。这就是所有企业如今都正面临的“创新者的窘境”。 在《创新者的窘境》中,管理大师克里斯坦森指出,一些看似很完美的商业动作——对主流客户所需、赢利能力最强的产品进行精准投资和技术研发——最终却很可能毁掉一家优秀的企业。他分析了计算机、汽车、钢铁等多个行业的......一起来看看 《创新者的窘境(全新修订版)》 这本书的介绍吧!