3-MQTT协议分析

MQTT的协议有必要的话也是可以抓包看一下其交互过程,加深理解其原理

1. 报文

固定报文格式:类型+标志位

Bit 7 - 4 3 - 0
byte 1 MQTT控制报文的类型 用于指定控制报文类型的标志位
byte 2… 剩余长度
1.1 MQTT控制报文的类型:
报文类型 字段值 数据方向 描述
保留 0 禁用 保留
CONNECT 1 Client —> Server 客户端连接到服务器
CONNACK 2 Server —> Client 连接确认
PUBLISH 3 Client <–> Server 发布消息
PUBACK 4 Client <–> Server 发布确认
PUBREC 5 Client <–> Server 消息已接收(QoS2第一阶段)
PUBREL 6 Client <–> Server 消息释放(QoS2第二阶段)
PUBCOMP 7 Client <–> Server 发布结束(QoS2第三阶段)
SUBSCRIBE 8 Client —> Server 客户端订阅请求
SUBACK 9 Server —> Client 服务端订阅确认
UNSUBACRIBE 10 Client —> Server 客户端取消订阅
UNSUBACK 11 Server —> Client 服务端取消订阅确认
PINGREQ 12 Client —> Server 客户端发送心跳
PINGRESP 13 Server —> Client 服务端回复心跳
DISCONNECT 14 Client —> Server 客户端断开连接请求
保留 15 禁用 保留
1.2 控制报文类型的标志位:
控制报文 固定报头标志 Bit 3 Bit 2 Bit 1 Bit 0
CONNECT Reserved 0 0 0 0
CONNACK Reserved 0 0 0 0
PUBLISH Used in MQTT 3.1.1 DUP QoS QoS RETAIN
PUBACK Reserved 0 0 0 0
PUBREC Reserved 0 0 0 0
PUBREL Reserved 0 0 1 0
PUBCOMP Reserved 0 0 0 0
SUBSCRIBE Reserved 0 0 1 0
SUBACK Reserved 0 0 0 0
UNSUBSCRIBE Reserved 0 0 1 0
UNSUBACK Reserved 0 0 0 0
PINGREQ Reserved 0 0 0 0
PINGRESP Reserved 0 0 0 0
DISCONNECT Reserved 0 0 0 0
  • 看上面的消息可以观察到PUB的QOS标志直接位于“控制报文类型的标志位”里面,而CONNECT和SUB的QOS标记却不在头部。
  • 抓包可以发现CONNECT和SUB的QOS标记位于后续的数据里面
  • PING心跳没有QOS设置

2. 连接

报文类型 数据方向 描述
0x10 client->broker MQTT CONNECT
0x20 broker->client MQTT CONNACK
返回码响应 描述
0 0x00连接已接受 连接已被服务端接受
1 0x01连接已拒绝,不支持的协议版本 服务端不支持客户端请求的MQTT协议级别
2 0x02连接已拒绝,不合格的客户端标识符 客户端标识符是正确的UTF-8编码,但服务端不允许使用
3 0x03连接已拒绝,服务端不可用 网络连接已建立,但MQTT服务不可用
4 0x04连接已拒绝,无效的用户名或密码 用户名或密码的数据格式无效
5 0x05连接已拒绝,未授权 客户端未被授权连接到此服务器
6-255 保留 如果认为上表中的所有连接返回码都不太合适,那么服务端必须

3. 心跳

一个心跳有三个包

报文类型 数据方向 描述
0xc0 client->broker MQTT PINGREQ
0xd0 broker->client MQTT PINGRESP
client->broker TCP ACK

4. 发布

4.1 QOS=0时
报文类型 数据方向 描述
0x30 client->broker MQTT PUBLISH
broker->client TCP ACK
4.2 QOS=1时
报文类型 数据方向 描述
0x32 client->broker MQTT PUBLISH
0x40 broker->client MQTT PUBACK
4.3 QOS=2时
报文类型 数据方向 描述
0x34 client->broker MQTT PUBLISH
0x50 broker->client MQTT PUBREC
0x62 client->broker MQTT PUBREL
0x70 broker->client TCP PUBCOMP

5. 抓包

【MQTT】使用Wireshark分析MQTT协议:
https://blog.csdn.net/yannanxiu/article/details/71310723

  • 更新到最新的版本可以可以直接解析mqtt的报文(必须是1883端口的才可以解析)
  • 但是还是没办法解析mqtts的报文,会显示BitTorrent(比特流)
  • 可以用端口过滤(tcp.dstport == 1883) || (tcp.srcport == 1883)

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html

你可能感兴趣的:(Mqtt)