首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

WebSocket 核心原理深度解析:從 HTTP 握手到全雙工長連接

     編輯:Java 綜合教學

一、誕生背景:為什麼 HTTP 不夠用?

傳統請求-響應模式面對高並發、實時場景(IM、股票、協同編輯)力不從心。歷代補丁方案各有缺陷:

方案原理缺點
輪詢定時發請求大量無效請求,浪費帶寬
長輪詢掛起請求直到有數據高頻數據下退化為輪詢
流/隱藏 iframe長連接持續推數據瀏覽器兼容差,服務端資源佔用高
Flash SocketFlash 做中轉移動端不支持,Adobe 已停止維護

本質問題:HTTP 半雙工、每次攜帶完整 Header、無服務端主動推送能力。

二、WebSocket 運行機制

1. 協議本質

  • 基於 TCP,先用 HTTP/HTTPS 握手升級協議,再建立雙向數據通道。
  • 握手成功後,雙方均可主動發送數據(全雙工),數據以幀序列傳輸,無需重新建立連接。

2. 握手報文詳解

客戶端發起:

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)生成,驗證服務端理解協議

3. 數據幀結構(簡化)

  • 文本幀 / 二進制幀 / 控制幀(Ping/Pong/Close)
  • 掩碼:客戶端→服務端必須掩碼,防緩存污染攻擊

三、服務端與客戶端實現生態

端主流實現規範
服務端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.ioHTML5 WebSocket API

四、核心優勢總結

  1. 真全雙工:雙向主動推送,無需輪詢。
  2. 極低開銷:握手後無 HTTP Header,數據幀僅 2-14 字節開銷。
  3. 單連接:一條 TCP 連接替代雙向 HTTP 連接,節省服務端端口/線程資源。
  4. 原生瀏覽器支持:無插件,跨平台。

五、應用場景

  • 即時通訊(聊天、客服)
  • 實時數據大屏(股票、監控)
  • 協同編輯/白板
  • 遊戲/直播彈幕
  • IoT 設備雙向控制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved