对mqtt协议Qos2服务质量等级的理解

publish报文

publish报文的发生方向

发生的方向是:双向的,既可以从客户端发往服务器端,又可以从服务器端发往客户端。

客户端使用 PUBLISH 报文发送应用消息给服务端, 目的是分发到其它订阅匹配的客户端。
服务端使用 PUBLISH 报文发送应用消息给每一个订阅匹配的客户端。

publish报文的结构

固定报头:
   1、固定报头中的重发标志dup:
              如果是第一次发送此报文,则置dup=0
              如果是重发报文, 则置dup=1
  2、服务质量等级
               Qos=0
               Qos=1
               Qos=2
  3、保留标志
         保留标志的可选值:  retain=1    retain=0


可变报头:
  1、主题名 topicName
  2、报文标识符,只有当Qos=1或2时,pub报文中才有报文标识符
有效载荷
      由应用指定的数据

Qos1级别的publish报文

服务质量Qos1会确保消息至少送达一次。Qos1的publish报文的可变报头中包含一个报文标识符,需要pubAck报文确认。

对于Qos1的分发协议,发送者:

- 每次发送新的应用消息都分配一个未使用的报文标识符

- 发送的publish报文必须包含报文标识符且Qos等于1,dup等于0。

- 必须将这个publish报文看作是未确认的,直到从接收者那里收到对应的pubAck报文

对于Qos1的分发协议的接收者:

  • 响应的pubAck报文必须包含一个报文标识符,这个标识符来自接收到的,已经接收所有权的
    publish报文

  • 发送pubAck报文之后,接收者必须将任何包含相同报文标识符的入站publish报文当作一个新的
    消息,并忽略它的DUP标志的值

Qos1的协议的交互流程图

下面这张图是:Qos1的交互流程图:


mqttQos1报文交互 (3).jpg

Qos1级别的pub报文的缺陷

消息重复的问题

在上图中,我们可以看到,对于发送方来说,当它发送一个pub报文时,它会一直等待着来自对方(接收方)的消息确认报文pubAck。只有收到pubAck报文之后,它才认为该pub报文已经发送成功,否则,就会执行重试。
即: 再次发送该pub报文给客户端直到收到pubAck确认已经发生成功为止。

但是,这里有个问题,那就是: 如果接收方已经收到了pub报文,而且它也把pubAck报文发送出去了,但是由于网络状况太差或者其他原因,导致了这个pubAck报文丢失了,发送方接收不到来自接收方的pubAck确认报文。
于是,发送方就会对此pub报文进行二次重发,这样的话,接收方就又收到了一条和原来一模一样的pub报文,实际上由于接收方之前就已经收到并处理过该报文了,所以这次报文对接收方来说,就是一条重复报文。

可见,导致重复消息的原因就是: pubAck报文在网络传输中丢失造成的。

Qos2解决Qos1的重复消息问题

Qos2是最高的服务质量等级,消息丢失和重复都是不可接收的。但是使用这个服务质量等级会有额外的开销。

两步确认过程

Qos2的pub报文的接收者使用一个两步确认过程来确认收到。

发送方和接收方的处理

对于Qos2的发送方来说:

  . 必须要给要发送的新应用消息分配一个未使用的报文标识符。

  . 发送的pub报文必须包含报文标识符且报文的Qos等于2,dup等于0.

  . 必须将这个pub报文看作是未确认的,直到从接收者那收到pubRec报文。

  . 收到pubRec报文后必须发送一个pubRel报文,pubRel报文必须包含与原始的pub报文相同的报文标识符

  . 必须将这个pubRel报文看作是未确认的,直到从接收者那收到对应的pubComp报文

  . 一旦发送了对应的pubRel报文就不能重发这个publish报文了。

对于Qos2的接收者来说:

. 响应的pubRec报文必须包含报文标识符,这个标识符来自接收到的、已经接收所有权的publish报文。

. 在收到对应的pubRel报文之前,接收者必须发送pubRec报文确认任何后续的具有相同标识符的pub报文。

. 响应的pubRel报文的pubComp报文必须包含与pubRel报文相同的报文标识符

. 发送pubComp报文之后,接收者必须将包含相同报文标识符的任何后续的pub报文当做一个新的发布。  

Qos2的交互流程

mqttQos2报文交互 .jpg

我们知道,Qos1的消息重复问题的根源在于:pubAck报文的丢失导致。

所以,如果我们要解决消息的重复问题,就必须致力于解决 pubAck报文的丢失问题,在Qos2中,对应的就是pubRec报文的丢失问题。
即:确保发送方一定可以收到来自接收方的pubRec报文。所以这里就引出了:2步确认过程。

step1:  第一次使用应答机制来对pub报文进行确认,从而确保接收方一定可以接收到pub报文。

step2:  第二次使用应答机制来对pubRec报文进行确认,从而确保发送方一定可以接收到pubRec报文。

可见:

1、pubRec 是对pub的保证,确保pub不会丢失
2、pubRel 是pubRec的保证,确保pubRec不会丢失
3、pubComp是pubRel的保证,确保pubRel不会丢失


如果sender没有收到pubRec,就要重发该pub。

如果receiver没有收到pubRel,就会重发pubRec。

如果sender没有接收到pubComp,就会重发pubRel。


  • 对于接收方来说,收到pubRel报文之后,它的使命就完成了。(即: 它不仅收到了pub消息,而且确信自己也已把pubRec报文送到了发送方。)

  • 对于发送方来说,收到了pubRec报文,就意味着,pub报文已经被接收方确定接收了。收到了pubComp报文,就意味着,pubRel报文已经确定被接收方接收了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容