1 总览
因为我之前一直做路由器,一直是听说MQTT协议,年初接触了一下Openwrt产品,又是这个协议,所以抽时间看一下。。。
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
特点是:
MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接;
4、有三种消息发布服务质量:
5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
2 实验环境
我还是不喜欢纸上谈兵。所以找了个ubuntu做了一些试验。装的是mosquitto-clients。
sudo apt install mosquitto-clients
mosquitto_sub -h test.mosquitto.org -t test/topic -p 1883
很简单,就两行命令。
关于这个工具,主页是:Eclipse Mosquitto
用法手册是:Mosquitto man page | Eclipse Mosquitto
找了一个免费的MQTT服务器,这里好像是叫broker。这里还有两个免费的,需要可以看看。
- Eclipse Mosquitto:
test.mosquitto.org
- HiveMQ:
broker.hivemq.com
- Eclipse MQTT:
mqtt.eclipse.org
然后又开了一个窗口抓包。
sudo tcpdump -i eth0 -w packets.pcap
3 数据包分析
看到的MQTT数据包如下:
上面是一个最简单的订阅操作。可以看到有几个步骤,首先是TCP连接,这个就不多说。
1 Connect
最开始是MQTT的Connect。
消息都是明文,MQTT主体还是在MQ Telemetry Transport Protocol这一层。
这个部分和第一张图是一致的,就不多说了。
2 Subscribe
之后是MQTT的Subscribe
订阅这个部分主要是有一个Topic,这个Topic我稍微有点奇怪,是全字符匹配吗?还是怎么匹配的?据说有个匹配机制,等空了有时间再看看吧。。。
3 Publish Message
最后是收到的Publish Message
这里也就是之前订阅的消息,现在发送给各个要的客户端。
4 报头
报头中分为固定报头和可变报头,固定报头由报文类型、标识位和报文剩余长度三个字段组成。第一部分是固定的一个字节,从高位到低位分别是消息类型(占 4bit)、重传标识(占 1 bit)、Qos 标识(占 2bit)、保留位 (占1bit);第二部分是用于存放剩余数据长度,至少有一个字节,最多有 4 个字节。
从抓包的情况来看,装的mosquitto-clients是2个字节的固定报头。length是一个byte,也就是支持最大255长度的消息。当然,如果是扩充到3个字节,那消息长度肯定是够用的。。
4 小结
从协议来看整体就是一个异步框架,最大程序减轻了终端的负担,不用保持连接,报头只有2个byte,有一些重传机制。然后负载尽量都放到了broker也就是server上面,终端只管把数据推到broker就行了,还是比较简单。。。
好了,也就是简单看看,起码现在没怎么用这东西。。。