MQTT的QoS2中四次握手与TCP的三次握手、四次挥手的异同
目录
一、根本定位不同(核心差异)
二、流程对比
1. TCP 三次握手(建立连接)
2. TCP 四次挥手(关闭连接)
3. MQTT QoS 2 四次握手(单条消息确认)
三、功能与目标对比
四、它们的关系:分层协作
五、常见误解澄清
六、总结:异同表
结论
MQTT QoS 2 的“四次握手” 与 TCP 中的“三次握手”和“四次挥手” 虽然都涉及“握手”一词,但它们处于完全不同的网络层次、目的和机制。下面我们从多个维度对比分析它们的异同、关系与本质区别。
需要强调的是:HTTP和HTTPS使用TCP协议进行数据传输,因此它们的三次握手和四次挥手过程实际上是TCP协议的握手和挥手过程。TCP是传输层协议,负责建立和断开可靠的连接,而HTTP/HTTPS是应用层协议,依赖于TCP的连接管理。
三次握手(确认双方的收发能力,保证发送方和接收方正常;防止已失效的连接请求报文突然传送到服务端;同步初始序列号)。四次挥手(资源释放;防止无效数据;提高安全性;网络效率)
一、根本定位不同(核心差异)
| 项目 | MQTT QoS 2 四次握手 | TCP 三次握手 / 四次挥手 |
|---|---|---|
| 协议层级 | 应用层(MQTT 是应用层协议) | 传输层(TCP 是传输层协议) |
| 目的 | 保证单条消息的“恰好一次”可靠交付 | 建立/释放端到端连接(会话通道) |
| 作用对象 | 单个 MQTT 消息(基于 Packet ID) | 整个 TCP 连接(socket) |
| 是否依赖对方 | 依赖底层已建立的 TCP 连接 | 是建立可靠通信的基础 |
✅ 关键结论:
MQTT QoS 2 的四次握手运行在已经通过 TCP 三次握手建立好的连接之上。
换句话说:没有 TCP 三次握手,就没有 MQTT 通信;而 MQTT QoS 2 是在 TCP 连接之上的“业务级可靠性增强”。
二、流程对比
1. TCP 三次握手(建立连接)
Client Server| ------- SYN --------> || <---- SYN+ACK ------- || ------- ACK --------> |✅ 连接建立,可传输数据
- 目的:同步双方初始序列号,防止历史连接请求干扰。
- 发生在任何应用数据传输之前。
2. TCP 四次挥手(关闭连接)
Client Server| ----- FIN ----------> || <---- ACK ----------- || <---- FIN ----------- || ----- ACK ----------> |✅ 连接关闭
- 因为 TCP 是全双工,需双向关闭。
3. MQTT QoS 2 四次握手(单条消息确认)
Sender Receiver| -- PUBLISH (QoS=2) --> || <-- PUBREC ----------- || -- PUBREL ------------> || <-- PUBCOMP ---------- |✅ 该消息“恰好一次”交付完成
- 发生在TCP 连接已建立之后,用于一条具体消息的可靠投递。
- 可在同一 TCP 连接中发生多次(每条 QoS 2 消息独立进行)。
三、功能与目标对比
| 维度 | MQTT QoS 2 握手 | TCP 握手/挥手 |
|---|---|---|
| 解决的问题 | 应用层消息重复/丢失 | 传输层连接建立/释放 |
| 可靠性范围 | 单条消息的语义可靠性 | 字节流的有序、无差错传输 |
| 重传机制 | 应用层基于 Packet ID 重传 | 传输层基于序列号重传 |
| 状态维护 | MQTT 客户端/Broker 维护消息状态机 | 操作系统内核维护 TCP 状态(ESTABLISHED, TIME_WAIT 等) |
| 是否可见于应用 | 应用可通过 MQTT 库感知(如回调) | 应用通常无感(除非监听 socket 事件) |
四、它们的关系:分层协作
MQTT 运行在 TCP 之上,典型的协议栈如下:
[ Application Layer ]↓MQTT (QoS 0/1/2)↓
[ Transport Layer ]↓TCP (三次握手 + 数据传输 + 四次挥手)↓
[ Network Layer ]↓IP
因此:
- TCP 三次握手 → 为 MQTT 提供可靠的字节流通道。
- MQTT QoS 2 四次握手 → 在该通道上实现更高语义级别的消息可靠性(TCP 无法保证“消息是否被业务处理”)。
💡 举个例子:
TCP 能保证你发的 100 字节数据完整到达对方内核缓冲区,
但不能保证对方应用程序是否读取、是否崩溃、是否重复处理。
QoS 2 就是为了解决“应用逻辑层面”的可靠交付问题。
五、常见误解澄清
| 误解 | 正确理解 |
|---|---|
| “MQTT 四次握手 = TCP 四次挥手” | 完全无关!一个是消息确认,一个是连接关闭 |
| “QoS 2 替代了 TCP 的可靠性” | 不,QoS 2 依赖 TCP 的可靠性,是在其之上的增强 |
| “用了 QoS 2 就不需要关心 TCP” | 错!如果 TCP 频繁断连,QoS 2 也无法完成握手,消息会卡住 |
六、总结:异同表
| 对比项 | MQTT QoS 2 四次握手 | TCP 三次握手 | TCP 四次挥手 |
|---|---|---|---|
| 所属层 | 应用层 | 传输层 | 传输层 |
| 触发时机 | 每发送一条 QoS 2 消息时 | 连接建立时 | 连接关闭时 |
| 目的 | 消息“恰好一次”交付 | 同步序列号,建立连接 | 安全关闭双向连接 |
| 报文类型 | PUBLISH / PUBREC / PUBREL / PUBCOMP | SYN / SYN+ACK / ACK | FIN / ACK |
| 是否可选 | 是(可选 QoS 0/1/2) | 否(TCP 必须) | 否(关闭连接必需) |
| 依赖关系 | 依赖已建立的 TCP 连接 | 无依赖(最底层可靠连接起点) | 依赖已建立的 TCP 连接 |
结论
MQTT QoS 2 的四次握手与 TCP 的三次握手/四次挥手没有直接功能关联,但存在严格的分层依赖关系:
TCP 提供“可靠管道”,MQTT QoS 2 在管道上实现“可靠消息语义”。
它们协同工作,分别解决传输层和应用层的不同可靠性问题。
