计算机网络:WebSocket协议详解
1. 概述
一直以來,網絡在很大程度上都是圍繞著HTTP的請求/響應模式而構建的。所有的HTTP通信都是由客戶端控制的,這就需要用戶進行互動或者定期輪詢,以便從服務器加載數據。長期以來存在著各種技術讓服務器得知有新數據可用時,立即將數據發送都客戶端,這些技術種類繁多,例如推送或則“Comet”。
但是這些解決方案都存在一個相同的問題:由于HTTP協議的開銷,導致他們不適合做低延遲的應用。為了解決這些問題,WebSocket將網絡套接字引入到客戶端和服務器端,瀏覽器和服務器之間可以通過套接字建立持久的通信,雙方隨時都可以互相發送數據給對方,而不是之前由客戶端控制的請求————應答模式。
2. HTTP協議的弊端
- HTTP協議為半雙工協議。半雙工協議指數據可以在客戶端和服務端兩個方向上傳輸,但不能同時傳輸。它意味著在同一時刻,只有一個方向上的數據傳輸。
- HTTP消息繁瑣。HTTP消息包含消息頭、消息體、換行符等,通常情況下采用文本方式傳輸,相比于其他的二進制通信消息協議,顯得繁瑣。
- 針對服務器推送的黑客攻擊。比如:長時間輪詢。
現在,很多網站為了實現消息推送,所用的技術都是采用的輪詢。輪詢是在特定的時間間隔(1s),由瀏覽器對服務器發出HTTP REQUEST,然后由服務器返回最新的數據給客戶端瀏覽器。這種傳統的模式具有很明顯的缺點,即瀏覽器需要不斷地向服務器發出請求,然而HTTP request和Header是非常冗長的,里面包含的可用數據比例很可能非常低,這回占用很多的帶寬和服務器資源。
3. WebSocket
WebSocket是HTML5開始提供的一種瀏覽器與服務器進行全雙通信的網絡技術,WebSocket通信協議與2011年被IEIF定位標準RFC6455,WebsSocket api被W3c定為標準。
在WebSocket api中,瀏覽器和服務器只需要做一個握手的動作,然后,瀏覽器和服務器之間形成了一條快速通道,兩者就可以之間互相傳輸消息數據了。WebSocket基于TCP雙向全雙工進行消息傳遞,同一時刻,既可以發送消息,也可以接受消息,相比HTTP的半雙工協議,性能得到很大的提升。
3.1 WebSocket的特點
3.2 WebSocket背景
WebSocket設計出來的目的就是取代輪訓和Comet技術,使客戶端瀏覽器具備向C/S架構下桌面系統一樣的實時通訊能力。瀏覽器通過javascript 向服務器發出建立WebSocket連接的請求,連接成功后,客戶端和服務端可以通過TCP直接交互數據。因為WebSocket連接本質上就是一個TCP連接,所以在數據傳輸的穩定性和數據傳輸量的大小方面,和輪訓即Comet技術相比,具有很大的優勢。
3.3 WebSocket連接建立
建立WebSocket連接時,需要通過客戶端或者瀏覽器發出握手請求,請求消息如圖所示:
為了建立一個WebSocket 連接,客戶端瀏覽器首先向服務器發起一個HTTP請求,這個請求和通常的HTTP請求不同,包含了一些附加頭信息,其中附加頭信息“Upgrade:Websocket”表明這是一個申請協議升級的HTTP請求。服務端解析這些附加頭信息,然后生成應答信息返回客戶端,客戶端和服務端的WebSoket連接就建立起來了,雙方可以通過這個連接通道自由傳遞信息,并且這個連接會持續存在直到客戶端或服務器端的某一方主動關閉連接。
請求消息中的"sec-websocket-key"是隨機的,服務器會用這些數據構造出一個SHA-1的消息摘要,把“sec-websocket-key”加上一個魔幻字符串“*************”。使用SHA-1加密,然后進行Base64編碼,將結果作為"sec-websocket-accept"頭的值,返回給客戶端。
3.4 WebSocket 生命周期
握手成功之后,服務端和客戶端就可以通過“message”的方式進行通信了,一個消息有一個或多個幀組成,WebSocket的消息并不一定對應一個特定網絡層的幀,他可以被分割成多個幀或者被合并。
幀都有自己對應的類型,屬于同一消息的多個幀具有相同的數據類型。從廣義上講,數據類型可以使文本數據、二進制數據和控制幀。
3.5 WebSocket 連接關閉
為了關閉WebSocket 連接,客戶端和服務端需要通過一個安全的方法關閉底層TCP連接以及TLS會話。如果合適,丟棄任何可能已經接受的字節:必要時,可以通過任何手段關閉連接。
底層的TCP連接,在正常的情況下,應該首先由服務器關閉。在異常的情況下,客戶端可以發起TCP close 指令。因為,當服務器被指示關閉WebSocket連接時,它應該立即發起一個TCP Close操作;客戶端應該等待服務器的TCP close.
WebSocket 的握手關閉消息帶有一個狀態碼和一個可選關閉原因,它必須按照協議要求發送一個Close 控制幀,當對端接受到關閉幀指令時,需要主動關閉Websocket 連接。
總結
以上是生活随笔為你收集整理的计算机网络:WebSocket协议详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络:详解HTTP协议
- 下一篇: Spark详解(十四):Spark SQ