在通常的智能家居場景中,我們可以很方便地從口袋中掏出手機,打開APP應用,點擊幾下,啟動家里的熱水器,這樣下班回家后,馬上就可以洗個熱水澡。
在這點擊的零點幾秒的時間內,Internet網上的控制報文是如下傳輸的。
?、倏蛻羰謾C連接到云服務器發出熱水器的控制指令
?、谠品掌靼芽刂浦噶钷D發給家中智能家居網關,控制熱水器開關
?、蹮崴黜憫刂浦噶?,將結果反饋給云服務器
?、茉品掌髟賹⒔Y果反饋給客戶APP,APP顯示設置成功
大家可能會問一個問題,為什么客戶APP不直接控制智能家居網關,而使用云服務器做中轉?
答案:智能家居設備是躲在家用路由器的后面,它的ip地址并不是公網地址,因此用戶手機是無法訪問到智能家居設備。同理,云服務器也無法訪問到智能家居設備。
因此智能家居設備需要主動向云服務器發起連接,并建立好連接。這樣客戶APP就可以就隨時登錄到云端,通過云端對智能家居進行控制。
我們拿在internet世界常用的HTTP協議來實現智能家居網關和云服務器的交互控制。HTTP協議非常簡單,客戶端發起一個request,服務器回一個response。
大家注意,服務器是不能主動發起請求的,這是因為HTTP協議必須是客戶端發起的。因此如果要控制智能家居設備,智能家居設備需要不停的向服務器發起詢問,查看云服務器是否對它下控制命令。
設備不停地對服務器請求會造成以下問題:
1、無論設備還是云服務器,CPU很忙,設備性能下降
2、占用帶寬,特別是云服務器的帶寬資源是比較昂貴的
好,我們現在請出WebSocket協議來替換HTTP協議的實現,設備和服務器的請求變成下面的對話:
這樣就明顯合理多了,因此WebSocket協議有如下幾個優點:
1、更小的控制開銷。建立連接后,用于協議控制的數據包頭部相對較小,在不擴展的情況下,只有2-10個字節。相對于HTTP請求每次都要帶完整的頭部,開銷要小很多
2、更強的實時性,協議是雙工的??蛻舳撕头掌鞫硕伎梢噪S時發起請求。
正因為WebSocket有這些優點,它當前被大量使用在如下領域:
1、社交聊天,如果WebSocket早一些出來,QQ和微*聊天的協議估計就是它了
2、彈幕
3、多玩家游戲
4、協同編輯,比如Google Docs,允許多人在線同時編輯相同一篇文檔
5、股票基金報價
6、基于位置的應用
7、智能家居
可以看出來,需要實時性的場景都會使用WebSocket。
WebSocket vs HTTP
下圖是WebSocket和HTTP協議層次模型:
為什么客戶不直接控制智能家居網關,而要使用云服務器做中轉?
從圖上可以看出,HTTP和WebSocket有一些交集,我們通過下面一個典型的WebSocket握手請求來展示:
客戶端請求
GET/webfin/websocket/ HTTP/1.1Host: localhostUpgrade: websocket
Connection:UpgradeSec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==Origin: http://服務器地址Sec-WebSocket-Version: 13
服務器回應
HTTP/1.1101 Switching ProtocolsUpgrade: websocketConnecTIon: UpgradeSec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
可以看出來,WebSocket建立連接是使用HTTP協議進行握手的,握手完成之后,WebSocket就和HTTP沒有關系了,真正的數據傳輸階段是不需要http協議參與的。
WebSocket和HTTP是獨立的協議,那么為什么WebSocket協議借用了HTTP的協議來建立連接而不是自建一套獨立的協議呢?
在前幾年的時候,在大多數公司里,IT為了讓大家安心工作,在公司的防火墻上把QQ的端口號封了,這樣既解決了大家可以正常上網,但不能上網QQ聊天。如果QQ改用WebSocket來實現,WebSocket使用和HTTP相同的80端口,IT就沒法限制了,除非把Web瀏覽也禁掉。因此WebSocket協議借用了HTTP的協議來建立連接,使用HTTP的端口號,可以繞過大多數防火墻的限制。有Web的地方,WebSocket就可以通行無阻。
瀏覽器的兼容性
由于WebSocket協議是在2011年終定稿,因此一些舊款的瀏覽器還無法支持WebSocket,比如IE10以前的版本。下面是實現了WebSocket的瀏覽器(終版本RFC6455):
Web世界日新月異,但IE的對新技術的支持總要慢一拍,所以現在IE的份額也在逐年下降。來自Net Market Share 2016年7月份的統計,Google的Chrome瀏覽器(48.65%)已經超越 IE(31.65%)的*。這里提醒,還在用IE老版本的朋友們,趕快升級吧。
WebSocket之前
大家可能會有疑問,2011年WebSocket才終定稿,那么之前如何實現像聊天室之類的實時應用呢?答案是:使用tcp編程。所以像QQ這樣的聊天程序,騰訊需要自己開發私有的SDK來實現。如果今天開發QQ聊天程序,直接拿WebSocket來用就好了,瀏覽器、客戶端程序、服務器程序、各種編程語言都已經開發了現成的WebSocket庫函數,可以直接調用。底層的通信協議和實現細節不用再考慮了。
HTTP和WebSocket的編程對應于OSI七層協議中的第七層,而tcp編程在第三層。從編程角度來說,層次越高,編碼越簡單。原理類似于,程序員用c語言編程還是python編程一樣,python寫幾句話,c可能需要寫幾頁的程序。
總結:在web開發之前是沒有保持長鏈接的協議,WebSocket的誕生使其從無到有,全雙工、實時、高效,WebSocket迎合了實時通訊的需求。