MQTT(Message Queuing Telemetry Transport),即消息队列遥测传输协议,是一种基于发布/订阅的消息传输协议。其轻量、开放、简洁和易实现的特点能够适用于要求代码量小、网络带宽资源匮乏的情景,如机器间通信(M2M)、物联网等。

Property字段(5.0新增)

携带一组属性和属性长度:

属性长度被编码为变长字节整数,不包含用于编码属性长度自带的字节数

属性包含一段数据和定义了属性用途和数据类型的标识符

正是这个字段,使得 MQTT 5.0 可以支持众多的新特性。而在MQTT 3.1.1中,MQTT没有任何可以拓展的地方,限制了MQTT拓展功能的可能性。

例如CONNECT报文新增

User Property

这个属性在property里面,它可以添加两端约定的数据。例如可以加入类似HTTP的“Header:value”信息。MQTT本身没有类似HTTP的HOST信息,我们可以使用User Property特性让MQTT支持。

Message-expiry-interval

该字段可以在publish报文的属性字段添加,消息过期间隔是一个四字节的整数,表示应用消息的生命周期,单位是秒.

如果 PUBLISH 报文不设置消息过期间隔,那么应用消息不会过期。

如果 PUBLISH 报文设置了消息过期间隔,并且消息过期将已经过期,服务端还没开始向匹配的订阅者交付该消息,那么服务端必须删除该消息。

clean session与clean start

在之前的MQTT版本,当cleansession为0时,server和client会尝试保存session信息(sub信息、PUBLISH状态等),但是有个问题,server 不知道需要保存这个session多久。MQTT 5.0 就 在 Property字段中增加了Session Expiry Interval属性来告知server这个session希望被保存多久。

如果MQTT 5.0 不携带 Session Expiry Interval或者 Session Expiry Interval设置为0,server和client则不会保存session信息。
        如果Session Expiry Interval设置为0xffffffff,则表示session永远不会老化。

当然,这个字段是需要配合Clean Start使用的,如果Clean Start为1,那么 Session Expiry Interval设置多大都无意义。

Reason code

MQTT 3.1.1 只有CONNACK有是否成功还是失败的标志位,现在MQTT 5.0所有的ACK都有该标志位。在ACK中回复一个原因码

Topic Alias

它允许用户将主题长度较长且常用的主题名缩减为一个双字节整数来降低发布消息时的带宽消耗。主题别名字段他是一个双子节整数,作为属性字段,编码在PUBLISH报文的可变报文部分。并且受到CONNECT报文和CONNACK报文中的topic-alias-maximum限制。

在之前的MQTTv3协议中,如果客户端在某次连接中发送大量相同主题的消息,在每一条PUBLISH中发送主题名,造成资源的浪费。而现在使用主题别名只需要发送最多两个字节。同时计算机处理整数的效率高于处理字符串的效率,对于客户端或服务端在报文解析时消耗的计算资源也有了一定的节约。

Receive Maximum

通知对方未处理的最大的 Qos1 或者 Qos2 PUBLISH消息个数,如果不存在,则默认是65535。
        因为当处理 Qos > 0 的PUBLISH的时候,需要回复对端PUBACK、PUBREC PUBCOMP等。Receive Maximum属性提供了告诉对端发送Qos>0的PUBLISH的最大数量,对端发现未决PUBLISH个数等于Receive Maximum时,不能再发送Qos > 0 的PUBLISH消息了

作用:流量控制。

Payload Format Indicator

指定了PUBLISH 消息的message部分是utf8格式的还是二进制的,接收方必须验证payload是否是该属性定义的格式。
Payload Format Indicator 为 0,表示是二进制,和不携带该属性的语义是一样的。
Payload Format Indicator 为 1,表示 是utf8编码数据。

共享订阅

在订阅一个主题的消息的时候,我们可以通过建立一个共享订阅组,发布者pub消息,给每一个客户端,不需要每个人都接收到,而是所有的客户端共享这些消息

共享订阅也有一个主题过滤器,唯一的区别是在于共享订阅的主题过滤器格式必须是$share/{ShareName}/{filter}格式。

$share 前缀表示这个是一个共享订阅

ShareName是一个字符串,订阅会话通过使用相同的 ShareName表示使用同一个订阅,匹配该订阅的消息每次只发布给其中一个session

request/response 模式

MQTT5.0为了支持request/response 模式在publish报文提供ResponseTopic字段以及Correlation Data属性。

客户端A pub主题为testA的消息,clientB订阅并收到,如果pub的属性字段有response topic:testrsp那么clientB会pub主题为testrsp的消息字段,订阅该主题的客户端将会收到。

客户端ID

将被 Broker 用于唯一标识客户端以及客户端的当前状态,例如客户端的订阅列表,报文收发状态等。客户端断开重连时,Broker 将根据 Client ID 来完成会话的恢复。

Will Properties(遗嘱属性)

  • Will Delay Interval:遗嘱消息延时间隔,用于推迟Will Message(遗嘱消息)的发布。
  • Payload Format Indicator:消息体格式指示,1表示Will Message的编码为UTF-8,0则无效字符。
  • Message Expiry Interval:消息到期间隔。
  • Content Type:内容类型,此处用来表明Will Message的内容。
  • Response Topic:回复主题,用作回复消息的主题名。
  • Correlation Data: 相关数据。
  • User Property:用户属性,由用户自己定义。

订阅选项:

No Local

在 MQTT v3.1.1 中,如果你订阅了自己发布消息的主题,那么你将收到自己发布的所有消息。
而在 MQTT v5 中,如果你在订阅时将此选项设置为 1,那么服务端将不会向你转发你自己发布的消息。

Retain As Publish

这一选项用来指定服务端向客户端转发消息时是否要保留其中的 RETAIN 标识,注意这一选项不会影响保留消息中的 RETAIN 标识。因此当 Retain As Publish 选项被设置为 0 时,客户端直接依靠消息中的 RETAIN 标识来区分这是一个正常的转发消息还是一个保留消息,而不是去判断消息是否是自己订阅后收到的第一个消息(转发消息甚至可能会先于保留消息被发送,视不同 Broker 的具体实现而定)。

Retain Handling

这一选项用来指定订阅建立时服务端是否向客户端发送保留消息:
        Retain Handling 等于 0,只要客户端订阅成功,服务端就发送保留消息。
        Retain Handling 等于 1,客户端订阅成功且该订阅此前不存在,服务端才发送保留消息。毕竟有些时候客户端重新发起订阅可能只是为了改变一下 QoS,并不意味着它想再次接收保留消息。
        Retain Handling 等于 2,即便客户订阅成功,服务端也不会发送保留消息。

增强验证

AUTH报文被从客户端发送给服务端,或从服务端发送给客户端,作为扩展认证交换的一部分,比如质询/ 响应认证。如果CONNECT报文不包含相同的认证方法,则客户端或服务端发送AUTH报文将造成协议错误(Protocol Error)。

增强认证可以实现对客户端和服务器的双向认证,服务器可以验证连接的客户端是否是真正的客户端,客户端也可以验证连接的服务器是否是真正的服务器,从而提供了更高的安全性。

在增强认证的过程中,客户端与服务器需要进行多次认证数据的交换,每次交换都需要通过认证算法对认证数据进行加解密的计算(双方验证加密的数据),所以它需要更多的计算资源以及更稳定的网络环境,因此它并不适合算力薄弱、网络波动大的边缘设备,而支持增强认证的 MQTT服务器也需要准备更多的计算资源来应对大量的连接。

SCRAM 认证非规范示例

客户端到服务端: CONNECT 认证方法="SCRAM-SHA-1",认证数据=client-first-data

服务端到客户端: AUTH 原因码=0x18,认证方法="SCRAM-SHA-1",认证数据=server-first-data

客户端到服务端: AUTH 原因码=0x18,认证方法="SCRAM-SHA-1",认证数据=client-final-data

服务端到客户端: CONNACK 原因码=0,认证方法="SCRAM-SHA-1",认证数据=server-final-data

MQTT5.0新特性(比对3.1.1)相关推荐

  1. JDK5.0新特性系列---目录

    JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列--- ...

  2. [转]C# 2.0新特性与C# 3.5新特性

    C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...

  3. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  4. Redis 6.0 新特性-多线程连环13问!

    来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...

  5. WCF4.0新特性体验(3):标准终结点(Standard Endpoints)

    今天在WCF4.0新特性体验第3节,我们介绍WCF4.0里的标准终结点概念,也就是Standard Endpoints. WCF4.0提供了那些标准终结点?他们有什么作用?如何使用标准终结点?如何该表 ...

  6. Servlet 2.0 Servlet 3.0 新特性

    概念:透传. Callback 在异步线程中是如何使用的.?? Servlet 2.0 && Servlet 3.0 新特性 Servlet 2.0 && Servle ...

  7. C#6.0,C#7.0新特性

    C#6.0,C#7.0新特性 C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto- ...

  8. WCF4.0新特性体验(6):路由服务Routing Service(下)

    紧接前文WCF4.0新特性体验(5):路由服务Routing Service(上).今天我们介绍WCF4.0消息路由的实现机制,然后会讲解路由服务的实现过程. [4]WCF与路由服务: 其实在介绍WC ...

  9. 【收藏】C# 2.03.0新特性总结

    c#2.0新特性 范型 我们知道通用的数据结构可以采用object存储任何数据类型.使用object问题是: 显示的强制转带来的代码复杂性 换装箱拆箱的性能损失(为什么有性能损失?因为涉及动态内存分配 ...

最新文章

  1. Kubernetes对象模型
  2. C#中怎样获取System.Drawing.Color的所有颜色对象并存到数组中
  3. 博士申请 | 香港中文大学(深圳)纪冬旭老师招收博士生/研究助理/博士后
  4. [转]使用HttpOnly提升Cookie安全性
  5. JetBrains 开发者调查 - 编程语言趋势
  6. log4net在WinForm和ASP.net下的设置
  7. [Python] 函数来判断一个对象是否是一个已知的类型:isinstance(object, classinfo)
  8. 深度神经网络—超参数调试
  9. python自定义损失函数_自定义损失函数sklearn
  10. web压力测试的几个指标
  11. 压缩PPT文件的技巧
  12. 研究生学位论文文献检索小技巧——妙用谷歌学术搜索
  13. AirPods Pro 和 AirPods 3 固件更新,或将提升稳定性,如何操作看这里
  14. pyltp依存句法分析_NLP(十二)依存句法分析的可视化及图分析
  15. 佐客牛排机器人餐厅_2018年中国最火的三家餐厅!秘密竟是机器人服务员?
  16. 遇见一只黑猫,她说Python是个怪物
  17. MySql常用函数及命令
  18. 数据库 数据目录
  19. matlab蒙特卡洛求体积
  20. ES6 ~ ES11整理

热门文章

  1. Python爬虫系列之唯品会商品数据采集
  2. 一门课程学习转录组调控分析和R可视化第十四期 (线上线下开课)
  3. 警惕消费陷阱和霸王条款:在携程网订的机票2070元退票费1560元
  4. 通过plotly.express库和Flask框架部署企鹅数据可视化的网页
  5. android文件恢复,安卓手机文件丢失了,如何恢复?
  6. 计算机二级和公共英语三级考试时间,英语三级考试时间,全国英语等级考试三级时间。...
  7. esp8266 OTA 云远程更新固件 wifiupdate
  8. 小技巧:163 VIP邮箱如何登录?VIP163邮箱的优势
  9. 微信小程序web-view 外部引用h5页面调用摄像头录制视频 配有提示音
  10. 原神一面:Java 泛型中的通配符 T,E,K,V,?,你确定都了解吗?