概述:
HTTP通信是客戶端控制的一請求一應答模式。
不適用低延遲應用。
如果有新數據可用時,立即將數據發送到客戶端。需要通過長輪詢等方式實現。
而WebSocket將網絡套接字引入客戶端和服務端,瀏覽器和服務器可以通過套接字建立持久的連接,雙方隨時都可以互發數據給對方。
HTTP協議的弊端
(1)半雙工協議。數據可以在客戶端和服務端兩個方向上傳輸,但是同一時刻,只有一個方向上的數據傳送
(2)消息冗長繁瑣,包含請求頭、請求體、換行符等,可用數據比例低,可能只有請求體中的數據
(3)如果使用長輪詢實現實時推送,可能會引來黑客針對長輪詢的攻擊
長輪詢:客戶端每隔1s向服務端發送請求,然後服務端響應,通常用於實時推送新數據而設計。
由於HTTP Request的header是冗長的,所以客戶端頻繁請求,會佔用很多的帶寬和服務器資源。
WebSocket協議
HTML5定義了WebSocket協議,提供一種基於TCP的,瀏覽器和服務器間的全雙工網絡通信技術,同一時刻,可以在不同方向上通信,即可以同時接收和發送消息。
WebSocket協議的特點
- 單一的TCP連接,採用全雙工模式通信
- 對代理、防火牆和路由器透明
- 無頭部信息、Cookie和身份認證
- 無安全開銷
- 通過"Ping/Pong"幀保持鏈路激活
- 服務器可以主動傳遞消息給客戶端,不再需要客戶端輪詢
WebSocket建立連接
客戶端向服務端發起一個HTTP請求,包含一個附加頭信息,其中Upgrade:WebSocket表明這是一個申請協議升級的HTTP請求
服務端解析這些附加的頭信息,然後生成應答信息返回給客戶端,連接建立成功。
這個連接會一直存在,直到有一方主動關閉連接。
WebSocket生命週期
握手成功後,客戶端服務端通過"message"的方式通信
一個消息由一個或多個區別於網絡層的幀組成。
幀有自己對應的類型,屬於同一個消息的多個幀具有類型相同的數據。數據類型可以是文本、二進制、控制幀(協議級信令,如信號)
WebSocket連接關閉
通常是由服務端關閉,當時如果在一個合理的時間週期後沒有收到服務端的TCP Close,客戶端可以發起TCP Close。
握手關閉消息帶有一個狀態碼和一個可選的關閉原因,必須發送一個Close控制幀。
WebSocket服務端開發