概述
1、MQTT概念
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布,目前最新版本为v3.1.1。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。
当然,在物联网开发中,MQTT不是唯一的选择,与MQTT互相竞争的协议有XMPP和CoAP协议等,
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量,简单,开放和易于实现的。如:机器与机器(M2M)通信和物联网(loT)。
MQTT 是 IoT 领域的最重要的标准协议之一,广泛用于物联网、车联网、工业物联网、智能家居、智慧城市、电力石油能源等行业。
MQTT 是 AWS IoT Core、 Azure IoT Hub、阿里云物联网平台等顶级云厂商物联网平台标准通信协议,是工业互联网、车联网、智能家居等各个行业以及诸多网关协议上云的首选协议。
EMQX 作为全球最热门、最成熟的 MQTT Broker 之一,提供了「随处运行,无限连接,任意集成」云原生分布式物联网接入平台,一体化的分布式 MQTT 消息服务和强大的 IoT 规则引擎,为高可靠、高性能的物联网实时数据移动、处理和集成提供动力,助力企业快速构建关键业务的 IoT 平台与应用。
2、设备网络构成
设备主要有三种角色:代理(broker)、发布者(publisher)、订阅者(subscriber)。
- 代理:服务端,是传输的桥梁,一个网络中通常只有一个。负责处理客户端的连接、订阅、发布。
- 发布者:客户端,负责发布消息到代理,代理将数据转发给订阅者。
- 订阅者:客户端,负责接收代理的转发消息
3、MQTT协议原理
3.1 MQTT协议实现方式
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish),代理(Broker)(服务器),订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
MQTT 传输的消息分为:主题(Topic) 和负载(payload)两部分
1)Topic,可以理解为消息类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容
3.2网络传输与应用消息
MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的,无损的,基于字节流的双向传输
当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(Qos)和主题名(Topic)相关连
3.3 MQTT客户端
一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:
1)发布其他客户端可能会订阅的信息
2)订阅其他客户端发布的消息
3)退订或删除应用程序的消息
4)断开与服务器连接
3.4 MQTT服务器
MQTT服务器以称为“消息代理”(Broker),可以是一个应用程序或一台设备,它是位于消息发布者和订阅者之间,它可以:
1)接受来自客户的网络连接;
2)接受客户发布的应用消息;
3)处理来自客户端的订阅和退订请求
4)向订阅的客户转发应用程序消息
3.5 MQTT协议中的订阅,主题,会话
(1)订阅(Subscription)
订阅包含主题筛选器(Topic Filter)和最大服务质量(Qos)。订阅会与一个会话(session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器
(2)会话(session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在一个网络之间,也可能在客户端和服务器之间跨越多个连接的网络连接
(3)主题(Topic Name)
连接到一个应用程序消息的标签,该标签与服务器的订阅匹配。服务器会将消息发送给订阅所匹配标签的每个客户端
(4)主题筛选器(Topic Filter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题
(5)负载(Payload)
消息订阅者所具体接收的内容
3.6 MQTT协议中的方法
MQTT协议中定义了一些方法(也被称为动作),来表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:
1)Connect,等待与服务器建立连接
2)Disconnect,等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话
3)Subscribe,等待完成订阅
4)UnSubscribe,等待服务器取消客户端的一个或多个topics订阅
5)Publish,MQTT客户端发送消息请求,发送完成后返回应用程序线程
3.7 连接保活心跳机制(Keep Alive Timer)
MQTT客户端可以设置一个心跳间隔时间(Keep Alive Timer),表示在每个心跳间隔时间内发送一条消息。如果在这个时间周期内,没有业务数据相关的消息,客户端会发一个PINGREQ消息,相应的,服务器会返回一个PINGRESP消息进行确认。如果服务器在一个半(1.5)心跳间隔时间周期内没有收到来自客户端的消息,就会断开与客户端的连接。心跳间隔时间最大值大约可以设置为18个小时,0值意味着客户端不断开。
3.8 MQTT的安全
由于MQTT运行于TCP层之上并以明文方式传输,这就相当于HTTP的明文传输,使用Wireshark可以完全看到MQTT发送的所有消息,消息指令一览无遗。
这样可能会产生以下风险:
设备可能会被盗用;
客户端和服务端的静态数据可能是可访问的(可能会被修改);
协议行为可能有副作用(如计时器攻击);
拒绝服务攻击;
通信可能会被拦截、修改、重定向或者泄露;
虚假控制报文注入。
作为传输协议,MQTT仅关注消息传输,提供合适的安全功能是开发者的责任。安全功能可以从三个层次来考虑——应用层、传输层、网络层。
应用层:在应用层上,MQTT提供了客户标识(Client Identifier)以及用户名和密码,可以在应用层验证设备。
传输层:类似于HTTPS,MQTT基于TCP连接,也可以加上一层TLS,传输层使用TLS加密是确保安全的一个好手段,可以防止中间人攻击。客户端证书不但可以作为设备的身份凭证,还可以用来验证设备。
网络层:如果有条件的话,可以通过拉专线或者使用VPN来连接设备与MQTT代理,以提高网络传输的安全性。
认证
MQTT支持两种层次的认证:
应用层:MQTT支持客户标识、用户名和密码认证;
传输层:传输层可以使用TLS,除了加密通讯,还可以使用X509证书来认证设备。
客户标识
MQTT客户端可以发送最多65535个字符作为客户标识(Client Identifier),一般来说可以使用嵌入式芯片的MAC地址或者芯片序列号。虽然使用客户标识来认证可能不可靠,但是在某些封闭环境或许已经足够了。
用户名和密码
MQTT协议支持通过CONNECT消息的username和password字段发送用户名和密码。
用户名及密码的认证使用起来非常方便,不过由于它们是以明文形式传输,所以使用抓包工具就可以轻易的获取。
一般来说,使用客户标识、用户名和密码已经足够了,比如支持MQTT协议连接的OneNET云平台,就是使用了这三个字段作为认证。如果感觉还不够安全,还可以在传输层进行认证。
在传输层认证
在传输层认证是这样的:MQTT代理在TLS握手成功之后可以继续发送客户端的X509证书来认证设备,如果设备不合法便可以中断连接。使用X509认证的好处是,在传输层就可以验证设备的合法性,在发送CONNECT消息之前便可以阻隔非法设备的连接,以节省后续不必要的资源浪费。而且,MQTT协议运行在使用TLS时,除了提供身份认证,还可以确保消息的完整性和保密性。
3.9 选择用户数据格式
MQTT协议只实现了传送消息的格式,并没有限制用户协议需要按照一定的风格,因此在MQTT协议之上,我们需要定义一套自己的通信协议。比如说,发布者向设备发布一条打开消息,设备可以回复一个消息并携带返回码,这样的消息格式是使用二进制、字符串还是JSON格式呢?下面就简单做个选型参考。
十六进制/二进制
MQTT原本就是基于二进制实现的,所以用户协议使用二进制实现是一个不错的选择。虽然失去了直观的可读性,但可以将流量控制在非常小。其实对于单片机开发者来说十六进制并不陌生,因为单片机寄存器都是以位来操作的,芯片间通信也会使用十六进制/二进制。而对于没有单片机开发经验的工程师来说,十六进制/二进制可能就太原始了。下面我们继续看看还有没有其他方案。
字符串
对单片机开发者来说,字符串也是一个选择。比如通过串口传输的AT指令就是基于字符串通信的。使用字符串方便了人阅读,但是对高级语言开发者来说,字符串依旧不是最佳选择,恐怕键值对(Key-Value)才是最优形式。
JSON
JSON中文全称是JavaScript对象标记语言,在这门语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。
XML
MQTT协议只负责通信部分,用户协议可以自己选择,当然也可以选择复杂又冗长的XML格式
详细内容参考:MQTT Version 5.0
最后
以上就是听话裙子为你收集整理的MQTT协议及安全详解的全部内容,希望文章能够帮你解决MQTT协议及安全详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复