Mqtt Qos 深度解讀

1.QoS含義 :

Quality of Service,服務質量

2.作用域

發布者的Qos
訂閱者的Qos

3.等級與作用

level 0:最多一次的傳輸
level 1:至少一次的傳輸,(雞肋)
level 2: 只有一次的傳輸

4.交互過程

qos0

對于qos1而言,對于client而言,有且僅發一次publish包,對于broker而言,有且僅發一次publish,簡而言之,就是僅發一次包,是否收到完全不管,適合那些不是很重要的數據

qos0.png

qos1

對于qos0而言,這個交互就是多了一次ack的作用,但是會有個問題,盡管我們可以通過確認來保證一定收到客戶端或服務器的message,但是我們卻不能保證message僅有一次,也就是當client沒收到service的puback或者service沒有收到client的puback,那么就會一直發送publisher

流程:(publisher -> broker)

  1. publisher store msg -> publish ->broker (傳遞message)
  2. broker -> puback -> publisher delete msg (確認傳遞成功)

注意:

  1. publisher必須保存msg,這樣才能在重發
  2. publisher如果在一定時間或socket斷開等異常情況,會繼續重發msg
qos1.png

qos2

對于qos1而言,qos2可以實現僅僅接受一次message,其主要原理(對于publisher而言),
publisher和broker進行了緩存,其中publisher緩存了message和msgID,而broker緩存了msgID,兩方都做記錄所以可以保證消息不重復,但是由于記錄是需要刪除的,這個刪除流程同樣多了一倍

流程:(publisher -> broker)

  1. publisher store msg -> publish ->broker -> broker store msgID(傳遞message)
  2. broker -> puberc (確認傳遞成功)
  3. publisher -> pubrel -> broker delete msgID (告訴broker刪除msgID)
  4. broker -> pubcomp -> publisher delete msg (告訴publisher刪除msg)

注意:

  1. 第二步,即puberc不可以刪除 publisher的msg,因為第三步未必成功,這個時候就需要第一步提醒第二步繼續發,而提醒必須要msgID
qos2.png

5.問題

1.為什么 qos2不是3次,不和tcp握手一致

2.Qos對協議的影響

6.參考

qos等級
qos交互過程

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容