傳統請求-響應模式面對高並發、實時場景(IM、股票、協同編輯)力不從心。歷代補丁方案各有缺陷:
| 方案 | 原理 | 缺點 |
|---|---|---|
| 輪詢 | 定時發請求 | 大量無效請求,浪費帶寬 |
| 長輪詢 | 掛起請求直到有數據 | 高頻數據下退化為輪詢 |
| 流/隱藏 iframe | 長連接持續推數據 | 瀏覽器兼容差,服務端資源佔用高 |
| Flash Socket | Flash 做中轉 | 移動端不支持,Adobe 已停止維護 |
本質問題:HTTP 半雙工、每次攜帶完整 Header、無服務端主動推送能力。
客戶端發起:
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: https://localhost:8080
Sec-WebSocket-Version: 13
Upgrade: websocket:申請協議升級Sec-WebSocket-Key:Base64 隨機鑰,防緩存/誤連服務端響應:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
101 Switching Protocols:同意升級Sec-WebSocket-Accept:按 RFC 6455 算法(Key + GUID → SHA1 → Base64)生成,驗證服務端理解協議| 端 | 主流實現 | 規範 |
|---|---|---|
| 服務端 | Tomcat 7.0.5+、Jetty 7+、WebLogic 12c、WebSphere 8+、Netty、Spring WebSocket (JSR-356) | Java EE 7 (JSR-356) |
| 客戶端 | Chrome 4+、Firefox 5+、IE 10+、Safari iOS 5+、Android 4.4+、原生 JS WebSocket API、Socket.io | HTML5 WebSocket API |