2023-07-05
2023-06-18
2023-07-05
2023-06-29
2023-03-19
更新时间:2024-04-20 12:11:00 发布时间:24小时内 作者:文/会员上传 下载docx
2023-07-05
2023-06-18
2023-07-05
2023-06-29
2023-03-19
目前有很多的MQTT消息中间件服务器,如下,都是MQTT协议的服务器端的实现。
IBM Websphere
MQ Telemetry
IBM MessageSight
Mosquitto
Eclipse Paho
emqttd Xively
webMethods
Nirvana Messaging
RabbitMQ
Apache ActiveMQ
Apache Apollo
Moquette
HiveMQ
Mosca
Litmus Automation Loop
JoramMQ
ThingMQ
VerneMQ
在上节中我们分析了MQTT CONNECT消息类型的格式,我们知道CONNECT消息是客户端发送出去的,作为对客户端的连接请求,服务器端同样会有一个消息的返回,这个消息就是MQTT CONNACK的消息类型。我们在发出去CONNECT消息后,如果WireShark抓包工具依然开启的话,将会抓到类似于下面的TCP消息,其16进制为:20 02 00 00,那么其代表什么意思呢?如下图10所示意。
图10 服务器连接应答抓包
连接应答固定消息头
在分析之前,我们先回到的协议中对客户端连接应答(CONNACK)消息帧的定义和描述。
表9 连接应答的固定消息头
其和表4的连接消息帧(CONNECT)固定消息头定义是一样的,只不过,对于第1个字节,10表示的是Connect的消息帧类型;而20表示的是连接应答(CONNACK)的消息帧类型。对于第2个字节,02 表示后面将跟着2个字节. 其意义和前一节的连接消息帧(CONNECT)定义的规范是类似的,表示后面还跟有多少个字节(剩下多少个字节,既包括消息头也包括消息的负载)。
02 表示后面将跟着2个字节。
连接应答的可变消息头
章节提到了,连接应答的固定消息头的第2个字节是02,表示后面还跟着2个字节,这两个字节就是连接应答的可变消息头。
表10 连接应答的可变消息头
面我们来分析其可变头的2个字节: 00 00
其中第一个00,目前没有什么特别的含义,是MQTT协议的保留字段,也许在将来的协议版本中会用到。
第二个字节的00 表示连接成功。MQTT协议对于返回的结果总共定义了6种类型(请见下面的表3): 连接接受,连接拒绝(不可接受的版本),连接拒绝(Client ID服务器不允许),连接拒绝(服务器不可达),连接拒绝(错误的用户名和密码),连接拒绝(客户端没有通过授权认证)。具体含义请见下表11。
表11 连接应答返回值状态速查表
这个消息格式简单吧,嘿嘿,恭喜读者在学习MQTT消息格式的旅途中又往前快速前进了一步。
剩下的12种MQTT消息类型(请见,表3 MQTT的14种消息类型(Command message)),分析过程其实也是类似的,笔者就不在啰嗦赘述了,大家只要把抓到的协议包然后对照MQTT 协议规范做一个对比,就能非常容易的把MQTT的底层协议分析出来。
,通过卫星与石油管道连接。 发明之初为协议规定了几个要求: 实施简单 提供服务质量的数据传输 轻巧和带宽高效 数据不可知 持续的会话意识 2 协议格式 MQTT协议控制报文的格式包含以下三个部分,以...中的标志为必须按照如下表格进行设置,如果设置有问题,则接收者必须断开连接。 备注:从协议规范看出,目前只有PUBLISH的标志位是使用的,其他控制报文都是预留状态,但是必须保持上述表格的形式。 剩余
ARP协议 IP协议 TCP/UDP协议 TCP与UDP区别: wireshark抓取TCP协议三次握手过程: wireshark抓取UDP协议: 运行环境:kali linux 工具:wireshark ARP协议 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到...
TCP协议 在Filter中设置为: == or == 这个地址是干什么的不知道,只是跟它的交互特别多,就选他了。 分析第一个包: 源地址:我自己电脑的IP,就不放上来了 Destination: 目的地址 TCP:表明是个TCP协议 Length:66 表明包的长度是...
SIP消息是SIP客户终端和服务器之间通信的的基本信息单元。SIP消息基于文本,采用UTF-8编码(RFC 2279)中的ISO 10646字符集。SIP协议借鉴了HTTP协议(RFC 2068)的设计思想,有很多消息格式与之相同。SIP协议支持UDP传输协议
SIP消息消息分两类:请求消息 / 响应消息
请求消息(Request):客户端为了激活特定操作而发给服务器的SIP消息,包括INVITE,ACK,OPTIONS,BYE,CANCEL和REGISTER消息。UAC到UAS。
响应消息(Response):服务器向客户端反馈对应请求的处理结果的SIP消息,包括1xx,2xx,3xx,4xx,5xx,6xx响应消息,UAS到UAC
SIP消息格式与结构:
起始行
起始行分请求行(Request-Line)和状态行(Status-Line)两种。
2. 状态行(Status-Line):响应消息的起始行,SIP应答消息的Status-Line由SIP-Version开始,接着是一个数字编码的状态码Status-Code,最后是一个与状态码相关的描述性短语Reason-Phrase,然后由一个CRLF行结束符结束Status-Line。
消息头:
消息头的作用是进一步提供有关消息的其他信息,使代理服务器或客户代理服务器更好地对消息进行处理。消息头分四类:通用头(general-header )、请求头(request-header )、响应头( response-header )和实体头( entityheader)
四大类
HTTP请求报文格式:
HTTP请求报文主要由请求行、请求头部、请求正文3部分组成
请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,处于安全性的考虑也是不可用的
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/和HTTP/
常见请求头如下
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少
GET请求示例:
POST请求示例:
HTTP响应报文格式:
HTTP响应报文主要由状态行、响应头部、响应正文3部分组成
状态代码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/向协议中引入了信息性状态码,范围为100~199)
这里列举几个常见的:
与请求头部类似,为响应报文添加了一些附加信息
常见响应头部如下:
响应示例:
* URI、URL和URN之间的区别
HTTP规范将更通用的概念URI作为其资源标识符,但是实际上,HTTP应用程序处理的只是URI的URL子集
重磅 Chat 分享:
《高效学习,快速变现:不走弯路的五大学习策略》
分享人: 一名会在 B 站直播写代码,会玩杂耍球、弹 Ukulele、极限健身、跑步、写段子、画画、翻译、写作、演讲、培训的程序员。喜欢用编程实现自己的想法,在 Android 市场上赚过钱,有多次创业经历。擅长学习,习惯养成,时间管理。身体力行地影响他人做出积极的改变!目前就职于 ThoughtWorks,致力于传播快乐高效的编程理念。业余创立软件匠艺社区 ,组织超过30场技术活动。
Chat简介: 说到学习呀,真是头大哟:碎片化,没有较长的连续时间来学习难专注,捧起书,手机却在召唤:来呀,快活呀~ 反正有,大把时光~做不到,看了很多书,生活中却做不到然并卵,学了方法和工具,找不到使用场景效率低,学习速度跟不上知识产生的速度记不牢,学习速度赶不上遗忘速度在这个知识泛滥、跨界竞争的年代,学习能力才是核心竞争力。你想想,过去一周,有没有哪一件工作是不需要学习就能完成的?尽管如此重要,大部分人却没研究过学习这件事,以为上下班路上打开「得到」听本书,就是碎片时间终身学习者了。
我是程序员,咨询师,培训师,这几个角色都要求我必须学得又快又好。本场 Chat 将分析学习的「趋势,原则,策略」,帮你站在更高的视角看待学习,从「内容,动机,交互,收益,资源」五方面制定策略,解决学习痛点,助你成为高效学习者!
想要免费参与本场 Chat ?很简单,「GitChat技术杂谈」公众号后台回复「高效学习」
假设有这么一个场景,MQTT的客户端需要连接MQTT的服务器端,这个时候,TCP的三次握手协议完成后,MQTT的客户端就会马上发送一条MQTT CONNECT消息帧。
其实MQTT的CONNECT消息主要用来在客户端和服务端建立一个TCP的通信连接,这个CONNECT的发起者肯定是客户端。因为要建立一个连接,所以客户端在这个消息里面需要提供Client ID, 如果服务端设置了用户名和密码认证,在这个消息里面还必须要包括用户名和密码的相关信息,且如果设置了连接断开的最后遗言(Last Will and Testament),则在这个消息里面还必须包含和最后遗言相关的信息。下面是实验的具体步骤:
图7 Eclipse Paho UI的连接信息配置页面
这个时候WireShark就能抓取到类似于下面的TCP数据包。具体的包如下:
图8 Eclipse Paho UI的WireShark抓包数据
从上面的抓包可知,TCP的三次握手连接之后,MQTT的客户端会发送第一条MQTT的CONNECT消息格式的数据给MQTT服务器。 其具体数据,见上图左下角,10 4e 00 4d 51 54 54 04 ee 00 3c 00 1e 31 31 31 ……….
根据MQTT 的协议,首先咱们来看头部信息。
CONNECT 固定头部
WireShark抓包抓取的固定头部(Fix head)的16进制的数据为:10 4e, 那10 4e这两个字节代表什么意思呢?
首先来看一下,MQTT 的协议对CONNECT 消息固定头部的2个字节的规范和定义。
表4 CONNECT 报文的固定头部(Fixed Header)格式
从这张图片可以知道,MQTT的Connect消息格式中,有一个固定的头部,其是由2个二进制的8位(bit)字节来表示的。
10—表示发送的Connect的请求(也就是二进制的0001 0000, 详细信息,请参考 表3 MQTT的14种消息类型(Command message) )** ,前4个的二进制位是0001,我们可以知道其标识的是一个MQTT CONNECT 消息类型,后面的4个bit是保留位,默认为4个二进制位的0000),MQTT CONNECT的消息格式的第一个字节分析完成。
4e—表示后面将跟着4*16+14=78个字节,也就这个MQTT的消息帧,后面部分还有78个字节,包括10个字节的可变头部(规定是10个字节)和 68个字节的负载(payload)。具体什么是可变头部和什么是消息负载,请继续看下面的分析。
CONNECT 可变头部(10个字节)
接下来的10个字节是:00 04 4d 51 54 54 04 ee 00 3e, 这10个字节,根据MQTT的的规范,是10个字节的可变头部,其MQTT的CONNECT的可变头部主要由四大部分按顺序组成:
协议名称(Protocol Name,)
协议级别(Protocol Level)
连接标志(Connect Flags)
保持心跳(Keep Alive)
下面笔者就把上面通过WireShark抓包抓到的10个字节填充到MQTT的协议可变头部的模板表格中,可变头部的规范马上就一目了然了。
表5 固定头部格式重放
下面对这4部分做进一步的详细分析,首先看协议名称。
协议名称
将本文的Word文档下载到电脑
推荐度: