MQTT协议基本讲解(结合netty)

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

前提

这里主要讲一下MQTT的结构,另外结合netty来说下具体参数的设置问题。
当然如果你想了解MQTT的所有设计规则,并且该怎么去实现每个规则细节,那么推荐你去 EMQX 官网,这个框架不仅对MQTT进行了深入的,通俗易懂的讲解,更是一个性能非常不错的MQTT broker服务端。

MQTT结构

首先基本概念,结构包含三个部分,分别为:固定报文头(Fixed Header)、可变报文头(Variable Header)、有效负荷(payload)。
通俗的介绍下这三个部分:

可变报文头(Variable Header)

可有可无
主要包含协议名,协议版本,连接标志,心跳间隔时间,连接返回码,主题名、是否有遗嘱、是否有用户名密码等等,这个自己定义,其中协议版本号一定要写对,否则在netty中使用会报错的,另外就是主题名了,这就相当于mq中的路由键一样,根据需求来写。

有效负荷(payload)

可有可无
这个就是你实际要发送的消息内容了。

固定报文头(Fixed Header)

一定要有
很好理解,就是固定不变的几个字段,包括:消息类型(Message Type)、QoS级别标志(0,1,2)、Dup、Retain、Remaining Length。

消息类型(Message Type)

这个就不多说了参考 协议类型
在netty中表现:
MQTT协议基本讲解(结合netty)

QoS级别标志(0,1,2)

这个就是消息服务质量等级了,有三个级别,级别越高,消息越精准。
Qos 0:最多分发一次,消息的传递完全依赖底层的TCP/IP网络,协议里没有定义应答和重试。消息只会到达服务端一次,要么就没到达。
MQTT协议基本讲解(结合netty)

Qos 1:至少分发一次、服务器的消息接收由PUBACK消息进行确认,如果通信链路或设备异常,或指定时间内没有收到确认消息,发送端会重发这条在消息头中设置了Dup位的消息。
MQTT协议基本讲解(结合netty)

Qos 2:只分发一次。最高级别的消息传递,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外的开销。
MQTT协议基本讲解(结合netty)

Dup、Retain

  • Dup 就是一个标志,0或false、1或true,在qos大于0的情况下还需要设置MessageId。
    默认为0,只占用一个字节,表示第一次发送,如果设置为1,表示当前消息先前已经被传送过,需要在下面的变长头部里多加MessageId,并需要回复确认,保证消息传输完成,但不能用于检测消息重复发送。
    简单理解就是,假如A给B发送很多条消息,B收到之后要告诉A我收到了某一条消息,那么区分消息是哪一条,就需要用到唯一的MessageId,同时确认的时候将Dup设置为1发送回去即可。

  • Retain 代表是否需要缓存消息。
    1:表示发送的消息需要一直持久保存(不受服务器重启影响),不但要发送给当前的订阅者,并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
    0:仅仅为当前订阅者推送此消息。
    假如服务器收到一个空消息体(zero-length payload)、RETAIN = 1、已存在Topic name的PUBLISH消息,服务器可以删除掉对应的已被持久化的PUBLISH消息。

    简单说就是:消息是否要存储,同时是否需要发送给新订阅的客户端。

Remaining Length

这个是剩余长度。
剩余长度=可变报头长度+payload长度。
可变报头长度=主题名长度+标识符长度(固定为 2)。
payload长度=实际消息内容的字节长度。
举个例子:发送一个字符串消息“1234”并且主题名为“test”,那么剩余长度应该就等于4+4+2=10.
对于netty来说,直接将对象转成json字符串,然后转成byte数组获取长度,当然在使用netty的时候,我们可以直接把这个值设置为0,然后netty提供的mqtt的编码器会自动为我们计算这个剩余长度并且赋值,很方便,测试过,很准确。
MQTT协议基本讲解(结合netty)
当然如果我们没用netty,使用原生的MQTT,那么这个长度的计算和赋值方法就需要我们自己来算了。
那么请参考这里:MQTT协议-CONNECT报文剩余长度计算
简单来说,这就是人为设置的表示长度的规则,
先说个概念,再去看上边的文章,更好理解,剩余长度最多占用四个字节,每个字节有八位bit,这八位放的是二进制数,其中八位中前七位表示实际的数,最后一位代表是否还有值,这么说吧,假如一个字节全部取最大值1,那么前七位都是1的二进制是多少呢?
MQTT协议基本讲解(结合netty)
127,但如果实际长度是128怎么办,那么一个字节就没办法表示了,那就把最后一位(前七位代表实际数字)改成1,然后再增加一个字节来表示,以此类推,如果第二个字节还无法表示这个数,那就继续往下,但是最多四个字节。文章来源地址https://www.toymoban.com/news/detail-476959.html

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

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

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

相关文章

  • 【netty系列-01】深入理解网络通信基本原理和tcp/ip协议

    Netty系列整体栏目 内容 链接地址 【一】深入理解网络通信基本原理和tcp/ip协议 https://zhenghuisheng.blog.csdn.net/article/details/136359640 【二】深入理解Socket本质和BIO https://zhenghuisheng.blog.csdn.net/article/details/136549478 在最初的网络中,是借鉴于这个OSI七层网络模型,而在实际开发应用中

    2024年03月17日
    浏览(59)
  • 【网络安全 | 网络协议】结合Wireshark讲解TCP三次握手

    TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。在建立 TCP 连接时,需要进行三次握手,防止因为网络延迟、拥塞等原因导致的数据丢失或错误传输,确保双方都能够正常通信。 TCP三次握手在Wireshark数据包中是如何体现的?在此之前,先熟悉TCP三次握手的流程。

    2024年02月03日
    浏览(45)
  • 30.Netty源码服务端启动主要流程

    •创建 selector •创建 server socket channel •初始化 server socket channel •给 server socket channel 从 boss group 中选择一个 NioEventLoop •将 server socket channel 注册到选择的 NioEventLoop 的 selector •绑定地址启动 •注册接受连接事件(OP_ACCEPT)到 selector上 在《引导器作用:客户端和服务端启动都

    2024年02月12日
    浏览(33)
  • springboot第37集:kafka,mqtt,Netty,nginx,CentOS,Webpack

    image.png binzookeeper-server-start.shconfigzookeeper.properties.png image.png image.png 消费 image.png image.png image.png image.png image.png image.png image.png image.png image.png Netty的优点有很多: API使用简单,学习成本低。 功能强大,内置了多种解码编码器,支持多种协议。 性能高,对比其他主流的NIO框架

    2024年02月11日
    浏览(35)
  • Netty 系列教程——Netty 与 HTTP 协议

    作者:禅与计算机程序设计艺术 Netty 是由 JBOSS 提供的一个 Java 高性能网络应用程序框架。通过 Netty 的高效的 buffer 池、通道 pipeline、事件驱动机制等技术实现了天生的异步非阻塞特性。为了简化开发难度并提升开发效率,Netty 推出了一系列的开源组件如 Socket 通信模块(ne

    2024年02月06日
    浏览(36)
  • TCP/IP协议簇的主要协议以及主要用途

    目录 SLIP协议--(Serial line IP) PPP协议--(点对点协议) IP协议 ICMP协议 ARP协议 TCP协议 UDP协议 FTP协议 DNS协议 SMTP协议 TCP/IP协议簇是Internet的基础,TCP/IP是一组协议得代名词,包括许多别的协议,组成了TCP/IP协议簇。 其中重要的有SLIP协议,PPP协议,IP协议,ICMP协议,ARP协议,

    2024年02月10日
    浏览(42)
  • 构建异步高并发服务器:Netty与Spring Boot的完美结合

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 ChatGPT体验地址 在Java基础中,IO流是一个重要操作,先上八股 BIO:传统的IO,同步阻塞,一个连接一个线程。一般不怎么使用 AIO:JDK7引入的,异步非阻塞IO NIO:JDK1.4之后新的API,是多路复用,允许你一次性处理

    2024年02月03日
    浏览(51)
  • Netty示例教程:结合Spring Boot构建客户端/服务器通信

    当涉及到在客户端/服务器应用程序中使用Netty进行通信时,以下是一个结合Spring Boot的示例教程,演示如何使用Netty构建客户端和服务器应用程序。 简介 本教程将指导您如何使用Netty结合Spring Boot构建客户端和服务器应用程序。通过Netty的可靠网络通信功能,您可以轻松构建高

    2024年02月15日
    浏览(53)
  • Netty系列(一):Springboot整合Netty,自定义协议实现

    Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单

    2023年04月25日
    浏览(53)
  • 用Rust设计一个并发的Web服务:常用Rust库如Tokio、Hyper等,基于TCP/IP协议栈,实现了一个简单的并发Web服务器,并结合具体的代码讲解如何编写并发Web服务器的程序

    作者:禅与计算机程序设计艺术 1994年,互联网泡沫破裂,一批优秀的程序员、工程师纷纷加入到web开发领域。而其中的Rust语言却备受瞩目,它是一种现代系统编程语言,专注于安全和并发。因此,Rust在当下成为最流行的编程语言之一,很多框架也开始使用Rust重构,这使得

    2024年02月06日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包