WebSocket协议探究(三):MQTT子协议

一 复习和目标

1 复习

  • Nodejs实现WebSocket服务器
  • Netty实现WebSocket服务器(附带了源码分析)
  • Js api实现WebSocket客户端

注:Nodejs使用的Socket.io模块实现,Netty本身对WebSocket有一定的支持,所以这两种实现都相对容易理解,大家自己可以使用自己喜欢的语言实现(参考Nodejs版本,即不需要考虑过多的情况)。

2 目标

  • 使用WebSocket协议进行发送Mqtt消息
  • 即Mqtt协议作为WebSocket协议的子协议进行通信

注1:WebSocket协议内容不多,但是远远不止这么少。但是学习不要完美主义(即学到一样东西就想着一开始就把这样东西学透),学习要带着目的性。比如:我就是想弄懂为什么前端需要使用WebSocket协议才能发送Mqtt消息?WebSocket为什么需要HTTP协议来进行协议升级协商?HTTP协议为什么基于TCP协议?TCP协议是全双工的为什么HTTP协议不能全双工?等等......

注2:协议目前学习了MQTT、TCP、HTTP和WebSocket,并不是现在学完了,以后就可以不再去学习这些,而是说对于现在的学习目的已经达到了,不需要再花费过多的精力罢了。

二 WireShark抓包

1 WebSocket连接

  • 请求升级协议:HTTP -> WebSocket(mqtt)
# 省略无关头部
Hypertext Transfer Protocol
    GET /mqtt HTTP/1.1\r\n
    Host: 103.61.37.192:8083\r\n
    Sec-WebSocket-Version: 13\r\n
    Sec-WebSocket-Protocol: mqtt\r\n # 子协议为mqtt
    Sec-WebSocket-Extensions: permessage-deflate\r\n
    Sec-WebSocket-Key: npQCPFw1Pc5G9vqjJyi90w==\r\n
    Connection: keep-alive, Upgrade\r\n
    Upgrade: websocket\r\n
    \r\n
  • 响应成功
# 省略无关头部
Hypertext Transfer Protocol
    HTTP/1.1 101 Switching Protocols\r\n
    Connection: Upgrade\r\n
    Content-Length: 0\r\n
    Sec-Websocket-Accept: biw/vsujgvKx8B0bfoDnjuxHMgA=\r\n
    Sec-Websocket-Protocol: mqtt\r\n # 确认子协议为mqtt
    Upgrade: websocket\r\n
    \r\n

2 MQTT建立连接

  • 客户端 -> 服务器:CONNECT

    • 本来MQTT TCP连接可以通过分段或一次传输完成的WebSocket则分成了13次发送
# 发送了13个帧
192.168.1.46    103.61.37.192   WebSocket   WebSocket Binary [FIN] [MASKED]
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0010 = Opcode: Binary (2)
    1... .... = Mask: True
    .000 0001 = Payload length: 1
    Masking-Key: 0c3cb539
    Masked payload
        1C  

# 帧序号    数据
# 1        Data: 10  -> Header Flags:Connect
# 2        Data: 58  -> Msg Len:88
# 3        Data: 0004 -> Protocol Name Length: 4
# 4        Data: 4d515454 -> Protocol Name: MQTT
# 5        Data: 04 -> Version:v3.1.1
# 6        Data: c2
#            1... .... = User Name Flag: Set # 用户名
#            .1.. .... = Password Flag: Set # 密码
#            ..0. .... = Will Retain: Not Set # 遗嘱保留
#            ...0 0... = Qos Level: 0
#            .... .0.. = Will Flag: Not Set # 遗嘱
#            .... ..1. = Clean Session Flag: Set # 清除会话
#            .... ...0 = (Reserverd): Not Set # 固定为0
# 7        Data: 003c -> Keep Alive: 60秒
# 8        Data: 0011 -> Client ID Length: 17
# 9        Data: 6d 71 74 74 6a 73 5f 39 38 33 37 66 65 30 62 61 38 -> ClientId
# 10       Data: 000b -> Username Length
# 11       Data: 64656c696768742f776562 -> Username
# 12       Data: 002c -> Password Length
# 13       Data: 45396a4d58416c35523939596b48756350506c3377545468... -> Password
  • 服务器 -> 客户端:CONNACK
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0010 = Opcode: Binary (2)
    0... .... = Mask: False
    .000 0100 = Payload length: 4
    Data (4 bytes)
        Data: 20 02 00 00
# 20 -> Header Flags:CONNACK
# 02 -> Msg Len:2
# 00 -> Acknowledge Flags: 0x00 # 连接确认标志
# 00 -> Return Code: Connection Accepted (0) # 连接返回码

3 MQTT的PINGREQ和PINGRESP

  • 客户端 -> 服务器:PINGREQ
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0010 = Opcode: Binary (2)
    1... .... = Mask: True
    .000 0010 = Payload length: 2
    Masking-Key: 0657364e
    Data (2 bytes)
        Data: c000 

# C0 -> Header Flags: 0xC0 (Ping Request)
# 00 -> Msg Len: 0
  • 服务器 -> 客户端 :PINGRESP
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0010 = Opcode: Binary (2)
    0... .... = Mask: False
    .000 0010 = Payload length: 2
    Data (2 bytes)
        Data: d000

# D0 -> Header Flags: 0xD0 (Ping Response)
# 00 -> Msg Len: 0

4 MQTT的SUBSCRIBE和SUBACK

  • 客户端 -> 服务器:SUBSCRIBE
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0010 = Opcode: Binary (2)
    1... .... = Mask: True
    .000 0001 = Payload length: 1
    Masking-Key: d0f56152
    Data (1 byte)
        Data: 82

# 帧序号    数据
# 1        Data: 82  -> Header Flags: Subscribe Request
# 2        Data: 0b  -> Msg Len:11
# 3        Data: a5b2 -> Message Identifier: a5b2
# 4        Data: 0006 ->  Topic Length: 6
# 5        Data: 2f 57 6f 72 6c 64 -> Topic:/World
# 6        Data: 00 -> Requested QoS:0
  • 服务器 -> 客户端 :SUBACK
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0010 = Opcode: Binary (2)
    0... .... = Mask: False
    .000 0101 = Payload length: 5
    Data (5 bytes)
        Data: 9003a5b200

# 90 ->  Header Flags: Subscribe Ack
# 03 -> Msg Len: 3
# a5b2 -> Message Identifier:a5b2
# 00 -> 成功

5 MQTT的PUBLISH(Qos0)

# 帧序号    数据
# 1        Data: 30 -> Header Flags: Publish Message
# 2        Data: 0d ->  Msg Len: 13
# 3        Data: 0006 -> Topic Length:6
# 4        Data: 2f 57 6f 72 6c 64 ->  Topic:/World
# 5        Data: 68 65 6c 6c 6f -> Message:hello

6 MQTT的DISCONNECT

WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0010 = Opcode: Binary (2)
    1... .... = Mask: True
    .000 0010 = Payload length: 2
    Masking-Key: d70088a5
    Data (5 bytes)
        Data: e000

# e0 -> Header Flags: Disconnect
# 00 -> Msg Len: 0

注1:MQTT报文格式请参考MQTT协议探究(一) MQTT协议探究(二)

注2:MQTT其他报文就不做贴出来了,请自行测试。

注3:协议的学习基本完成,后面结合Netty来加深对协议的复习和补充。

原文地址:https://www.cnblogs.com/linzhanfly/p/10108094.html

时间: 2024-10-08 06:28:41

WebSocket协议探究(三):MQTT子协议的相关文章

IoT网关协议比较:MQTT,CoAp,XMPP,MBUS,OPC UA

物联网(IoT,或者说工业互联网)的基础在于设备之间的通信,通信协议在将海量设备连接到互联网时发挥着重要作用.本文介绍IoT中的通信/通讯协议,并对常用的协议如:MQTT, CoAp, OPC UA, Modbus, Profinet ,介绍其特点,并进行比较,说明协议的适用场景.先上一张大图. IoT中的常用协议 MQTT MQTT全称消息队列遥测传输(Message Queue Transfering Transport),是一种轻量级,可扩展的互联网协议,可用于支持物联网全局通信.MQTT

TCP/IP协议简介(三) 之 网络层

IP 网际协议 IP 协议位于网络层,它是 TCP/IP 协议族中最为核心的协议,所有的 TCP.UDP.ICMP 及 IGMP 数据都以 IP 数据报格式传输.IP 协议提供的是 不可靠 . 无连接 的数据报传送服务. 不可靠(unreliable):IP 协议不能保证数据报能成功地到达目的地,它仅提供传输服务.当发生某种错误时,IP 协议会丢弃该数据报.传输的可靠性全由上层协议来提供. 无连接(connectionless):IP 协议对每个数据报的处理是相互独立的.这也说明, IP 数据报

Linkit 7688 DUO(六) 加入MQTT物联网协议

Linkit 系列博文: 联发科Linkit 7688 (一) 上手及在Mac下搭建OpenWrt交叉编译环境,C语言编译Hello,World 联发科Linkit 7688 (二)GPIO基本操作与C语言编程 联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器 Linkit 7688 DUO(四): 接上各种Arduino传感器和模块--基础篇 Linkit 7688 DUO(五) 接上各种Arduino传感器和模块-扩展篇 Linkit 7688 DUO(六

通信原理之IP协议,ARP协议 (三)

把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数据信息. 1.IP协议 IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输.要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCP或UDP要做的事情.所以这也就出现了TCP是一个可靠的协议

TCP协议的三次握手+四次断开

TCP协议的三次握手 1.TCP/IP协议概述 TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础.TCP/IP是网络中使用的基本的通信协议.虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录.文件传输和电子邮件等,而TCP协议和IP协议是保证数

tcp/ip协议第三章 ip:网际协议

tcp/ip协议第三章读后总结 ip是tcp/ip协议族中最为核心的协议.ip提供不可靠传输,不可靠的意思是它不保证ip数据包能成功的到达目的地.ip仅提供最好的传输服务.任何要求的可靠性必须由上层来提供(如tcp) 子网的划分缩小了internet路由表的规模,因为许多网络经常可以通过单个表目就可以访问了. 接口网络的有关信息通过ifcongif和netstat命令可以获得,包括接口的ip地址.子网掩码.广播地址.以及mtu等

TCP/IP网络编程、三次握手协议及socket编程

1.概念 2.三次握手协议

【Web探索之旅】第三部分第三课:协议

内容简介 1.第三部分第三课:协议 2.第四部分预告:Web程序员 第三部分第三课:协议 之前的课,我们学习了Client-Server模型的客户端语言和服务器语言. 客户端语言有HTML,CSS和JavaScript. 服务器语言有PHP,Java,Python,Ruby,C#,还有新兴的Go语言(Google推出的很强大的编程语言). 不过,要使得Web中这么多机器之间能够相互通信,例如 客户机A对服务器E说:"你好,请发送baidu.com这个网页给我",是不能借助客户端或服务器

Rsyslog的三种传输协议简要介绍

rsyslog的三种传输协议 rsyslog 可以理解为多线程增强版的syslog. rsyslog提供了三种远程传输协议,分别是: 1. UDP 传输协议 基于传统UDP协议进行远程日志传输,也是传统syslog使用的传输协议: 可靠性比较低,但性能损耗最少, 在网络情况比较差, 或者接收服务器压力比较高情况下,可能存在丢日志情况. 在对日志完整性要求不是很高,在可靠的局域网环境下可以使用. 2.TCP 传输协议 基于传统TCP协议明文传输,需要回传进行确认,可靠性比较高: 但在接收服务器宕机