因为面试被问到最擅长的一门课,说的是物联网,但是提到MQTT协议被问的哑口无言。先通过chatgpt回忆一下…
什么是MQTT协议,底层是什么网络协议?
MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅(Publish/Subscribe) 模式的轻量级消息传输协议。它专为低带宽、不可靠网络环境设计,常用于物联网(IoT)设备之间的通信。
底层协议:MQTT基于TCP/IP协议运行,确保数据的可靠传输。它使用TCP连接作为传输层协议,同时可以通过TLS加密增强安全性。
工作原理:
- 发布者向某个主题(Topic)发送消息。
- 订阅者订阅某个主题,接收与该主题相关的消息。
- **消息中间件(Broker)**负责接收和转发消息,管理发布者和订阅者之间的通信。
和别的协议相比,为什么物联网中使用MQTT协议?优缺点是什么?
MQTT 在物联网中流行的原因主要与其针对资源受限设备和网络环境优化的特性有关。
优点:
轻量化设计:
消息头部开销极小(2字节),适合带宽有限的网络环境。
消息体可根据需要设计为极简格式,降低数据传输成本。
低功耗:
适合电池供电设备。支持长时间保持连接(Keep-Alive)和休眠,降低通信频率。
支持不可靠网络:
通过 QoS(Quality of Service,服务质量)机制提供可靠性保障,有三种级别:
QoS 0:最多传输一次(不保证交付)。
QoS 1:至少传输一次(可能重复)。
QoS 2:确保仅传输一次(防止重复交付)。
异步通信:
发布/订阅模式解耦了消息的发送者和接收者,便于设备间的松耦合。
跨平台和扩展性:
提供多种客户端库,支持多种编程语言和操作系统。
支持持久会话:
客户端掉线后,Broker可以保留其订阅信息和未收到的消息。
缺点:
依赖 TCP/IP:
在仅支持UDP的网络环境下(如某些移动网络),需要额外适配。
安全性依赖外部机制:
原生协议不直接提供加密功能,需结合TLS或VPN实现加密。
消息丢失风险:
QoS 0模式下可能丢失消息,而 QoS 2 增加了协议复杂度。
缺乏细粒度的访问控制:
需要通过额外的 Broker 功能或插件实现复杂的权限管理。
总结
物联网中使用 MQTT 是因为它专为资源受限设备设计,适用于低带宽、不可靠网络场景。然而,根据具体应用场景,可能需要结合其他协议(如 CoAP、HTTP)来实现特定功能。
特性 | MQTT | HTTP | CoAP | AMQP |
---|---|---|---|---|
传输层协议 | TCP | TCP | UDP | TCP |
通信模式 | 发布/订阅 | 请求/响应 | 请求/响应 | 发布/订阅、请求/响应 |
资源占用 | 低 | 高 | 极低 | 中等 |
适合场景 | 低带宽、低功耗设备 | 高可靠性、一次性任务 | 超低功耗和实时性需求 | 高可靠性企业应用 |
可靠性 | QoS 机制保障 | 依赖 HTTP 协议 | 无 QoS,依赖 UDP | 强事务和可靠性支持 |
安全性 | 通过 TLS 实现加密 | 原生支持 TLS | 需要 DTLS | 原生支持 TLS |
MQTT 和 CoAP 的区别
1. 协议层级与架构
特性 | MQTT | CoAP |
---|---|---|
协议类型 | 应用层协议 | 应用层协议 |
架构 | 基于发布/订阅模型 | 基于请求/响应模型(类似 HTTP) |
传输层协议 | TCP | UDP |
通信模式 | 异步(发布/订阅) | 同步(请求/响应)和异步(观察者) |
2. 适用场景
特性 | MQTT | CoAP |
---|---|---|
适用场景 | 高可靠、带宽受限、需要消息持久化 | 低功耗、轻量级、实时性需求高 |
连接特性 | 长连接(保持 TCP 会话) | 短连接(无状态,单次请求完成后断开) |
目标设备 | 能持续保持连接的设备(如智能家居) | 极低功耗设备(如传感器网络) |
3. 消息传输与可靠性
特性 | MQTT | CoAP |
---|---|---|
可靠性 | 支持 QoS(最多一次、至少一次、仅一次) | 无内置 QoS,依赖 UDP 重传机制 |
消息中间件 | 需要 Broker(消息代理) | 无需中间件,点对点通信 |
传输效率 | 高,但依赖 TCP(较重) | 极高,因使用 UDP(较轻) |
4. 数据格式与大小
特性 | MQTT | CoAP |
---|---|---|
消息格式 | 自定义数据格式 | 支持 JSON、CBOR 等多种格式 |
开销 | 较低(2 字节头部) | 更低(基于二进制编码,最小头部 4 字节) |
数据大小 | 无限制(取决于 Broker 和网络) | 通常限制在 1-2 KB(受 UDP 影响) |
5. 安全性
特性 | MQTT | CoAP |
---|---|---|
加密 | 通过 TLS 加密 | 通过 DTLS(基于 UDP 的 TLS)加密 |
认证 | 支持用户名/密码或证书 | 支持基于 DTLS 的身份认证 |
6. 功能支持
特性 | MQTT | CoAP |
---|---|---|
持久会话 | 支持(可保留订阅信息和未接收消息) | 不支持(无状态通信) |
资源模型 | 无,主题是纯文本路径 | 类似 REST 的资源模型 |
扩展性 | 高,支持复杂的 Broker 配置 | 较低,设计为简单高效 |
7. 优势与劣势
MQTT 优势:
- 可靠性高,支持 QoS 保证消息传输。
- 发布/订阅模式解耦了发送者与接收者。
- 持久会话,掉线后消息可重新发送。
- 广泛支持的客户端和 Broker 实现。
MQTT 劣势:
- 依赖 TCP,网络开销较大。
- Broker 是必要组件,增加系统复杂度。
CoAP 优势:
- 基于 UDP,开销小,适合低功耗设备。
- 类似 REST 的资源模型,支持点对点通信。
- 支持组播功能,适合多设备场景。
CoAP 劣势:
- 无 QoS 机制,消息可靠性较低。
- 缺乏持久连接和消息存储功能。
8. 选择建议
-
使用 MQTT 的场景:
- 需要高可靠性和消息持久化的应用。
- 设备间需要松耦合通信(如智能家居、工业自动化)。
- 网络带宽较充裕且能维持长连接的场景。
-
使用 CoAP 的场景:
- 对低功耗、轻量化需求强烈的场景(如传感器网络)。
- 需要短连接、高实时性的应用。
- 无法使用 TCP,必须依赖 UDP 的环境。