1. 程式人生 > >iOS TCP/IP, WebSocket 和 MQTT

iOS TCP/IP, WebSocket 和 MQTT

按照OSI網路分層模型,IP是網路層協議,TCP是傳輸層協議,而HTTP和MQTT是應用層的協議。在這三者之間, TCP是HTTP和MQTT底層的協議。大家對HTTP很熟悉,這裡簡要介紹下MQTT。MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支援所有平臺,幾乎可以把所有聯網物品和外部連線起來,被用來當做感測器的通訊協議。

  1. HTTP的不足 

    HTTP協議經過多年的使用,發現了一些不足,主要是效能方面的,包括: 

    HTTP的連線問題,HTTP客戶端和伺服器之間的互動是採用請求/應答模式,在客戶端請求時,會建立一個HTTP連線,然後傳送請求訊息,服務端給出應答訊息,然後連線就關閉了。(後來的HTTP1.1支援持久連線)
    因為TCP連線的建立過程是有開銷的,如果使用了SSL/TLS開銷就更大。

    在瀏覽器裡,一個網頁包含許多資源,包括HTML,CSS,JavaScript,圖片等等,這樣在載入一個網頁時要同時開啟連線到同一伺服器的多個連線。

    HTTP訊息頭問題,現在的客戶端會發送大量的HTTP訊息頭,由於一個網頁可能需要50-100個請求,就會有相當大的訊息頭的資料量。

    HTTP通訊方式問題,HTTP的請求/應答方式的會話都是客戶端發起的,缺乏伺服器通知客戶端的機制,在需要通知的場景,如聊天室,遊戲,客戶端應用需要不斷地輪詢伺服器。

    而 WebSocket是從不同的角度來解決這些不足中的一部分。還有其他技術也在針對這些不足提出改進。

  2. WebSocket
    WebSocket則提供使用一個TCP連線進行雙向通訊的機制,包括網路協議和API,以取代網頁和伺服器採用HTTP輪詢進行雙向通訊的機制。

    本質上來說,WebSocket是不限於HTTP協議的,但是由於現存大量的HTTP基礎設施,代理,過濾,身份認證等等,WebSocket借用HTTP和HTTPS的埠。由於使用HTTP的埠,因此TCP連線建立後的握手訊息是基於HTTP的,由伺服器判斷這是一個HTTP協議,還是WebSocket協議。 WebSocket連線除了建立和關閉時的握手,資料傳輸和HTTP沒丁點關係了。

歷時11年,WebSocket終於被批准成為IETF的建議標準:RFC6455.其前身是WHATWG Web Hypertext Application Technology Working Group)的工作。而Web Socket

API,W3C的工作。

WebSocket可以只打開一個到伺服器的連結,並且在此連結上交換資訊。其優勢在於減少了傳統方法的複雜性,提高了可靠性和降低了瀏覽器和客戶端之間的負載。這樣做的一個重要原因是,很多防火牆遮蔽80以外的埠,迫使越來越多的應用遷移到HTTP上來了。

11年的websocket草案的變遷中,有的瀏覽器支援的是舊版本的websocket,比如iPhone4上的safari使用的WebSocket是舊版的握手協議,那麼就要使用就的握手協議來製做伺服器端。如今只有Safari支援舊版本的協議,ChromeFirefox最新版都已升級至Hybi-10協議地址)。因此,我們再來看一下WebSocket新版協議Hybi-10。這次協議變更非常大,主要集中在握手協議和資料傳輸的格式上。

握手協議

我們先來看一下大致的區別:

  1. 最老的websocket草案標準中是沒有安全key,草案7.57.6中有兩個安全key,而現在的草案10中只有一個安全key,即將 7.57.6http頭中的"Sec-WebSocket-Key1″"Sec-WebSocket-Key2″合併為了一個"Sec- WebSocket-Key"
  2. http頭中Upgrade的值由"WebSocket"修改為了"websocket"http頭中的"-Origin"修改為了"Sec-WebSocket-Origin";
  3. 增加了http"Sec-WebSocket-Accept",用來返回原來草案7.57.6伺服器返回給客戶端的握手驗證,原來是以內容的形式返回,現在是放到了http頭中;另外伺服器返回客戶端的驗證方式也有變化。

伺服器生成驗證的方式變化較大,我們來做一介紹。

舊版:

1 GET / HTTP/1.1
2 Upgrade: WebSocket
3 Connection: Upgrade
4 Host: 127.0.0.1:1337
5 Origin: http://127.0.0.1:8000
6 Cookie: sessionid=xxxx; calView=day; dayCurrentDate=1314288000000
7 Sec-WebSocket-Key1: cV`p1* 42#7  ^9}_ 647  08{
8 Sec-WebSocket-Key2: O8 415 8x37R A8   4
9 ;"######

舊版生成Token的方法如下:

取出Sec-WebSocket-Key1中的所有數字字元形成一個數值,這裡是1427964708,然後除以Key1中的空格數目,得到一個數值,保留該數值整數位,得到數值N1;對Sec-WebSocket-Key2採取同樣的演算法,得到第二個整數N2;把N1N2按照Big- Endian字元序列連線起來,然後再與另外一個Key3連線,得到一個原始序列ser_keyKey3是指在握手請求最後,有一個8位元組的奇怪的字元";"######",這個就是Key3。然後對ser_key進行一次md5運算得出一個16位元組長的digest,這就是老版本協議需要的token,然後將這個token附在握手訊息的最後傳送回Client,即可完成握手。

新版:

1 GET / HTTP/1.1
2 Upgrade: websocket
3 Connection: Upgrade
4 Host: 127.0.0.1:1337
5 Sec-WebSocket-Origin: http://127.0.0.1:8000
6 Sec-WebSocket-Key: erWJbDVAlYnHvHNulgrW8Q==
7 Sec-WebSocket-Version: 8
8 Cookie: csrftoken=xxxxxx; sessionid=xxxxx

新版生成Token的方法如下:

首先伺服器將key(長度24)截取出來,如4tAjitqO9So2Wu8lkrsq3w==,用它和自定義的一個字串(長度 36258EAFA5-E914-47DA-95CA-C5AB0DC85B11連線起來,然後把這一字串進行SHA-1演算法加密,得到長度為20節的二進位制資料,再將這些資料經過Base64編碼,最終得到服務端的金鑰,也就是ser_key。伺服器將ser_key附在返回值Sec- WebSocket-Accept後,至此握手成功。

WebSocket也有自己一套幀協議。資料報文格式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

      0                   1                   2                   3

      01234567890123456789012345678901

     +-+-+-+-+-------+-+-------------+-------------------------------+

     |F|R|R|R|opcode|M|Payload len|    Extended payload length    |

     |I|S|S|S|  (4)  |A|     (7)     |             (16/63)           |

     |N|V|V|V|       |S|             |   (ifpayload len==126/127)   |

     ||1|2|3|       |K|             |                               |

     +-+-+-+-+-------+-+-------------+---------------+

     |     Extended payload length continued,ifpayload len==127  |

     +---------------+-------------------------------+

     |                               |Masking-key,ifMASK set to1  |

     +-------------------------------+-------------------------------+

     |Masking-key(continued)       |          Payload Data         |

     +-----------------------------------------------+

     :                     Payload Data continued...                :

     +-------------------------------+

     |                     Payload Data continued...                |

     +---------------------------------------------------------------+

FIN1位,用來表明這是一個訊息的最後的訊息片斷,當然第一個訊息片斷也可能是最後的一個訊息片斷;

RSV1, RSV2, RSV3: 分別都是1位,如果雙方之間沒有約定自定義協議,那麼這幾位的值都必須為0,否則必須斷掉WebSocket連線;

Opcode:4位操作碼,定義有效負載資料,如果收到了一個未知的操作碼,連線也必須斷掉,以下是定義的操作碼:

  • %x0 表示連續訊息片斷
  • %x1 表示文字訊息片斷
  • %x2 表未二進位制訊息片斷
  • %x3-7 為將來的非控制訊息片斷保留的操作碼
  • %x8 表示連線關閉
  • %x9 表示心跳檢查的ping
  • %xA 表示心跳檢查的pong
  • %xB-F 為將來的控制訊息片斷的保留操作碼

Mask:1位,定義傳輸的資料是否有加掩碼,如果設定為1,掩碼鍵必須放在masking-key區域,客戶端傳送給服務端的所有訊息,此位的值都是1

Payload length: 傳輸資料的長度,以位元組的形式表示:7位、7+16位、或者7+64位。如果這個值以位元組表示是0-125這個範圍,那這個值就表示傳輸資料的長度;如果這個值是126,則隨後的兩個位元組表示的是一個16進位制無符號數,用來表示傳輸資料的長度;如果這個值是127,則隨後的是8個位元組表示的一個64位無符合數,這個數用來表示傳輸資料的長度。多位元組長度的數量是以網路位元組的順序表示。負載資料的長度為擴充套件資料及應用資料之和,擴充套件資料的長度可能為0,因而此時負載資料的長度就為應用資料的長度。

Masking-key:04個位元組,客戶端傳送給服務端的資料,都是通過內嵌的一個32位值作為掩碼的;掩碼鍵只有在掩碼位設定為1的時候存在。
Payload data:  (x+y)
位,負載資料為擴充套件資料及應用資料長度之和。
Extension data:x
位,如果客戶端與服務端之間沒有特殊約定,那麼擴充套件資料的長度始終為0,任何的擴充套件都必須指定擴充套件資料的長度,或者長度的計算方式,以及在握手時如何確定正確的握手方式。如果存在擴充套件資料,則擴充套件資料就會包括在負載資料的長度之內。
Application data:y
位,任意的應用資料,放在擴充套件資料之後,應用資料的長度=負載資料的長度-擴充套件資料的長度。

三、 MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是輕量級基於代理的釋出/訂閱的訊息傳輸協議,設計思想是開放、簡單、輕量、易於實現。這些特點使它適用於受限環境。例如,但不僅限於此:

  • 網路代價昂貴,頻寬低、不可靠。 
  • 在嵌入裝置中執行,處理器和記憶體資源有限。

該協議的特點有:

  • 使用釋出/訂閱訊息模式,提供一對多的訊息釋出,解除應用程式耦合。 
  • 對負載內容遮蔽的訊息傳輸。 
  • 使用 TCP/IP 提供網路連線。 
  • 有三種訊息釋出服務質量: 
  • "至多一次",訊息釋出完全依賴底層 TCP/IP 網路。會發生訊息丟失或重複。這一級別可用於如下情況,環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次傳送。 
  • "至少一次",確保訊息到達,但訊息重複可能會發生。 
  • "只有一次",確保訊息到達一次。這一級別可用於如下情況,在計費系統中,訊息重複或丟失會導致不正確的結果。
  • 小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協議交換最小化,以降低網路流量。 
  • 使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。

早在1999年,IBM的Andy Stanford-Clark博士以及Arcom公司ArlenNipper博士發明了MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)技術。BM和St. Jude醫療中心通過MQTT開發了一套Merlin系統,該系統使用了用於家庭保健的感測器。St. Jude醫療中心設計了一個叫做[email protected]的心臟裝置,這種無限發射器可以用來監控那些已經植入復律-除顫器和起搏器(兩者都是基本的感測器)的心臟病人。

該產品利用MQTT把病人的即時更新資訊傳給醫生/醫院,然後醫院進行儲存。這樣的話,病人就不用親自去醫院檢查心臟儀器了,醫生可以隨時檢視病人的資料,給出建議,病人在家裡就可以自行檢查。

IBM稱該發射器包括一個大型觸控式螢幕,一個嵌入式鍵盤平臺,以及一個Linux作業系統。

在未來幾年,MQTT的應用會越來越廣,值得關注。

通過MQTT協議,目前已經擴展出了數十個MQTT伺服器端程式,可以通過PHP,JAVA,Python,C,C#等系統語言來向MQTT傳送相關訊息。

此外,國內很多企業都廣泛使用MQTT作為Android手機客戶端與伺服器端推送訊息的協議。其中Sohu,Cmstop手機客戶端中均有使用到MQTT作為訊息推送訊息。據Cmstop主要負責訊息推送的高階研發工程師李文凱稱,隨著移動網際網路的發展,MQTT由於開放原始碼,耗電量小等特點,將會在移動訊息推送領域會有更多的貢獻,在物聯網領域,感測器與伺服器的通訊,資訊的收集,MQTT都可以作為考慮的方案之一。在未來MQTT會進入到我們生活的各各方面。

如果需要下載MQTT伺服器端,可以直接去MQTT官方網站點選software進行下載MQTT協議衍生出來的各個不同版本。

MQTTTCPWebSocket的關係可以用下圖一目瞭然:

MQTT協議專注於網路、資源受限環境,建立之初不曾考慮WEB環境。HTML5 Websocket是建立在TCP基礎上的雙通道通訊,和TCP通訊方式很類似,適用於WEB瀏覽器環境。雖然MQTT基因層面選擇了TCP作為通訊通道,但我們添加個編解碼方式,MQTT over Websocket也可以的。這樣做的好處,MQTT的使用範疇被擴充套件到HTML5、桌面端瀏覽器、移動端WebApp、Hybrid等,多了一些想像空間。這樣看來,無論是移動端,還是WEB端,MQTT都會有自己的使用空間。

MQ 遙測傳輸 (MQTT) V3.1 協議規範基於WebSocket MQTT 移動推送方案

相關推薦

iOS TCP/IP, WebSocket MQTT

按照OSI網路分層模型,IP是網路層協議,TCP是傳輸層協議,而HTTP和MQTT是應用層的協議。在這三者之間, TCP是HTTP和MQTT底層的協議。大家對HTTP很熟悉,這裡簡要介紹下MQTT。MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是IBM

OSI七層模型,TCP/IP,靜態rip路由

OSI七層 TCP/IP 靜態路由 rip 一、OSI七層參考模型 應用層:將抽象語言(文字、圖像、聲音)->編碼表示層:編碼->二進制會話層:應用程序提供會話地址(應用程序會話地址),如qq號;不是所有應用程序都需要這個地址 *上三層是應用程序對信息進行加工處理直到可以被傳輸 傳

Python3:搞懂 TCP/IP , HTTP Socket 之間的聯絡。

TCP/IP , HTTP 和 Socket 之間的聯絡 TCP/IP 和HTTP都是協議,一個位於傳輸層,一個位於應用層。 Socket 不位於任何一層的,上邊的兩個協議再好,也得有人用。 就比如電你不用,它也沒有任何意義,那怎麼去用呢,就是呼叫Socket介面, 它

TCP/IP簡介Android中Socket及http的使用

計算機網路及其協議 概述 OSI/RM 在1978年國際標準化組織(ISO)提出了“開放系統互連參考模型”,即著名的OSI/RM 模型(Open System Interconnection/Reference Model)。此後,不同廠家生產的計算機便能相互通訊,建立起了計算機網路

TCP/IP Http Https之間的區別

一直對TCP Http 和Socket稀裡糊塗的,今天專門的查了下: TCP/IP是個協議組,它分為網路層,傳輸層和應用層,  在網路層有IP協議、ICMP協議、ARP協議、RARP協議和BOOT

python連結資料庫SQL Server 2005出錯怎麼辦???附解決方案以及開啟TCP/IP協議檢視預設埠的過程

import pymssql conn=pymssql.connect(host='127.0.0.1:1433',user='sa',password='jxn',database='scott',charset="UTF-8") ''' 如果和本機資料庫互動,只需修改連結

TCP/IP協議族-----22、萬維網HTTP

art class ip協議 post term fill 技術分享 clas data- TCP/IP協議族-----22、萬維網和HTTP

TCP/IP三次握手HTTP過程

等待 自身 text ssi 描述 套接字 網絡連接 計算 中間 1、TCP連接 手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口,使上層網絡數據的傳輸建立在“無差別”的網絡之上。 建立起

TCP/IP具體解釋--TCP的分段IP的分片

能夠 重傳機制 選項 來看 即使 pos ip協議 一個數 信息 寫在前面: 分組能夠發生在運輸層和網絡層。運輸層中的TCP會分段,網絡層中的IP會分片。IP層的分片很多其它的是為運輸層的UDP服務的,因為TCP自己會避免IP的分片,所以使用TCP傳輸在IP層都

OSI七層參考模型TCP/IP四層參考模型

osi七層 tcp/ip四層OSI七層參考模型和TCP/IP模型一:OSI七層參考模型1:物理層(比特):進行比特流的傳輸(比特流也是數據流,在不同的介質下表現的形式也不一樣,在光纖中是光信號傳遞,這個比特流也就是光信號,如果是wifi,傳遞用的是光信號,那麽比特流也就是光信號)2:數據鏈路層(幀):建立和維

MQTT是IBM開發的一個即時通訊協議,構建於TCP/IP協議上,是物聯網IoT的訂閱協議,借助消息推送功能,可以更好地實現遠程控制

集合 cap 消息處理 簡易 遠程控制 mes ogr 設計思想 成本 最近一直做物聯網方面的開發,以下內容關於使用MQTT過程中遇到問題的記錄以及需要掌握的機制原理,主要講解理論。 背景 MQTT是IBM開發的一個即時通訊協議。MQTT構建於TCP/IP協議上

TCP/IP模型及OSI七層參考模型各層的功能主要協議

tft 連接 app 控制文件 物理層 ast 進制 文件系統 alt 註:網絡體系結構是分層的體系結構,學術派標準OSI參考模型有七層,而工業標準TCP/IP模型有四層。後者成為了事實上的標準,在介紹時通常分為5層來敘述但應註意TCP/IP模型實際上只有四層。 1

OSI及TCP/IP的概念區別

基本 p地址 中繼 映射 功能 管理 超文本傳輸協議 文件 nsf 什麽是TCP/IP協議 TCP/IP協議(Transfer Controln Protocol/Internet Protocol)叫做傳輸控制/網際協議,又叫網絡通訊協議,這個協議是Internet國際互

OSI七層TCP/IP五層網絡架構簡介

eee miss sage use tft size osi art 地址解析 OSI七層和TCP/IP五層網絡架構簡介 一.基本概念   OSI是Open System Interconnect的縮寫,意為開放式系統互聯。   ARP(Address Resolution

TCP/IPUDP之間的區別(轉載)

有用 可靠性 client 之間 可靠的 col 因此 用戶數據報 ack 在分析兩者之間的區別之前,我們先搞清楚這兩者的關系, TCP/IP協議簇 是一種網絡控制協議,簡單點說就是一種網絡協議,我們網絡中的計算機就是通過這套協議簇來進行數據通信的。這套協議簇裏面包含了很

TCP-IP詳解卷3:TCP 事務協議、HTTP、NNTPUNIX域協議》【PDF】下載

維護 tcp協議 zha 簡介 參考文獻 源程序 .com 的人 ntp TCP-IP詳解卷3:TCP 事務協議、HTTP、NNTP和UNIX域協議》【PDF】下載鏈接: https://u253469.pipipan.com/fs/253469-230062539

OSI模型TCP/IP協議族(一)

出了 框架 調用 數據表 http n+1 互連 改變 2-2 1990年以前,再數據通信和組網文獻中占主導地位的分層模型是開放系統互連(Open System Interconnnection,OSI)模型。當時所有人都認為OSI模型將是數據通信的最終標準,然而這種情況並

OSI模型TCP/IP協議族(二)

出發 app 另一個 改變 cati mar int 點對點 本機 OSI模型中的各層 物理層 物理層(physical layer)協調通過物理媒體傳送比特流時所需要的各種功能。物理層涉及到接口和傳輸媒體的機械和電器規約。它還定義了這些物理設備即接口為了實現傳輸必須完成的

OSI七層模型TCP/IP

轉化 端口號 nts con 信息流 你在 關系 ria 鏈路 OSI七層模型 OSI(Open System Interconnection,開放系統互連)七層網絡模型稱為開放式系統互聯參考模型 ,是一個邏輯上的定義,一個規範,它把網絡從邏輯上分為了7層。每一層都有

關於HTTPTCP/IP

服務器 數據報 但是 文件傳輸 計算機 img 互聯 處理 物理 一、TCP/IP 概念:TCP/IP是互聯網相關的各類協議族的總稱。 TCP/IP協議族按層次分為4層,應用層、傳輸層、網絡層和數據鏈路層。 應用層: 決定了向用戶提供應用服務時通信的活動。TCP/IP協議