动态

详情 返回 返回

常用Web 實時通信技術:原理+選型,一篇通關 - 动态 详情

在 Web 開發中,實時通信技術的核心目標是實現客户端(Browser)與服務器之間低延遲、雙向 / 單向的動態數據交互,而非傳統 HTTP 的 “請求 - 響應” 模式。以下是 Web 端最常用的實時通信技術,從概念、原理特點、適用場景、對比選型進行詳細解析。

一、WebSocket

1.1、核心概念

WebSocket 是 Web 端實時通信的 “基礎設施”,通過全雙工長連接輕量幀傳輸,解決了 HTTP 單向短連接的侷限性,成為即時通訊、協作工具、實時監控等場景的首選技術。其與 HTTP 並非替代關係,而是互補 ——HTTP 適用於 “請求 - 響應” 場景(如頁面加載),WebSocket 適用於 “雙向實時交互” 場景。

1.2、原理介紹

WebSocket 的工作流程分為握手協議升級數據幀傳輸連接管理三個階段:

1. 握手階段:基於 HTTP 升級協議

WebSocket 連接的建立依賴 HTTP 協議完成 “握手”,本質是將 HTTP 連接升級為 WebSocket 連接;

客户端發起請求:發送特殊的 HTTP GET 請求,聲明協議升級意向:

GET /ws HTTP/1.1
Host: example.com
Connection: Upgrade  # 告訴服務端:這是一個“升級請求”,不要按普通 HTTP 處理
Upgrade: websocket   # 核心:請求升級到 WebSocket 協議
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==  # 隨機字符串,用於服務端驗證(防偽造請求)
Sec-WebSocket-Version: 13  # 客户端支持的 WebSocket 版本(必須是 13,現代標準)

服務器響應確認:驗證請求後返回101 Switching Protocols響應,確認升級:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=  # 由客户端的 Sec-WebSocket-Key 計算而來(驗證身份)

連接建立:握手成功後,底層 TCP 連接被複用,後續通信脱離 HTTP 協議。

2. 數據傳輸:基於幀結構的高效通信

WebSocket 採用二進制幀(Frame) 格式傳輸數據,幀結構僅包含 “操作碼(Opcode)、掩碼、數據長度、數據載荷” 等核心字段(頭部僅 2-14 字節),無 HTTP 頭冗餘,傳輸效率極高:

•操作碼:區分數據類型(0x01文本數據、0x02二進制數據、0x08斷開連接);

•掩碼:客户端發送數據必須加掩碼(防止代理緩存污染),服務器返回數據無需加掩碼;

•優勢:支持文本、圖片、視頻流等任意數據類型,雙向通信延遲可低至毫秒級。

3. 連接管理:保活與斷開

心跳保活:為避免 TCP 連接因 “長時間無數據” 被網絡設備(如路由器)斷開,WebSocket 內置Ping/Pong 心跳機制:服務器定期發送Ping幀,客户端必須回傳Pong幀;若超時未收到Pong,判定連接失效並主動斷開。;

主動斷開:任何一方發送Opcode=0x08的關閉幀,雙方確認後關閉 TCP 連接。

4.為什麼在握手階段需要升級協議

WebSocket 並非完全脱離 HTTP,而是藉助 HTTP 協議的 “握手流程” 完成 “協議切換”—— 通過一次 HTTP 請求,讓客户端和服務端達成共識:“接下來我們用 WebSocket 協議通信,不再遵循 HTTP 規則”。

4.1.這個升級過程的核心價值是:

兼容現有網絡環境:所有瀏覽器、網關、代理服務器都支持 HTTP;如果 WebSocket 設計成完全獨立的協議,可能被現有網絡設備攔截(無法穿透代理 / 防火牆)。

低成本建立 “長連接共識” :利用 HTTP 握手的 “請求 - 響應” 流程,讓雙方快速確認 “支持 WebSocket”,避免額外的協議協商開銷。

4.2、WebSocket 和 HTTP 的關係

在這裏插入圖片描述

1.3、應用場景

WebSocket 適用於需要低延遲、雙向實時通信的場景,典型案例包括:

即時通訊工具: 如網頁版微信、企業微信、在線客服系統等,需實時收發消息,WebSocket 可保證消息更實時。

實時協作工具: 如騰訊文檔、飛書文檔等,多人同時編輯時,需實時同步光標位置、內容修改,WebSocket 可確保協作流暢。

金融行情更新: 股票、期貨等實時行情數據(每秒多次更新),通過 WebSocket 推送,比輪詢更高效。

在線遊戲: 網頁小遊戲(如貪吃蛇聯機版)需要實時同步玩家操作和遊戲狀態,WebSocket 可滿足低延遲需求。

實時監控系統: 如物聯網設備監控(温度、濕度實時數據)、服務器性能監控,需持續接收設備 / 服務器推送的狀態數據。

彈幕系統: 視頻網站的實時彈幕, thousands 級用户同時發送和接收彈幕,WebSocket 可支撐高併發推送。



二、Server-Sent Events(SSE)

2.1、核心概念

SSE(Server-Sent Events,服務器發送事件)是一種基於 HTTP 協議的服務器向客户端單向實時推送數據的技術,專為 “服務器主動向客户端持續發送更新” 場景設計,是 Web 端實時通信的重要方案之一。

SSE 的核心是建立一個持久化的 HTTP 長連接,讓服務器可以隨時向客户端推送數據,而無需客户端頻繁發起請求。它是一種 “服務器到客户端” 的單向通信模式,與 WebSocket 的雙向通信形成互補。

其優勢在於原生支持自動重連、API 簡單(EventSource接口)、服務器實現成本低,適合無需客户端回傳數據的場景。與 WebSocket 相比,SSE 更專注於單向推送,實現和維護成本更低,是實時通知、日誌展示等場景的理想選擇。

關鍵特性

單向通信:僅支持服務器向客户端推送數據,客户端無法通過 SSE 向服務器發送數據(需配合 HTTP 或 WebSocket 實現雙向交互);

長連接:一次連接建立後持續保持,避免短連接的反覆握手開銷;

自動重連:連接意外斷開時,客户端會自動重試連接(默認間隔 3 秒);

文本流:數據以 UTF-8 文本流格式傳輸,二進制數據需編碼後發送。

2.2、原理介紹

SSE 的工作流程基於 HTTP 長連接和特殊的文本流協議,主要分為連接建立數據推送重連機制三個階段:

1. 連接建立:基於 HTTP 的長連接初始化

客户端通過瀏覽器原生的EventSourceAPI 發起連接請求,服務器返回符合 SSE 規範的響應頭,建立持久化連接:

客户端請求

// 客户端創建 SSE 連接(僅支持 GET 方法)
const sse = newEventSource('/service/stream');

瀏覽器會自動發送 HTTP 請求,攜帶特殊頭信息(如Accept: text/event-stream)。

服務器響應頭

HTTP/1.1200OK
Content-Type:text/event-stream; charset=utf-8  # 核心:標識為 SSE 流
Cache-Control:no-cache  # 禁止緩存,確保客户端接收實時數據
Connection:keep-alive   # 保持 HTTP 長連接
Access-Control-Allow-Origin:*  # 跨域配置(如需)

響應頭必須明確指定text/event-stream類型,告知客户端 “這是持續的事件流”。



2. 數據推送:基於規範的文本流格式

服務器通過 HTTP 長連接持續向客户端發送 “事件”,每個事件需遵循嚴格的文本格式,以\n\n作為結束符:

# 格式 1:默認事件(客户端通過 onmessage 接收)
data: 您有一條新消息\n
data: 內容:Hello World\n\n  # 多行 data 會合併為一條消息

# 格式 2:自定義事件名(客户端通過 addEventListener 接收)
event: orderStatus  # 事件名(如“訂單狀態更新”)
id: 10086           # 事件 ID(用於重連時定位斷點)
data: 訂單已發貨\n\n

# 格式 3:心跳保活(客户端忽略,僅維持連接)
: 這是註釋,無實際數據,防止長連接超時\n\n



3. 重連機制:自動恢復連接與數據補發

SSE 原生支持斷線重連,無需手動實現:

自動重連:若連接意外斷開(如網絡波動),客户端會在 3 秒後自動重試,並逐漸增加間隔(最多 30 秒);

數據補發:重連時,客户端會在請求頭中攜帶Last-Event-ID: 1000000(最後接收的事件 ID),服務器可基於此補發斷點後的所有數據,避免數據丟失。



4. 事件流流程圖
在這裏插入圖片描述

2.3、 應用場景

SSE 適用於服務器需主動向客户端單向推送數據的場景,典型案例包括:

AI智能助手: SSE 支持 AI 助手的流式輸出,以 “打字機” 效果逐字逐句呈現給用户,提升用户體驗,增強用户與 AI 助手的交互感 。

實時通知系統: 社交應用的消息提醒(“收到新評論”),服務器可通過 SSE 實時推送通知,無需客户端頻繁輪詢。

日誌 / 狀態實時展示: 如後端任務執行日誌(部署進度、測試報告)、CI/CD 流水線狀態,服務器可實時推送日誌片段,客户端實時展示(類似終端輸出)。

新聞 / 資訊推送: 如實時新聞客户端、股票資訊,服務器在有新內容(突發新聞、股價變動)時,通過 SSE 立即推送給訂閲用户。

監控數據展示: 如服務器 CPU 使用率、網絡流量等監控指標,每秒 / 每分鐘推送一次更新,客户端實時繪製監控曲線。

多人協作中的狀態同步: 如在線文檔的 “他人正在編輯” 狀態提示,服務器可通過 SSE 向所有協作者推送當前編輯者的操作狀態。



三、WebRTC

3.1、核心概念

WebRTC(Web Real-Time Communication,網頁實時通信)是一項瀏覽器原生支持的實時通信技術標準,允許瀏覽器之間直接建立點對點(P2P)連接,實現音視頻通話、數據傳輸等實時交互,無需依賴第三方插件或額外軟件。

WebRTC 的核心目標是打破傳統實時通信對中間服務器的強依賴,讓瀏覽器之間能夠直接傳輸數據(音視頻、文本、文件等),其關鍵特性包括:

點對點通信:數據主要在客户端之間直接傳輸(僅信號協商需服務器參與),減少延遲和服務器帶寬壓力;

原生瀏覽器支持:無需安裝插件,通過 JavaScript API 即可調用(如getUserMedia捕獲音視頻、RTCPeerConnection建立連接);

實時性強:基於 UDP 協議傳輸(部分場景降級為 TCP),延遲可低至 100-200 毫秒,滿足實時交互需求;

安全性內置:所有數據強制加密傳輸(通過 SRTP 協議),防止竊聽和篡改。

3.2、原理介紹

WebRTC 的工作流程可分為信號協商P2P 連接建立媒體流傳輸三個核心階段,其中 “信號協商” 需藉助服務器,而實際數據傳輸則在客户端之間直接進行。

1. 信號協商(Signaling):發現與連接準備

瀏覽器(客户端)無法直接知道對方的網絡位置(IP 地址、端口),需通過 “信號服務器” 交換連接所需的元數據(如網絡信息、媒體能力):

交換的核心信息

SDP(Session Description Protocol) :描述本地媒體能力(如支持的音視頻編碼格式、分辨率、採樣率等),分為 “offer”(發起方提議)和 “answer”(接收方應答);

ICE 候選地址(ICE Candidate) :包含本地網絡可被訪問的 IP 地址和端口(需穿透 NAT 網絡地址轉換)。

流程示例

◦客户端 A 生成 SDP offer 並通過信號服務器發送給客户端 B;

◦客户端 B 收到 offer 後,生成 SDP answer 並通過信號服務器返回給 A;

◦雙方分別收集自身的 ICE 候選地址(如本地局域網地址、NAT 轉換後的公網地址),並通過信號服務器互相發送;

◦雙方根據收到的 SDP 和 ICE 信息,確定最優通信路徑。

2. P2P 連接建立:穿透 NAT 與防火牆

由於多數設備處於 NAT(網絡地址轉換)或防火牆後,直接建立 P2P 連接需解決 “地址可達性” 問題,WebRTC 通過ICE(Interactive Connectivity Establishment)協議實現:

ICE 工作原理

◦首先嚐試 “主機候選地址”(本地局域網 IP),若雙方在同一局域網,直接建立連接;

◦若失敗,嘗試 “服務器反射候選地址”(通過 STUN 服務器獲取 NAT 轉換後的公網地址);

◦若仍失敗(如嚴格對稱 NAT 環境),則通過 TURN 服務器中轉數據(作為最後的 fallback 方案)。

關鍵服務器

STUN 服務器:幫助設備獲取自身的公網 IP 和端口(用於 NAT 穿透);

TURN 服務器:在 P2P 連接失敗時,作為中繼服務器轉發數據(確保通信不中斷,但增加延遲)。

3. 媒體流傳輸:實時音視頻與數據交互

連接建立後,WebRTC 通過兩套核心 API 實現數據傳輸:

媒體流傳輸(RTCPeerConnection)

◦客户端通過getUserMediaAPI 捕獲攝像頭、麥克風數據,生成MediaStream(媒體流);

◦通過RTCPeerConnection將媒體流編碼(如 H.264、VP8 視頻編碼,OPUS 音頻編碼)後,通過 RTP(實時傳輸協議)發送給對方;

◦接收方解碼後,通過<video><audio>標籤播放實時音視頻。

數據通道(RTCDataChannel)

◦除音視頻外,WebRTC 支持通過RTCDataChannel傳輸任意二進制或文本數據(如聊天消息、文件、遊戲控制指令);

◦數據通道支持可靠傳輸(類似 TCP,保證數據有序、不丟失)和非可靠傳輸(類似 UDP,低延遲但可能丟包),可按需配置。

3.3、應用場景

WebRTC 適用於需要低延遲、點對點實時交互的場景,尤其在音視頻通信領域應用廣泛:

實時音視頻通****話: 如網頁版視頻會議(騰訊會議網頁版)、在線問診(醫生與患者視頻溝通)、遠程面試系統等,WebRTC 可提供 100-200ms 低延遲的音視頻傳輸。

屏幕共享與遠程協助: 如在線教育中的老師屏幕共享、遠程辦公中的技術支持(協助操作對方電腦),通過getDisplayMediaAPI 捕獲屏幕流並實時傳輸。

實時互動直播: 如直播平台的連麥功能(主播與觀眾實時互動)、在線課堂的師生互動,WebRTC 可支持多人間的低延遲音視頻交互。

瀏覽器端 P2P 文件傳輸: 如基於網頁的文件共享工具,用户可直接向其他在線用户發送文件,無需通過服務器中轉(速度取決於雙方帶寬)。

實時遊戲: 如多人文本冒險遊戲、簡單實時對戰遊戲,通過RTCDataChannel傳輸玩家操作指令,實現低延遲同步。

物聯網設備實時監控: 如通過網頁實時查看家用攝像頭畫面、工業設備監控視頻,WebRTC 可直接接收設備推送的音視頻流。



四、輪詢

輪詢是 Web 實時通信的 “早期方案”,核心邏輯是客户端通過週期性發送 HTTP 請求,主動從服務器獲取最新數據,本質是利用 HTTP 短連接模擬 “實時” 效果。核心優勢是兼容性強、實現簡單,核心劣勢是服務器開銷大、實時性有限。隨着 WebSocket 和 SSE 的普及,輪詢已逐漸退出主流實時場景,但在兼容性要求極高或低成本臨時需求中,仍是一種可落地的選擇(這裏不再詳細介紹)。實際開發中,優先選擇 WebSocket/SSE,僅在必要時考慮輪詢。

五、技術對比與選型建議

WebSocket、SSE、WebRTC 和輪詢是 Web 端實時通信的四大核心技術,以下從技術特性、優缺點、適用場景三個維度進行對比分析:

5.1、技術特性對比
對比維度 WebSocket SSE(Server-Sent Events) WebRTC 輪詢(短 / 長)
通信方向 全雙工(客户端↔服務器雙向) 單向(服務器→客户端) 全雙工(客户端↔客户端 P2P) 偽雙向(客户端請求→服務器響應)
連接類型 基於 TCP 的長連接(HTTP 升級) 基於 HTTP 的長連接 基於 UDP/TCP 的 P2P 長連接 短連接(短輪詢)/ 掛起長連接(長輪詢)
延遲 極低(毫秒級,無 HTTP 頭冗餘) 低(數據產生即推送,HTTP 頭開銷小) 極低(100-200ms,音視頻優化) 高(短輪詢取決於間隔)/ 中(長輪詢)
數據類型 文本、二進制(支持任意數據) 文本(二進制需編碼為 Base64) 音視頻流、文本、二進制(文件等) 文本、二進制(需自定義格式)
服務器依賴 高(需維護長連接,支持高併發) 中(單連接推送,資源消耗低) 低(僅信號協商需服務器,數據直連) 高(短輪詢請求密集,長輪詢掛起連接)
自動重連 需手動實現(配合心跳機制) 原生支持(斷線後自動重試) 需手動實現(複雜網絡環境下重連邏輯) 需手動實現(定時器重試)
兼容性 主流瀏覽器支持(IE 不支持) 主流瀏覽器支持(IE 不支持) 主流瀏覽器支持(需 HTTPS 環境) 所有瀏覽器(基於 HTTP)
典型協議 / API ws:///wss://new WebSocket() EventSourceAPI RTCPeerConnectiongetUserMedia fetch/XMLHttpRequest+ 定時器
5.2、核心優缺點分析

2.1. WebSocket

優點:全雙工通信、低延遲、支持任意數據類型,適合高頻雙向交互;

缺點:服務器需維護長連接(高併發場景需負載均衡),實現複雜度高於 SSE / 輪詢。

2.2. SSE

優點:服務器單向推送場景下實現簡單(客户端EventSource開箱即用),自動重連,服務器資源消耗低;

缺點:僅支持單向通信,不支持二進制原生傳輸,IE 完全不兼容。

2.3. WebRTC

優點:點對點通信(減少服務器帶寬壓力),音視頻傳輸延遲極低,支持文件等二進制數據;

缺點:實現複雜(需處理 NAT 穿透、信號協商),瀏覽器兼容性細節差異大,依賴 STUN/TURN 服務器。

2.4. 輪詢

優點:實現最簡單,兼容性 100%(支持所有瀏覽器和服務器);

缺點:實時性差(短輪詢延遲高,長輪詢服務器壓力大),帶寬浪費嚴重。

5.3、適用場景對比
場景類型 首選技術 次選技術 不推薦技術
即時聊天 WebSocket 長輪詢(兼容) 短輪詢、SSE
AI智能助手(流式輸出) SSE WebSocket 輪詢
音視頻通話 / 屏幕共享 WebRTC - 其他技術(延遲高)
實時協作工具(如騰訊文檔) WebSocket - 輪詢、SSE
股票 / 行情實時更新 WebSocket/SSE 長輪詢 短輪詢
在線遊戲(實時交互) WebSocket WebRTC(P2P 遊戲) 輪詢
日誌 / 監控數據實時展示 實時通知(如訂單更新) SSE WebSocket 短輪詢
兼容性要求極高(如 IE8) 長輪詢 短輪詢 其他技術(不兼容)



六、一些進階問題

6.1、高併發與擴展性問題

當連接數達到數萬甚至數十萬級時,單台服務器難以承載,需解決 “連接瓶頸” 和 “負載均衡” 問題。

6.2、數據安全與身份認證

實時通信涉及用户敏感數據(如聊天內容、音視頻),需解決 “身份驗證” 和 “數據加密” 問題:通過身份認證機制和數據加密傳輸解決。

6.3、網絡穩定性與連接可靠性

弱網環境(如 4G 切換、WiFi 信號差)會導致連接中斷或數據丟失,需通過 “保活機制” 和 “重連策略” 保障可靠性:

連接保活機制

WebSocket:實現 Ping/Pong 心跳(服務器定時發Ping,客户端回Pong),超時未響應則判定連接失效:

SSE:服務器定期發送註釋幀(:\n\n)作為心跳,防止長連接被網關超時關閉。

WebRTC:通過RTCPeerConnectiononiceconnectionstatechange監聽連接狀態,狀態為failed時觸發重連。

長輪詢:設置合理超時時間(如 30 秒),客户端收到超時響應後立即重試,避免連接長期閒置。

智能重連策略

指數退避重連:重連間隔按指數增長(1s → 2s → 4s → 最大 30s),避免網絡恢復時的請求風暴

網絡感知重連:通過navigator.connection.effectiveType判斷網絡類型(如 2g/3g/4g),弱網環境下延長重連間隔。

數據補發機制

▪WebSocket/SSE:重連後通過Last-Event-ID或自定義偏移量(如消息 ID)向服務器請求遺漏數據;

▪WebRTC:關鍵數據(如遊戲操作)啓用可靠傳輸模式(ordered: true),確保重連後補發。

6.4、跨域與瀏覽器兼容性

不同技術的跨域處理和瀏覽器支持存在差異,需針對性兼容:

•跨域通信處理

WebSocket:支持跨域,服務器需在握手階段返回Access-Control-Allow-Origin: *(或指定域名),並驗證Origin頭防止惡意請求。

SSE:同 WebSocket,依賴 HTTP 跨域頭(Access-Control-*),且EventSource僅支持 GET 請求,無法攜帶自定義頭(需通過 URL 參數傳遞認證信息)。(在微信小程序中有版本和平台的兼容問題,這裏暫不敍述)

WebRTC:信令服務器需配置跨域,媒體流傳輸本身不涉及跨域(P2P 直連)。

輪詢:通過 CORS 或 JSONP(僅 GET)處理跨域,同普通 HTTP 請求。

•瀏覽器兼容性適配

WebSocket:IE 不支持,需用Socket.IO等庫自動降級為長輪詢(兼容 IE 8+)。

SSE:IE 完全不支持,可通過fetch+ 長輪詢模擬 SSE 功能(如sse.js庫)。

WebRTC:不同瀏覽器對編碼格式支持不同(如 Safari 不支持 VP8),需在 SDP 協商時指定兼容編碼(如 H.264);移動端需處理攝像頭權限請求差異。

輪詢:無兼容性問題,但需注意老舊瀏覽器對fetch的支持(可降級為XMLHttpRequest

七、其它

•WebSocket:https://www.w3.org/TR/websockets/,介紹了 WebSocket API 的相關內容。

•SSE:https://developer.mozilla.org/en-US/docs/Web/API/EventSource,對 SSE 的使用方法和相關 API 進行了詳細説明。

•WebRTC:https://www.w3.org/TR/webrtc/,定義了一組 ECMAScript API,允許媒體和通用應用數據在瀏覽器或設備之間進行實時發送和接收。

user avatar u_15745565 头像 chaoxi_67109d31bc42f 头像 nidexiaoxiongruantangna 头像 chen_5ec331606ce75 头像 kuaidi100api 头像 shirleyyd 头像 superiorc 头像 jueqiangdeshitou_ 头像 magnesium_5a22722d4b625 头像 aipaobudexiangjiao_cktinz 头像 chongdongdeludeng 头像 onekbitdaohang 头像
点赞 18 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.