• 【网络编程】mqtt概念&数据包



    前言

    本笔记记录 MQTT 相关概念。

    原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/14994943.html

    1. MQTT 简介

    MQTT(Message Queuing Telemetry Transport)是运行在 TCP/IP 中的应用层协议,主流依赖于 TCP 协议。(也有依赖于 UDP 的
    特点

    1. 开放消息协议,简单易实现。
    2. 发布订阅模式,一对多消息发布。
    3. 基于TCP/IP网络连接,提供有序,无损,双向连接。
    4. 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
    5. 消息QoS支持,可靠传输保证。

    特性

    1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
    2. 对负载内容屏蔽的消息传输。
    3. 使用TCP/IP提供网络连接。
    4. 有三种消息发布服务质量:
      1. QoS0:最多发送一次消息,在消息发送出去后,接收者不会发送回应,发送者也不会重发消息。
      2. QoS1:最少发送一次消息(消息最少需要送达一次,也有可送达多次),QoS 1的PUBLISH报文的可变报头中包含一个报文标识符,需要PUBACK报文确认。即需要接收者返回PUBACK应答报文。
      3. QoS2:这是最高等级的服务质量,消息丢失和重复都是不可接受的,只不过使用这个服务质量等级会有额外的开销。
    5. 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。
    6. 使用Last WillTestament特性通知有关各方客户端异常中断的机制:
      • Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
      • Testament:遗嘱机制,功能类似于Last Will

    2. MQTT 通信模型

    通信模型:

    2.1 MQTT 协议

    MQTT 协议中有三种身份:

    • 发布者(Publish):客户端。消息发布者也可以同时是订阅者。
    • 服务器(Broker):服务端。
    • 订阅者(Subscribe):客户端。

    MQTT 传输的消息分为:主题(Topic)负载(payload)

    • Topic:可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)。
      • 发布者与订阅者可以通过主题名字进行匹配的。
    • payload:可以理解为消息的内容,是指订阅者具体要使用的内容。

    2.2 MQTT 协议中的订阅&主题&会话

    订阅(Subscription)

    • 订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。
    • 订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

    会话(Session)

    • 每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。
    • 会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

    主题名(Topic Name)

    • 连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。
    • 服务器会将消息发送给订阅所匹配标签的每个客户端。

    主题筛选器(Topic Filter)

    • 一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

    负载(Payload)

    • 消息订阅者所具体接收的内容。

    2.3 MQTT 协议中的方法

    主要方法有:

    • Connect:等待与服务器建立连接。
    • Disconnect:等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。
    • Subscribe:等待完成订阅。
    • UnSubscribe:等待服务器取消客户端的一个或多个topics订阅。
    • Publish:MQTT客户端发送消息请求,发送完成后返回应用程序线程。

    3. MQTT 协议数据包结构

    一个MQTT数据包由三部分组成:

    • 固定报头(Fixed header):表示数据包类型及数据包的分组类标识。
    • 可变报头(Variable header):数据包类型决定了可变头是否存在及其具体内容。
    • 有效载荷(payload):表示客户端收到的具体内容。

    3.1 固定报头

    固定报头组成

    控制报文的类型 [7:4]

    • 4 bit,共16种。(0、15被系统保留了
    类型 说明
    Reserved 0 系统保留
    CONNECT 1 客户端请求连接服务端
    CONNACK 2 连接报文确认
    PUBLISH 3 发布消息
    PUBACK 4 消息发布收到确认(QoS 1)
    PUBREC 5 发布收到(QoS2)
    PUBREL 6 发布释放(QoS2)
    PUBCOMP 7 消息发布完成(QoS2)
    SUBSCRIBE 8 客户端订阅请求
    SUBACK 9 订阅请求报文确认
    UNSUBSCRIBE 10 客户端取消订阅请求
    UNSUBACK 11 取消订阅报文确认
    PINGREQ 12 心跳请求
    PINGRESP 13 心跳响应
    DISCONNECT 14 客户端断开连接
    Reserved 15 系统保留

    控制报文类型的标志位 [3:0]

    • 目前除了 PUBLISH类型报文 以外,其他报文的标志位均为系统保留。
    • PUBLISH类型报文的标志位
      • bit3:控制报文的重复分发标志(DUP)。
      • bit2-bit1:服务质量等级。
        • 00:QoS0。
        • 01:QoS1。
        • 10:QoS2。
        • 11:预留。
      • bit0PUBLISH 报文的保留标志。

    剩余长度:(第二byte开始)

    • 用于记录剩余报文长度的,表示当前的消息剩余的字节数。包括可变报头和有效载荷区域(如果存在),但剩余长度不包括用于编码剩余长度字段本身的字节数。
    • 剩余长度使用变长编码方案:(大端模式)
      • 每个字节的 [bit7] 表示剩余长度是否还有更多字节表示。
        • 0:无。即是本字节为最后也给字节标识。
        • 1:有。
      • 每个字节的 [6:0]bit 表示编码数据长度。
      • 如:127:只需要一个字节即可:0x7F。128:需要两个字节:0x80、0x01。

    3.2 可变报头

    只有某些MQTT报文才有可变报头。
    位于固定报头和有效负载之间。
    可变报头的内容会根据报文类型的不同而有所不同。

    3.3 有效载荷

    有效载荷也是存在与某些报文中,不同的报文有效载荷也是不一样的。

    Payload有效载荷位于MQTT数据包的第三部分,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:

    • CONNECT:主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
    • SUBSCRIBE:是一系列的要订阅的主题以及QoS。
    • SUBACK:是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
    • UNSUBSCRIBE:是要订阅的主题。

    参考

    链接:

  • 相关阅读:
    QuickPart
    C#在Word文档指定位置增加内容
    不同linux操作系统的内存管理及安全性
    团队作业(五):冲刺总结7
    团队作业(五):冲刺总结1
    信息安全系统设计与实现:第十四章学习笔记
    电子公文传输系统个人贡献
    OpenEuler 中C与汇编的混合编程
    团队作业(五):冲刺总结2
    OpenEuler 中C语言中的函数调用测试
  • 原文地址:https://www.cnblogs.com/lizhuming/p/14994943.html
Copyright © 2020-2023  润新知