MQTT_0">MQTT协议介绍
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它具有轻巧、开放、简单、规范、易于实现的特点,适用于受限环境如机器与机器的通信(M2M)以及物联网环境(IoT)。以下是对MQTT协议的详细介绍:
数据表示
- 二进制位:字节中的位从0到7,第7位是最高有效位,第0位是最低有效位。
- 整数数值:整数数值是16位,使用大端序(高位字节在低位字节前面)。
- UTF - 8编码字符串:控制报文中的文本字段编码为UTF - 8格式的字符串,有长度限制且需符合特定规则,如不能包含某些Unicode代码点的编码。
控制报文格式
- 结构组成:由固定报头、可变报头和有效载荷三部分组成。
- 固定报头:包含MQTT控制报文的类型和标志位,以及剩余长度字段,剩余长度使用变长度编码方案。
- 可变报头:部分控制报文包含,其中报文标识符字段存在于多个类型的报文里,不同报文对报文标识符有不同要求。
- 有效载荷:部分控制报文包含,如CONNECT、PUBLISH(可选)、SUBSCRIBE等报文需要有效载荷。
控制报文类型
- CONNECT:客户端到服务端网络连接建立后发送的第一个报文,有效载荷包含客户端标识符、Will主题、Will消息、用户名和密码等字段,各字段根据标志位决定是否存在。
- CONNACK:服务端发送给客户端的确认连接请求报文,包含连接确认标志和连接返回码。
- PUBLISH:用于传输应用消息,包含重发标志DUP、服务质量等级QoS和保留标志RETAIN等。
- PUBACK、PUBREC、PUBREL、PUBCOMP:分别是QoS 1和QoS 2等级的PUBLISH报文的相关确认报文。
- SUBSCRIBE:客户端用于创建订阅,有效载荷包含主题过滤器列表和服务质量要求字段。
- SUBACK:服务端用于确认收到并处理SUBSCRIBE报文,包含返回码清单。
- UNSUBSCRIBE:客户端用于取消订阅主题,有效载荷包含主题过滤器列表。
- UNSUBACK:服务端用于确认收到UNSUBSCRIBE报文。
- PINGREQ和PINGRESP:用于心跳请求和响应,保持连接状态。
- DISCONNECT:客户端发给服务端的最后一个控制报文,表示正常断开连接。
服务质量(QoS)等级
- QoS 0:最多分发一次,消息分发依赖底层网络能力,发送者发送QoS等于0、DUP等于0的PUBLISH报文,接收者不发送响应,发送者不重试。
- QoS 1:至少分发一次,PUBLISH报文可变报头包含报文标识符,需要PUBACK报文确认,发送者需分配未使用的报文标识符,接收者响应的PUBACK报文需包含对应标识符。
- QoS 2:仅分发一次,消息可变报头有报文标识符,接收者使用两步确认过程,发送者需分配未使用的报文标识符,发送的PUBLISH报文需符合特定规则,且有一系列的确认和重发机制。
主题和订阅
- 主题通配符:主题过滤器中可以使用通配符,包括多层通配符“#”和单层通配符“+”,但主题名不能使用通配符。
- 主题语义和用法:主题名和主题过滤器需符合一系列规则,如至少包含一个字符、区分大小写、可以包含空格等,匹配订阅时服务端需按规则进行处理。
MQTT_37">MQTT协议具有以下优点和缺点:
优点
- 轻巧简单
- 低带宽和低功耗
- 可靠传输
- 服务质量等级(QoS):协议定义了三种服务质量等级(QoS 0、QoS 1、QoS 2),可以根据不同的应用场景需求选择合适的等级。
- QoS 0提供最多一次的消息传递,适用于对消息丢失不太敏感的场景,如环境监测中的一些周期性数据采集,偶尔丢失一次数据可能不会对整体分析造成太大影响。
- QoS 1提供至少一次的消息传递,确保消息能够可靠地到达接收方,适合大多数对可靠性有一定要求的应用,如智能家居中的设备控制指令,需要确保指令能够被设备接收到。
- QoS 2提供只有一次的消息传递,保证消息既不丢失也不重复,适用于对消息准确性要求极高的场景,如金融交易数据的传输。
- 会话管理:客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输。例如,当客户端因网络故障等原因断开连接后重新连接时,服务端可以根据保存的会话状态恢复与客户端的通信,继续处理未完成的消息传递。
- 服务质量等级(QoS):协议定义了三种服务质量等级(QoS 0、QoS 1、QoS 2),可以根据不同的应用场景需求选择合适的等级。
- 灵活的主题订阅
- 主题通配符:主题过滤器中可以使用通配符(多层通配符“#”和单层通配符“+”),允许客户端一次订阅多个主题。例如,客户端可以订阅“sport/tennis/#”,这样它就可以接收到以“sport/tennis/”开头的所有主题的消息,方便对相关主题的消息进行集中处理。
- 动态订阅:客户端可以在运行时动态地订阅或取消订阅主题,适应不同的应用需求。比如在一个智能工厂环境中,监控设备可以根据生产流程的不同阶段动态订阅相关设备的状态主题,以便及时获取所需信息。
缺点
- 有限的消息大小
- UTF - 8编码限制:控制报文中的文本字段编码为UTF - 8格式的字符串,且每个字符串都有一个两字节的长度字段作为前缀,这限制了可以传送的UTF - 8编码的字符串大小不能超过65535字节。对于一些需要传输大量文本数据的应用场景,如传输长文档或复杂的配置文件等,可能会受到限制。
- 缺乏双向身份验证机制(默认)
- 单向验证:MQTT协议本身不是双向信任的,它没有提供客户端验证服务端身份的机制(默认情况下)。虽然可以通过使用TLS等安全协议来实现双向身份验证,但这需要额外的配置和资源。在一些对安全性要求极高的应用场景中,如果没有正确配置双向身份验证,可能会存在安全风险,例如中间人攻击的可能性会增加。
- 可能存在的消息顺序问题(在某些网络条件下)
- 网络因素影响:在一些复杂的网络环境中,如网络拥塞、高延迟或不稳定的网络连接情况下,虽然协议本身定义了消息排序的规则,但可能无法完全保证消息按照发送的顺序到达接收方。例如,在QoS 1的消息传输中,虽然发送者会按照顺序发送消息,接收者也会按照顺序确认,但在网络不稳定时,可能会出现后发送的消息先到达接收方的情况,这可能会对一些对消息顺序敏感的应用造成影响,如实时视频流的控制指令传输等。
关键字术语
- 网络连接(Network Connection)
- 应用消息(Application Message)
- 客户端(Client)
- 服务端(Server)
- 定义:一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介,接受来自客户端的网络连接,接受客户端发布的应用消息,处理客户端的订阅和取消订阅请求,转发应用消息给符合条件的已订阅客户端。
- 解析:服务端在MQTT协议中起到核心的枢纽作用,负责管理客户端的连接、消息的转发和处理订阅等操作。比如在一个物联网云平台中,服务端接收大量物联网设备(客户端)发送的数据,并根据设备的订阅情况将数据转发给相应的设备。
- 订阅(Subscription)
- 定义:包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级,与单个会话(Session)关联,会话可以包含多于一个的订阅,每个订阅都有一个不同的主题过滤器。
- 解析:订阅是客户端向服务端表达对特定主题消息感兴趣的一种方式,通过指定主题过滤器和QoS等级,客户端可以确保接收到符合要求的消息。例如,在一个工业监控系统中,监控客户端可以订阅“factory/machine1/status/#”这样的主题过滤器,以获取机器1的各种状态消息,同时可以指定QoS等级来保障消息的可靠性。
- 主题名(Topic Name)
- 定义:附加在应用消息上的一个标签,服务端已知且与订阅匹配,服务端发送应用消息的一个副本给每一个匹配的客户端订阅。
- 解析:主题名用于准确标识应用消息的类别或所属领域,使得服务端能够根据客户端的订阅情况准确地发送消息。例如,在一个智能交通系统中,“traffic/lights/red”可以是一个主题名,表示交通灯变红的相关消息。
- 主题过滤器(Topic Filter)
- 定义:订阅中包含的一个表达式,用于表示相关的一个或多个主题,可以使用通配符。
- 解析:主题过滤器提供了一种灵活的方式让客户端订阅多个相关主题。例如,“sport/tennis/#”这个主题过滤器可以匹配“sport/tennis/player1”、“sport/tennis/player1/ranking”等多个主题,方便客户端获取相关主题的消息。
- 会话(Session)
- 定义:客户端和服务端之间的状态交互,一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。
- 解析:会话用于维护客户端和服务端之间的交互状态,包括消息的发送和接收状态、订阅信息等。例如,当客户端因为网络故障断开连接后重新连接时,服务端可以根据保存的会话状态恢复与客户端的通信,继续处理未完成的操作。
- 控制报文(MQTT Control Packet)