Mqtt通信协议详解

这篇具有很好参考价值的文章主要介绍了Mqtt通信协议详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 简介mqtt

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。

2.mqtt协议实现

  • mqtt实现:需要客户端和服务端,不同的客户端通过服务端来获取消息,服务端相当于是个中转站,与各个客户端相连
    mqqt协议,mqtt,服务器,网络

  • 实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
    MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
    (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
    (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

  • 不同的客户端在连接中转站MqttBroker 之后,每个客户端都可以发布和订阅主题,主题就是客户端发布内容的名称,如A客户端发布主题名 11,内容为 nihao , 客户端就可以B订阅A的主题名11来获取A发布的内容 nihao,同理B也可以订阅A的主题获取内容。

3.Mqtt数据包

一个MQTT协议数据包由固定头(Fixed header),可变头(Variable Header),消息体(Payload)三部分组成。
1
. 固定头
:固定头存在于所有的MQTT数据包中,表示数据包类型及数据包的分组类标识。其结构如下:
mqqt协议,mqtt,服务器,网络
1.1 mqtt数据包类型:位于Byte1的第7~4位
mqqt协议,mqtt,服务器,网络
1.2 标识位:位于Byte1的第3~0位,在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接。
mqqt协议,mqtt,服务器,网络
DUP:

发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加Messageld,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。

QoS:

发布消息的服务质量,即:保证消息传递的次数。

RETAIN:

发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

1.3 剩余长度(Remaining Length)

固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。

2 可变头
可变头存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。它驻位于固定的头和负载之间。
3.消息体
消息体存在于部分的MQTT数据包中,表示客户端收到的具体内容。
Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:
CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。

SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。

SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。

UNSUBSCRIBE,消息体内容是要订阅的主题。

4. QoS等级

有三种消息发布服务质量:
QoS 是消息的发送方(Sender)和接受方(Receiver)之间达成的一个协议:

  • QoS0: “至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。Sender 发送的一条消息,Receiver 最多能收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,也就算了;
    如下:Sender向Receiver发送一个包含消息数据的PUBLISH包,然后不管结果如何,丢掉已发送的PUBLISH包,一条消息的发送完成。
    mqqt协议,mqtt,服务器,网络

  • QoS1: “至少一次”,确保消息到达,==所以有一个应答的机制。==但消息重复可能会发生。Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;
    如下图:Sender向Receiver发送一个带有数据的PUBLISH包,并在本地保存这个PUBLISH包;Receiver收到PUBLISH包以后,向Sender发送一个PUBACK数据包,PUBACK数据包没有消息体(Payload),在可变头中有一个包标识(Packet Identifier),和它收到的PUBLISH包中的Packet Identifier一致。Sender收到PUBACK之后,根据PUBACK包中的Packet Identifier找到本地保存的PUBLISH包,然后丢弃掉,一次消息的发送完成。

mqqt协议,mqtt,服务器,网络
问题:

  • 如果Sender在一段时间内没有收到PUBLISH包对应的PUBACK,它将该PUBLISH包的DUP标识设为1(代表是重新发送的PUBLISH包),然后重新发送该PUBLISH包。
  • Receiver可能会重复收到消息,需自行去重。

QoS2: “只有一次”,确保消息到达一次。Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息。
如下:

  1. Sender发送QoS为2的PUBLISH数据包,数据包 Packet Identifier 为 P,并在本地保存该PUBLISH包;
  2. Receiver收到PUBLISH数据包后,在本地保存PUBLISH包的Packet Identifier P,并回复Sender一个PUBREC数据包,PUBREC数据包可变头中的Packet Identifier为P,没有消息体(Payload);
  3. 当Sender收到PUBREC,它就可以安全的丢弃掉初始Packet Identifier为P的PUBLISH数据包。同时保存该PUBREC数据包,并回复Receiver一个PUBREL数据包,PUBREL数据包可变头中的Packet Identifier为P,没有消息体;
  4. 当Receiver收到PUBREL数据包,它可以丢掉保存的PUBLISH包的Packet Identifier P,并回复Sender一个可变头中 Packet Identifier 为 P,没有消息体(Payload)的PUBCOMP数据包;
  5. 当Sender收到PUBCOMP包,那么认为传输已完成,则丢掉对应的PUBREC数据包;
    mqqt协议,mqtt,服务器,网络
    上面是一次完整无误的传输过程,然而传输过程中可能会出现以下情况:
  • 情况1:Sender发送PUBLISH数据包给Receiver的时候,发送失败;
  • 情况2:Sender已经成功发送PUBLISH数据包给Receiver了,但是Receiver发送PUBREC数据包失败;
  • 情况3:Sender已经成功收到了PUBREC数据包,但是PUBREL数据包发送失败;
  • 情况4:Receiver已经收到了PUBREL数据包,但是发送PUBCOMP数据包时发送失败

针对上述的问题,较为详细的处理方法如下:

  • 不管是情况1还是情况2,因为Sender在一定时间内没有收到PUBREC,那么它会把PUBLISH包的DUP标识设为1,重新发送该PUBLISH数据包;
  • 不管是情况3还是情况4,因为Sender在一定时间内没有收到PUBCOMP包,那么它会重新发送PUBREL数据包;
  • 针对情况2,Receiver可能会收到多个重复的PUBLISH包,更加完善的处理如下:
    Receiver在收到PUBLISH数据包之后,马上回复一个PUBREC数据包。并会在本地保存PUBLISH包的Packet Identifier P,不管之后因为重传多少次这个Packet Identifier 为P的数据包,Receiver都认为是重复的,丢弃。同时Receiver接收到QoS为2的PUBLISH数据包后,并不马上投递给上层,而是在本地做持久化,将消息保存起来(这里需要是持久化而不是保存在内存)。
  • 针对情况4,更加完善的处理如下:
    Receiver收到PUBREL数据包后,正式将消息递交给上层应用层,投递之后销毁Packet Identifier P,并发送PUBCOMP数据包,销毁之前的持久化消息。之后不管接收到多少个PUBREL数据包,因为没有Packet Identifier P,直接回复PUBCOMP数据包即可。

注意:
QoS是Sender和Receiver之间的协议,而不是Publisher和Subscriber之间的协议。换句话说,Publisher发布了一条QoS1的消息,只能保证Broker能至少收到一次这个消息;而对于Subscriber能否至少收到一次这个消息,还要取决于Subscriber在Subscibe的时候和Broker协商的QoS等级。

5. mqtt传输安全保证

5.1 应用层

MQTT还提供客户标识(Client Identifier)以及用户名密码,在应用层验证设备,通过在mqttbroker 设置用户名和密码,客户端连接时需要输入相应的用户名和密码

5.2 传输层

传输层:传输层使用SSL/TLS加密是确保安全的一个好手段,可以防止中间人攻击(Man-In-The-Middle Attack)。客户端证书不但可以作为设备的身份凭证,还可以用来验证设备。使用 SSL(升级版本 TLS)对网络数据进行加密(这与 MQTT 协议本身是无关的,会增加网络开销
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

  • 以下是设置MQTT的TLS加密的基本步骤:
  1. 生成或获取MQTT代理的服务器证书和私钥。

  2. 配置MQTT代理以使用服务器证书和私钥。

  3. 为每个MQTT客户端生成或获取客户端证书和私钥。

  4. 配置MQTT客户端以使用客户端证书和私钥。

  5. 配置MQTT代理以要求所有客户端连接使用TLS加密。

  6. 配置MQTT客户端以使用TLS加密连接到代理。

5.2.1 TLS安全协议

由于TLS对交互信息的时序有规定,所以下层协议必须能够提供这种时序服务,因此TLS不能使用UDP来传输。
TLS 1.3协议层级架构:
mqqt协议,mqtt,服务器,网络
同样在TLS协议内部也是基于分层架构,分为两层:下层为记录层协议,为TLS上层子协议为传送提供分片、消息加密及加密后报传输,同时对接收到的数据进行验证、解密、重新组装,然后提交给高层的应用层;上层包含4种子协议:==握手协议(Handshake Protocal)、警报协议(Alert Protocol)、应用数据协议(Application Protocol)及Change_cipher_spec。==其中change_cipher_spec只是为了兼容性存在,其余每个子协议都具有特定的作用,组合起来实现完整的协议功能。

  • 握手协议
    握手协议如字面所言,是在加密通信之前,对于加密使用的算法套件及加密密钥进行协商。
    1、 通过ClientHello及ServerHello完成了随机数、加密算法包及证书格式的协商,重点完成了密钥参数的传输

    2、 通过Certificate及CertificateVerify应用证书体系及数字签名完成身份认证

    3、 通过AEAD对称加密算法,完成握手消息中数据加密

  • Alert Protocol
    报警协议也如字面含义所示,是用来指示关闭信息和错误信息的,相应的主要包含两大类:关闭警报和错误警报。
    mqqt协议,mqtt,服务器,网络

  • Record Protocol
    如上面综述所言,记录层位于TLS内部下层,主要负责验证、分片/重组、加密/解密的任务。

    a) 加密/解密:这个就比较显而易见了,不做过多解释;
    b) 分片/重组:这里的分片不是由于下层协议的帧长度限制的,而是因为解密方需要收完整个record,才能解密。长度过长会增大延迟,因此TLS协议规定length必须小于 2^14字节;
    c) 验证:这部分内容涉及比较多,包括报文时序是否满足协议规定,AEAD中的消息认证是否正确,填充是否正确等内容。

5.3 网络层

网络层:有条件可以通过拉专线或者使用VPN来连接设备与MQTT代理,以提高网络传输的安全性。文章来源地址https://www.toymoban.com/news/detail-613665.html

到了这里,关于Mqtt通信协议详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nodejs 实现MQTT协议的服务器端和客户端的双向交互

    公司和第三方合作开发一个传感器项目,想要通过电脑或者手机去控制项目现场的传感器控制情况。现在的最大问题在于,现场的边缘终端设备接入的公网方式是无线接入,无法获取固定IP,所以常规的HTTP协议通信就没法做,现在打算使用MQTT来实现云平台和边缘终端(传感器

    2024年02月05日
    浏览(54)
  • esp8266模块--MQTT协议连接服务器实现数据接收和发送+源码

    首先推荐中国移动的代码,我觉得中国移动的代码更为合理:(但是有一些其他的模块在里面) OneNET开发板代码、资料--2020-09-27--标准板、Mini板bug修复 - 开发板专区 - OneNET设备云论坛 (10086.cn) 以及这位b站up做的视频:(wifi模块在p9节) 【挽救小白第一季】STM32+8266+小程序智能

    2024年02月08日
    浏览(49)
  • 基于ESP32搭建物联网服务器十二(使用MQTT协议与ESP32互动)

    在之前的文章中:基于ESP32搭建物联网服务器十一(用WEB页面控制引脚(GPIO)功能)_esp32webserver 控制io_你的幻境的博客-CSDN博客 已经简单地介绍了MQTT协议,对比于其它网络协议,MQTT协议在物联网的开发中,它的特点使它适用于大多数受限的环境。例如网络代价昂贵,带宽低、不可

    2024年02月02日
    浏览(37)
  • STM32 + ESP32(AT固件 MQTT协议) + MQTTX(桌面终端) + (EMQX消息服务器)

    翻出老物件,搭建一个简单的 IOT 开发环境,也算是废物利用了 ,接下来加传感器。 1. STM32  采集数据:      RTOS。      资源相对比较丰富,可以根据项目需求定制。 2. ESP32  网络传输(AT固件 MQTT协议) :     AT:封装好的接口,扩展性不是那么好,业务简单的话将就可以

    2024年02月08日
    浏览(58)
  • Mqtt通信协议详解

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级” 通讯协议 ,该协议构建于TCP/IP协议上。 mqtt实现:需要客户端和服务端,不同的客户端通过服务端来获取消息,服务端相当于是个中转站,与各个客户端相连

    2024年02月15日
    浏览(27)
  • MQTT:windows环境下配置MQTT服务器(mosquitto)

    目录 1.下载 mosquitto 2.安装 mosquitto  3.配置 mosquitto  4.测试 mosquitto         登录网址:         http://mosquitto.org/files/binary/         这里是window环境,选择win32/,下载mosquitto安装包。          双击安装 - 点击Next - 点击Next - 选择安装路径 - 点击install - 点击Finish。

    2024年02月11日
    浏览(33)
  • 个人云服务器搭建MQTT服务器

    🔮🔮🔮🔮🔮相关文章🔮🔮🔮🔮🔮 ESP32连接MQ Sensor实现气味反应 🔗 https://blog.csdn.net/ws15168689087/article/details/131365573 ESP32连接云服务器【WebSocket】 🔗 https://blog.csdn.net/ws15168689087/article/details/131406163 ESP32+MQTT+MySQL实现发布订阅【气味数据收集】 🔗 https://blog.csdn.net/ws1516868

    2024年02月15日
    浏览(39)
  • Android+MQTT(Android APP 连接至MQTT服务器)

    这段时间因为毕设的需求,接触学习了一下用Android app连接MQTT服务器,然后对下位机(STM32/ESP8266)进行数据通讯的一个小设计,本篇文章介绍app+MQTT服务器这一段。 实现原理: 这里设计的是一个监测控制智能风扇的APP,可以实时监测当前温度、湿度及下位机的传感器、控制

    2024年02月02日
    浏览(42)
  • 【MQTT服务器】宝塔服务器安装EMQX

    本文介绍一种简单的服务器安装EMQX方法。         进入软件商店搜索docker,安装         拉取完成在容器列表可查看emqx状态 emqx的web管理地址:http://服务器公网IP:18083 账号:admin 密码:public 其他端口:如果发现某个端口访问不了,尝试去宝塔面板的安全位置去放行一

    2024年02月03日
    浏览(99)
  • 阿里云服务器如何搭建MQTT服务器

    入门教程:链接 将系统配置成Ubuntu18的(因为我只会用这个系统) 在实例处停止当前系统的运行,然后依次选择2,下拉菜单找到3进行更换系统,更换完成以后重启就好了。 如下图,依次点击1-4的按钮,第五步需要重新设置系统的密码 Xshell下载链接 安装完成后打开Xshell按照

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包