MQtt協(xié)議的一點總結(jié)之QoS的不完美處理

2019-04-19
看了4.3服務(wù)質(zhì)量級別(Quality of Service levels)的介紹,覺得QoS1和QoS2的協(xié)議應(yīng)該存在一些漏洞(或者說是不完美)取逾。

  • QoS1的不完美
    QoS1是至少投遞成功一次( At least once delivery),確保消息一定發(fā)送給接收者友扰。 需要兩次握手农猬。
    QoS1消息發(fā)送的過程是這樣的:
    1.消息發(fā)送者發(fā)送PUBLISH包(包含一個未使用的PackId),并等待接收者返回PUBREC包探遵;
    2.接收者接收到PUBLISH包,處理這個包妓柜,并響應(yīng)一個PUBREC包給發(fā)送者箱季。此后,對于后續(xù)的具有相同的PackId的PUBLISH包都要作為新的消息處理棍掐,并且不用管該包的DUP標志藏雏。
    3.發(fā)送者收到同一個PackId的PUBREC包,結(jié)束掉這個PackId的消息作煌。之后可以重復(fù)使用該PackId作為新消息包的識別值掘殴。
    QoS1消息的不完美之處的分析:
    鑒于上述的2、3點粟誓,發(fā)送者由于某些原因(比如長時間沒有收到接收者返回的PUBREC)對同一個PackId的包重復(fù)發(fā)送了多次奏寨,接收者接收到了一次PUBLISH進行處理后又接收到了發(fā)送者重復(fù)發(fā)送的PUBLISH,由于第2點的規(guī)定鹰服,對其進行了第二次的處理病瞳,這個問題是QoS1級別本身就不打算解決的揽咕,所以要避免這個問題需要使用QoS2消息級別。但我要說的不完美不是這一點套菜,而是可能出現(xiàn)的同一個PackId被重用之后的新消息沒有被接收者真正的接收到亲善。試想,如果第一次的PUBLISH消息被接收者重復(fù)處理了并返回了多個PUBREC給發(fā)送者逗柴,發(fā)送者接收到了其中一個PUBREC蛹头,結(jié)束了第一次的PUBLISH消息,又重用這個PackId發(fā)送新的PUBLISH消息戏溺,但同時原來的PUBLISH的多個PUBREC中的一個返回到了發(fā)送者渣蜗,此時新的PUBLISH還沒被接收者接收到,但發(fā)送者誤認為現(xiàn)在接收到PUBREC是接收者對新的PUBLISH的響應(yīng)旷祸,就將新的那個PUBLISH消息結(jié)束掉了袍睡。這種情況下,如果接收者沒有接到新的PUBLISH包就永遠不會可能再接收到了肋僧,因為發(fā)送者誤以為接收者已接收到,不會重復(fù)發(fā)送這個新的PUBLISH消息了控淡。
  • QoS2的不完美
    QoS2是只正確的投遞一次( Exactly once delivery)嫌吠,保證消息有且只有一次成功的投遞。需要四次握手掺炭,兩次響應(yīng)辫诅。
    QoS2的傳遞過程:
  1. 消息發(fā)送者發(fā)送PUBLISH包(包含一個未使用的PackId),并等待接收者返回PUBREC包涧狮;在未接到PUBREL之前炕矮,對于后續(xù)接收的PUBLISH都必須要響應(yīng)一個PUBREC,但此時不能造成多個消息傳遞給發(fā)送者者冤。
  2. 接收者接收到PUBLISH包肤视,處理這個包,響應(yīng)一個PUBREC包涉枫。并等待PUBREL包邢滑;
  3. 發(fā)送者收到同一個PackId的PUBREC包,響應(yīng)一個PUBREL包愿汰,并等待PUBCOMP困后。此時,發(fā)送者不能發(fā)送PUBLISH衬廷。
  4. 接收者接收到PUBREL包摇予,響應(yīng)一個PUBCOMP吗跋。之后接收到的相同的PackId的PUBLISH需要作為新的消息處理侧戴。
    5.接收者接收到PUBCOMP后,結(jié)束消息。之后可以重復(fù)使用PackId.
    QoS2消息的不完美之處的分析:
    對于同一消息發(fā)送者多次發(fā)送了救鲤,由于某些因素(比如網(wǎng)絡(luò)延遲)久窟,其中一次到達接收者的時間晚于其他次發(fā)送的,前面到達的早已被接收者處理過了(早和發(fā)送者完成后續(xù)的握手動作了)本缠,因此這個消息會被接收者重復(fù)處理斥扛。

QoS1和QoS的不完美的解決想法

對于QoS1,只要發(fā)送者不短時間內(nèi)重用相同的PackId就可以避免了丹锹。對于QoS2稀颁,需要發(fā)送者不短時間內(nèi)重用相同的PackId,同時需要接收者在短時間接收到一個剛處理完的PackId消息棄置不理(發(fā)送者會重復(fù)發(fā)送消息楣黍,不會造成新信息接收不到的)匾灶。

參考:http://mqtt.org/documentation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市租漂,隨后出現(xiàn)的幾起案子阶女,更是在濱河造成了極大的恐慌,老刑警劉巖哩治,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秃踩,死亡現(xiàn)場離奇詭異,居然都是意外死亡业筏,警方通過查閱死者的電腦和手機憔杨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒜胖,“玉大人消别,你說我怎么就攤上這事√ㄐ唬” “怎么了寻狂?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長对碌。 經(jīng)常有香客問我荆虱,道長,這世上最難降的妖魔是什么朽们? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任怀读,我火速辦了婚禮,結(jié)果婚禮上骑脱,老公的妹妹穿的比我還像新娘菜枷。我一直安慰自己,他們只是感情好叁丧,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布啤誊。 她就那樣靜靜地躺著岳瞭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚊锹。 梳的紋絲不亂的頭發(fā)上瞳筏,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音牡昆,去河邊找鬼姚炕。 笑死,一個胖子當著我的面吹牛丢烘,可吹牛的內(nèi)容都是我干的柱宦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼播瞳,長吁一口氣:“原來是場噩夢啊……” “哼掸刊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赢乓,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忧侧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牌芋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苍柏,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年姜贡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棺棵。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡楼咳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烛恤,到底是詐尸還是另有隱情母怜,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布缚柏,位于F島的核電站苹熏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏币喧。R本人自食惡果不足惜轨域,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杀餐。 院中可真熱鬧干发,春花似錦、人聲如沸史翘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至必峰,卻和暖如春洪唐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吼蚁。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工凭需, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桂敛。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓功炮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親术唬。 傳聞我的和親對象是個殘疾皇子薪伏,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容