MQTT比TCP協(xié)議好在哪兒?就好比汽車底盤上有四個(gè)輪胎就能跑了,但是想要大家開車更舒服,我們還是得給底盤加個(gè)殼。
為什么要在 TCP 協(xié)議之上再封裝一層 MQTT 協(xié)議呢?
舉個(gè)例子,如果你要用 TCP 協(xié)議做一個(gè)即時(shí)聊天室,那么你:
上面這個(gè)例子,在連接服務(wù)器(檢查合法性、斷開連接)、訂閱主題(加入聊天室)、發(fā)布消息這些過程中,你約定的報(bào)文格式和設(shè)計(jì)的服務(wù)器處理邏輯就是 MQTT 協(xié)議的內(nèi)容,當(dāng)然我舉的例子非常粗糙。
MQTT是一個(gè)客戶端服務(wù)端架構(gòu)的發(fā)布/訂閱模式的消息傳輸協(xié)議。它的設(shè)計(jì)思想是輕巧、開放、簡單、規(guī)范,因此易于實(shí)現(xiàn)。這些特點(diǎn)使得它對很多場景來說都是很好的選擇,包括受限的環(huán)境:如機(jī)器與機(jī)器的通信(M2M)以及物聯(lián)網(wǎng)環(huán)境(IoT),這些場景要求很小的代碼封裝或者網(wǎng)絡(luò)帶寬非常昂貴。
MQTT的優(yōu)點(diǎn)是:
1)具備實(shí)時(shí)性,設(shè)備控制速度可以在200ms以內(nèi);
2)設(shè)計(jì)簡單、輕巧、便于實(shí)現(xiàn);
3)占用資源少,非常適合在資源受限的物聯(lián)網(wǎng)芯片上運(yùn)行
當(dāng)然,它的缺點(diǎn)也很明顯:
1)基于TCP/IP,對網(wǎng)絡(luò)環(huán)境要求相對較高;
2)TCP存在RST攻擊,容易被運(yùn)營商攔截;
3)TCP資源相對UDP消耗大,需要建立連接、維護(hù)連接、釋放連接
首先TCP是傳輸層協(xié)議,實(shí)現(xiàn)了一個(gè)雙向的通信鏈路。
MQTT是基于TCP的應(yīng)用層協(xié)議。(當(dāng)然中間可能多一層,websocket)
兩者不在一個(gè)層級,比較誰比誰好是沒有意義的。
TCP 也可以實(shí)現(xiàn)數(shù)據(jù)通信,比如發(fā)送傳感器數(shù)據(jù)到服務(wù)器。為什么要用到MQTT呢 ?
假設(shè)現(xiàn)在有一個(gè)物聯(lián)網(wǎng)的應(yīng)用,當(dāng)然可以直接用TCP socket 做通信,實(shí)際上不少人也是這么做的。然后你就會(huì)發(fā)現(xiàn):
* 需要自己寫確認(rèn)重傳的機(jī)制,因?yàn)門CP 連接說不定就斷了。
* 如果有很多個(gè)傳感器(生產(chǎn)者),又要寫代碼管理這么多TCP連接呢。
* 如果同時(shí)又有多個(gè)地方需要用到這些數(shù)據(jù),還得寫一個(gè)轉(zhuǎn)發(fā)的邏輯。
* 如果系統(tǒng)很復(fù)雜,參與人或公司很多,那通信格式要怎么定,怎么改,溝通成本就很大了。
這些東西這么麻煩,又不想加班寫代碼,那有沒有辦法簡便地解決呢?當(dāng)然有,就是用現(xiàn)成的協(xié)議啦,比如MQTT。
MQTT 提供兩個(gè)核心功能:
* 三個(gè)級別的QOS
*基于訂閱/發(fā)布的消息轉(zhuǎn)發(fā)服務(wù)。
用了MQTT, 上面提到的這些問題就都被優(yōu)雅地解決掉啦。
其實(shí),同類應(yīng)用的很多問題,都是有一定共性的。這時(shí)候就會(huì)有一些人提出一般性的解決方式,這樣大家就不用重復(fù)造輪子,同時(shí)又保證了互操作性。這就是協(xié)議存在的意義啦。
所以一句話總結(jié),MQTT 和其他的應(yīng)用層協(xié)議,比如 HTPP, FTP, BitTorrent 協(xié)議一樣,都是為了解決特定問題而生的一套方案,可以幫我們省好多事。
真正的MQTT協(xié)議要求的處理邏輯和報(bào)文格式都完善很多,但是協(xié)議本身還是很簡單的,具體內(nèi)容去看 MQTT 的文檔吧。