WebSocket

1、簡述及一些參考文檔

WebSocket是設計用來實現單個TCP鏈接上全雙工通訊的協議。(通俗一點說,就是創建一個TCP鏈接後,客戶端和服務端均可以主動向對端發送數據)。WebSocket是HTML5中定義的,主要用於網頁請求。html

WebSocket草案中文版感受翻譯得不太行。。。瀏覽器

WebSocket草案英文版安全

2、WebSocket的一些基本點

  • 與HTTP的兼容性: 先看一下一個很簡單的WebSocket示例
    圖一
圖1、客戶端請求示例

圖二

圖2、服務端響應示例
  1. 基於http協議創建鏈接,借用http協議完成握手。咱們從圖1、圖二中能夠看到,請求是以http請求的方式發出,不過增長了UpgradeConnectionSec-WebSocket-KeySec-WebSocket-Version字段。服務器接收到後會切換到WebSocket協議並進行支持。
  2. 與http共享TCP端口,默認狀況下的80和TLS加密狀況下的443
  • 與HTTP對比
特徵 HTTP WebSocket
鏈接時效 無持久鏈接,經過keep-alive保持鏈接 持久鏈接
通訊方式 單向請求和響應 全雙工通訊
狀態 無狀態,服務端不記錄客戶端信息 有狀態
發起鏈接方 客戶端 客戶端
關閉鏈接方 客戶端 雙端
控制開銷 較大
請求及響應數
總TCP鏈接數 同樣 同樣
實時性
二進制支持
拓展性 能夠設計並使用一些子協議,在請求中指定
壓縮率 較低
  • RFC6455規範要求WebSocket版本均使用13,此以前各瀏覽器設計開發的版本都再也不使用。
  • WebSocket與HTTP輪詢的比較:都是創建一次TCP鏈接(若是http輪詢沒有超時的話),但HTTP輪詢會由客戶端每隔必定時間發送HTTP請求,服務器對請求返回響應,WebSocket則是隻發送一次請求,當服務端有更新的時候,無需等待客戶端的新請求,能夠主動向客戶端推送數據。

3、WebSocket規範中的一些重要點

1.鏈接斷開機制

雙端均可以主動發起斷開鏈接。發起方發送一個control frame來告知對方(我想要斷開鏈接啦,今後之後我不會再給你發別的數據,不過我還能接收你的數據),接受方迴應一個close frame(好的,斷開吧,我今後之後不發送也不接收你的數據了)。服務器

由上面的流程能夠看出,在斷開鏈接的過程當中,發起方仍能接收對方數據,直到整個鏈接確認斷開。因此比起原有的TCP揮手,是更爲安全可靠的。加密

2.握手

如圖一和圖二,翻譯

  • 若是WebSocket請求來自於瀏覽器客戶端,必須包含Origin的頭域;若是客戶端不是瀏覽器,能夠根據Origin是否有用來決定要不要包含。
  • 請求中可能包含名爲Sec-WebSocket-Protocol的頭域,用於指定所選的子協議。
  • 請求可能包含名爲Sec-WebSocket-Extensions的頭域。
  • 客戶端發送握手請求後,必須等待服務端的握手響應,才能繼續發送其餘數據。且需按協議規範決定該次握手是否成功(若是握手響應不規範則認爲握手失敗)。
  • 服務端接收握手請求後,必須解析並確認該請求符合規範,才能發送握手響應。除此以外,服務端能夠執行額外的客戶端驗證。發送完握手響應後,服務端認爲該鏈接已成功創建,能夠開始發送和接收數據了。

3.幀格式

WebSocket中數據使用ABNF描述,以下圖三。 設計

圖三

圖3、WebSocket幀格式
相關文章
相關標籤/搜索