1、簡述及一些參考文檔
WebSocket是設計用來實現單個TCP鏈接上全雙工通訊的協議。(通俗一點說,就是創建一個TCP鏈接後,客戶端和服務端均可以主動向對端發送數據)。WebSocket是HTML5中定義的,主要用於網頁請求。html
WebSocket草案中文版感受翻譯得不太行。。。瀏覽器
WebSocket草案英文版安全
2、WebSocket的一些基本點
- 與HTTP的兼容性: 先看一下一個很簡單的WebSocket示例
圖1、客戶端請求示例
圖2、服務端響應示例
- 基於http協議創建鏈接,借用http協議完成握手。咱們從圖1、圖二中能夠看到,請求是以http請求的方式發出,不過增長了Upgrade、Connection、Sec-WebSocket-Key、Sec-WebSocket-Version字段。服務器接收到後會切換到WebSocket協議並進行支持。
- 與http共享TCP端口,默認狀況下的80和TLS加密狀況下的443
特徵 |
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幀格式