这里写目录标题

  • 一.对MQTT协议和TCP协议的基本认识
  • 二.TCP与UDP的区别
  • 三.IP,端口号,域名与DNS简介以及之间的关系
  • 四.MQTT报文的格式与剩余长度(可变报头+负载)的计算



##1. MQTT协议与TCP协议在OSI/ISO七层模型的位置?

一.对MQTT协议和TCP协议的基本认识

  1. MQTT协议与TCP协议在OSI/ISO七层模型的位置?
    MQTT协议是属于应用层的协议,建立在处于传输层的TCP协议之上。
  2. 基于MQTT协议传输数据的方式?
    MQTT协议规定了双方之间通信的方式,即彼此之间通过订阅关系(Topic)的方式来实现数据的传输。
    TCP是处于传输层的协议,给使用MQTT协议方式通信的双方提供一条数据传输的通道
  3. 什么是报文?
    基于MQTT协议传输数据的载体,就是报文——将要传输的消息打包而成,其报文的格式也有规范。 基于MQTT协议的报文一共有14种,见下表

二.TCP与UDP的区别

1.TCP为通信双方提供一条持续连接且可靠的通信链路。即通信双方可一直处于连接的状态,且双方互发消息时,互相进行确认来判定消息是否传递成功,消息有来有回,就像我们平时打电话,你问侯对方最近可好,对方回答说好与不好,可以及时收到响应。
2.UDP为通信双方提供一条不持续且不可靠的通信链路。就像我们给别人发短信,发出一条短信之后,对方可能不在没有看到短信,你也无法及时地收到响应,所以这是不可靠的。

三.IP,端口号,域名与DNS简介以及之间的关系

  1. IP相当于我们住房的具体坐标,端口号相当于我们的房间号,域名相当于所在楼房的名字比如说13栋楼房,DNS相当于一个可以根据楼房名称来查询你的居住所在具体坐标的定位器。
  2. 关系

四.MQTT报文的格式与剩余长度(可变报头+负载)的计算

  1. 固定报头
    每个报文包含一固定报头,固定报头可由多个字节byte组成,一个字节8位(7~0),高四位(7 ~ 4)指明了报文的类型(14种报文类型其中之一),低四位用于指定控制报文类型的标志位。
  2. 剩余长度的计算,根据计算例子总结出了以下计算公式。
  3. 上述是已知字节求剩余长度,当然,我们可以根据剩余长度进行逆运算来求字节的十六进制表示,这里计算时是根据如上图字节byte的排列顺序。先计算byte 1,一直到byte n。
    如已知50000

byte1

50000/128/128直到被128整除的最小整数商3 即0x03 (这里除了2次128,可得该数以2+1=3个字节Byte来表示的

byte2

50000减去byte1表示的长度再除以128直到商小于128(50000-128^(3-1)*3)/128取整得6,这个6注意了,就把该6作为该字节的低四位表示的十进制数(0110)-> 0x06 。又由于该字节位为2 (byte2),所以该字节第7为应写1,为什么呢?因为规则就是:以byte1为基准,那么byte1后面字节的第7位都应写1。****10000110 也即0x86

byte3

50000减去byte1和byte2表示的长度:50000-(128 ^ (3-1)*3)/128+128^(3-2)*3)/128(如果结果大于128则要继续除以128直到商小于128,否则直接以十六进制表示。)这里减去后的结果为小于128,直接以十六进制表示为0x50。最后也要注意的是需将第7位写1,最后转为16进制数0xD0。

故50000以由三个字节表示 0xD0 0x86 0x03,可以又上述总结的公式加以验证。