在物聯(lián)網(wǎng)應(yīng)用中為何使用 MQTT 而不是 HTTP協(xié)議頭呢
今天我們探討的問(wèn)題是:在物聯(lián)網(wǎng)(IoT)應(yīng)用中,為何通常更傾向于使用MQTT而非HTTP協(xié)議呢?
MQTT屬于一種輕量級(jí)的消息傳輸協(xié)議,其協(xié)議頭相當(dāng)簡(jiǎn)潔。正常情況下,MQTT的固定頭部?jī)H有2個(gè)字節(jié),用來(lái)標(biāo)識(shí)消息類(lèi)型、QoS(服務(wù)質(zhì)量)等級(jí)等基本信息。在某些特定的消息類(lèi)型里,也許會(huì)存在可變頭部與消息體,不過(guò)整體結(jié)構(gòu)較為緊湊。

然而HTTP協(xié)議的消息頭則相對(duì)復(fù)雜一些。即便是最簡(jiǎn)單的HTTP請(qǐng)求,例如“GET”請(qǐng)求,其頭部信息也包含請(qǐng)求方法、URL、協(xié)議版本、主機(jī)信息、用戶代理等諸多字段。一般而言,一個(gè)基本的HTTP頭部大小可能會(huì)達(dá)到幾百字節(jié)。
下面我們就來(lái)說(shuō)說(shuō)這兩者在物聯(lián)網(wǎng)應(yīng)用中的具體差異。
一、傳輸模式
MQTT運(yùn)用發(fā)布/訂閱模式。設(shè)備充當(dāng)發(fā)布者(Publisher),把數(shù)據(jù)發(fā)布至特定的主題(Topic),而訂閱者(Subscriber)只需訂閱自身感興趣的主題,就能接收相關(guān)數(shù)據(jù)。在此種模式下,數(shù)據(jù)傳輸基于事件驅(qū)動(dòng)。只要存在訂閱這些主題的應(yīng)用程序或者設(shè)備,就能夠?qū)崟r(shí)接收數(shù)據(jù)。并且,在設(shè)備狀態(tài)無(wú)變化時(shí),無(wú)需發(fā)送額外的數(shù)據(jù),從而減少了不必要的網(wǎng)絡(luò)流量。
2、HTTP
HTTP屬于典型的請(qǐng)求/響應(yīng)模式??蛻舳耍ㄒ话銥槲锫?lián)網(wǎng)設(shè)備或者用戶端應(yīng)用)要向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器依據(jù)請(qǐng)求內(nèi)容予以響應(yīng)。這表明每次獲取或者更新數(shù)據(jù),都需要完整的請(qǐng)求 - 響應(yīng)流程。服務(wù)器收到請(qǐng)求后返回設(shè)備的狀態(tài)信息。若要頻繁獲取設(shè)備狀態(tài),就需不斷發(fā)送請(qǐng)求,每個(gè)請(qǐng)求均帶有完整的頭部信息,這會(huì)產(chǎn)生大量的重復(fù)數(shù)據(jù)傳輸,占用較多帶寬。
二、數(shù)據(jù)傳輸效率
因?yàn)镸QTT協(xié)議簡(jiǎn)潔,并且采用高效的發(fā)布/訂閱模式,所以在傳輸數(shù)據(jù)時(shí)能更有效地利用網(wǎng)絡(luò)帶寬。尤其在傳輸小數(shù)據(jù)量的物聯(lián)網(wǎng)應(yīng)用場(chǎng)景下,例如傳感器數(shù)據(jù)的定期上報(bào)時(shí),MQTT的優(yōu)勢(shì)更為顯著。每次傳輸?shù)臄?shù)據(jù)主要為電量數(shù)值,協(xié)議開(kāi)銷(xiāo)小,能夠快速、高效地完成數(shù)據(jù)傳輸,從而減少網(wǎng)絡(luò)帶寬的占用。
2、HTTP
HTTP的效率比較低,在頻繁進(jìn)行數(shù)據(jù)交互的場(chǎng)景中尤其如此。由于每次請(qǐng)求與響應(yīng)都要傳輸大量的頭部信息,即便數(shù)據(jù)本身可能很少,也會(huì)讓整體的數(shù)據(jù)傳輸量變大。這些多余的頭部信息會(huì)降低傳輸效率,占用較多的網(wǎng)絡(luò)帶寬。
三、連接建立過(guò)程
MQTT協(xié)議構(gòu)建于TCP協(xié)議之上,當(dāng)設(shè)備與服務(wù)器之間的連接建立起來(lái)后,此連接能夠長(zhǎng)時(shí)間維持。這種長(zhǎng)連接機(jī)制讓設(shè)備在有數(shù)據(jù)傳輸需求時(shí),僅需發(fā)送簡(jiǎn)單消息,而不必重新建立連接。連接建立的開(kāi)銷(xiāo)只在初始階段出現(xiàn),后續(xù)的數(shù)據(jù)交互會(huì)更加迅速。
2、HTTP
HTTP屬于一種無(wú)狀態(tài)協(xié)議,每一次數(shù)據(jù)請(qǐng)求都得重新建立連接。這一過(guò)程會(huì)涉及到TCP的三次握手,從而產(chǎn)生一定的延遲。每一回通信都要重新構(gòu)建一條通信鏈路,其中包含發(fā)送請(qǐng)求頭、等待服務(wù)器響應(yīng)等步驟,這使得延遲相對(duì)較高。
四、消息推送機(jī)制
MQTT采用發(fā)布/訂閱模式,服務(wù)器可主動(dòng)向訂閱特定主題的設(shè)備推送消息。這種實(shí)時(shí)推送機(jī)制讓設(shè)備能在第一時(shí)間接收到重要信息。借助MQTT,服務(wù)器能夠?qū)崿F(xiàn)實(shí)時(shí)的事件通知,延遲可控制在很低的水平,一般能在幾百毫秒內(nèi)完成消息推送。
2、HTTP
HTTP自身并不具備主動(dòng)推送消息的功能。在物聯(lián)網(wǎng)應(yīng)用場(chǎng)景下,若要獲取設(shè)備的最新?tīng)顟B(tài)或者接收來(lái)自服務(wù)器的通知,往往需要運(yùn)用輪詢的方式。這種輪詢方式所產(chǎn)生的延遲取決于輪詢的間隔時(shí)長(zhǎng),并且在兩次輪詢的間隙可能會(huì)遺漏實(shí)時(shí)消息,實(shí)時(shí)性不佳。
五、數(shù)據(jù)更新效率
因?yàn)樵O(shè)備與服務(wù)器之間為長(zhǎng)連接,而且消息格式較為簡(jiǎn)潔,所以當(dāng)設(shè)備狀態(tài)改變時(shí),MQTT能夠迅速地把更新后的狀態(tài)信息發(fā)送至服務(wù)器,整個(gè)過(guò)程的延遲比較低,非常好地滿足實(shí)時(shí)性要求。
2、HTTP
HTTP 每次更新數(shù)據(jù)都需要完整的請(qǐng)求 - 響應(yīng)過(guò)程,這使得數(shù)據(jù)更新效率相對(duì)較低。尤其是在需要頻繁更新少量數(shù)據(jù)的情況下,由于每次都要建立連接和傳輸完整的請(qǐng)求頭,會(huì)導(dǎo)致設(shè)備狀態(tài)的更新不能及時(shí)反映在用戶界面或者其他相關(guān)設(shè)備上,實(shí)時(shí)性大打折扣。
六、可靠性
發(fā)布訂閱模式:即便處于網(wǎng)絡(luò)連接不穩(wěn)定的狀況下,也可達(dá)成數(shù)據(jù)的可靠傳輸。當(dāng)設(shè)備離線時(shí),MQTT會(huì)把數(shù)據(jù)存儲(chǔ)于隊(duì)列之中,直至設(shè)備重新上線時(shí)再予以發(fā)送。
自動(dòng)重連機(jī)制:具備自動(dòng)重連機(jī)制,即便網(wǎng)絡(luò)斷開(kāi),也能夠自動(dòng)恢復(fù)連接,確保消息得以可靠傳輸。
QoS機(jī)制:提供三種等級(jí)的服務(wù)質(zhì)量,范圍從至多一次到恰好一次不等,能夠依據(jù)不同的應(yīng)用場(chǎng)景以及數(shù)據(jù)的重要性,選擇適宜的QoS等級(jí),以保證消息的可靠傳遞。
2、HTTP
本身不具備消息保證機(jī)制:HTTP自身并不提供消息重發(fā)或者持久化機(jī)制,通常這些問(wèn)題需要應(yīng)用層自行處理。
基于TCP的可靠性:主要依靠TCP協(xié)議自身的可靠性確保數(shù)據(jù)傳輸?shù)耐暾耘c順序性,不過(guò)在網(wǎng)絡(luò)不穩(wěn)定或者出現(xiàn)故障的時(shí)候,或許需要應(yīng)用層進(jìn)行額外的處理并設(shè)置重試機(jī)制。
無(wú)狀態(tài)性的限制:因?yàn)镠TTP是無(wú)狀態(tài)的,每個(gè)請(qǐng)求均相互獨(dú)立,服務(wù)器不會(huì)留存之前請(qǐng)求的任何信息,在一些需要連續(xù)進(jìn)行數(shù)據(jù)傳輸與處理的物聯(lián)網(wǎng)場(chǎng)景下,這可能會(huì)對(duì)數(shù)據(jù)的連貫性和可靠性產(chǎn)生影響。
七、安全性
支持TLS/SSL加密協(xié)議:這能夠確保數(shù)據(jù)傳輸過(guò)程中的安全性,防止數(shù)據(jù)遭受篡改與竊取。同時(shí),MQTT 5.0還引入了增強(qiáng)認(rèn)證機(jī)制以提供雙向的身份確認(rèn)。
認(rèn)證與授權(quán):通過(guò)用戶名、密碼字段實(shí)現(xiàn)對(duì)密碼認(rèn)證和Token認(rèn)證的支持,從而確保只有合法設(shè)備能夠接入MQTT代理,并且能夠檢查接入者可執(zhí)行的操作,例如可以將消息發(fā)布到哪些主題以及能夠從哪些主題獲取消息。
2、HTTP
HTTPS:借助HTTPS協(xié)議,于HTTP之上添加SSL/TLS層,以確保數(shù)據(jù)在客戶端與服務(wù)器之間加密傳輸,達(dá)成數(shù)據(jù)加密、身份驗(yàn)證以及數(shù)據(jù)完整性保護(hù)的目的。
安全配置:需采用更為復(fù)雜的安全舉措,例如安全HTTP頭部、安全的身份驗(yàn)證機(jī)制等,從而提升Web應(yīng)用的安全性,防范跨站腳本攻擊、跨站請(qǐng)求偽造等情況。
八、擴(kuò)展性
多對(duì)多通信模式:支持多對(duì)多通信模式,這一模式十分契合大規(guī)模物聯(lián)網(wǎng)設(shè)備的連接與數(shù)據(jù)交互需求,能夠輕松擴(kuò)展至大型系統(tǒng)。例如,在智能家居系統(tǒng)中,多個(gè)傳感器與設(shè)備可借助MQTT協(xié)議相互通信并協(xié)同工作。
輕量級(jí)協(xié)議:MQTT的輕量級(jí)協(xié)議讓實(shí)現(xiàn)MQTT庫(kù)的成本較低,易于移植到不同平臺(tái),方便在各類(lèi)物聯(lián)網(wǎng)設(shè)備中集成與應(yīng)用,為系統(tǒng)擴(kuò)展提供了方便。
2、HTTP
可擴(kuò)展性:HTTP協(xié)議自身具備一定的可擴(kuò)展性,能夠借助附加頭部字段與參數(shù)來(lái)擴(kuò)展功能,例如認(rèn)證信息、緩存控制等。不過(guò),在物聯(lián)網(wǎng)應(yīng)用場(chǎng)景下,針對(duì)大規(guī)模設(shè)備連接以及實(shí)時(shí)數(shù)據(jù)傳輸?shù)那樾?,HTTP的擴(kuò)展性就相對(duì)較差。
基于Web的擴(kuò)展:主要應(yīng)用于基于Web的應(yīng)用和服務(wù)擴(kuò)展,與現(xiàn)有的Web技術(shù)和架構(gòu)有較好的兼容性,但是在處理物聯(lián)網(wǎng)設(shè)備之間復(fù)雜的通信以及大規(guī)模連接時(shí),或許會(huì)遭遇性能與可擴(kuò)展性方面的挑戰(zhàn)。
九、功耗
MQTT協(xié)議專為低功耗目標(biāo)而設(shè)計(jì)。它在設(shè)計(jì)時(shí)考慮到了資源受限設(shè)備與低帶寬網(wǎng)絡(luò)環(huán)境的情況,目的在于實(shí)現(xiàn)設(shè)備間的可靠通信。該協(xié)議能夠保持長(zhǎng)連接,在空閑時(shí)處于低功耗狀態(tài),從而節(jié)省設(shè)備能源,延長(zhǎng)電池供電設(shè)備的使用壽命。
2、HTTP
HTTP協(xié)議在設(shè)計(jì)之時(shí)并未著重考量低功耗這一因素。其頭部信息較為完整且規(guī)模偏大,在應(yīng)對(duì)頻繁的小數(shù)據(jù)交換時(shí),會(huì)造成較大的資源損耗。每一次HTTP請(qǐng)求均需構(gòu)建新的連接,并且在請(qǐng)求完成之后斷開(kāi)連接。這種連接構(gòu)建與斷開(kāi)的流程會(huì)消耗一定的能量,在物聯(lián)網(wǎng)設(shè)備中更是如此,這種頻繁的連接操作會(huì)大幅提升功耗。

MQTT在物聯(lián)網(wǎng)應(yīng)用中的傳輸模式、傳輸效率、連接建立過(guò)程、消息推送機(jī)制、數(shù)據(jù)更新效率、可靠性、安全性、擴(kuò)展性、功耗等多個(gè)方面具備一定的優(yōu)勢(shì)。這些優(yōu)勢(shì)讓MQTT成為連接眾多物聯(lián)網(wǎng)設(shè)備的理想之選,特別是在資源受限的情況下。與之相比,HTTP協(xié)議在物聯(lián)網(wǎng)場(chǎng)景里就顯得較為臃腫,不適用于對(duì)實(shí)時(shí)性和資源使用高效性有極高要求的應(yīng)用。