Engine.io 工作流程圖

← INSIGHTS & PERSPECTIVES | 後端開發

Engine.io 介紹

Engine.IO 是 Socket.IO 的底層即時通訊引擎,負責 WebSocket 與 polling 的傳輸升級機制。本文介紹 Engine.IO 的架構、握手流程、封包格式與和 Socket.IO 的關係。

Socket.IO 好用,但它底層是怎麼運作的?Socket.io 是在 engine.io 的基礎上去實作的。engine.iosocket.io 提供跨瀏覽器、跨設備的雙向通信底層庫,封裝了 WebSocket 和 XHR 兩種方式,並能在不支援 WebSocket 的舊瀏覽器上自動改用長輪詢。這篇整理 engine.io 的連線方式設定、工作流程與編碼格式。

Engine.io 是什麼?

Socket.io 是在 engine.io 的基礎上去實作的。

Gitlab 連結:Engine.IO: the realtime engine

engine.iosocket.io 提供跨瀏覽器/跨設備的雙向通信的底層庫。engine.io 使用了 WebsocketXHR 方式封裝了一套 socket 協議。在低版本的瀏覽器中,不支援 Websocket,為了兼容使用長輪詢(polling)替代。

關於長輪詢可參考我的另一篇文章:WebSocket 與 Ajax 的不同

過去 WebSocket 未出來時,許多聊天室使用的都是長輪詢的方式去實作,而 engine.io 則可依據客戶端環境兼容使用這兩種方式。

連線方式要怎麼設定?

在 engine.io 的 constructor 的參數裡有一個值是 transports,這邊的 polling 指的就是長輪詢。預設值是會先用 polling(HTTP)去詢問,若回傳 101 Switching Protocols 則才發起 websocket 連接。

transports (<Array> String): transports to allow connections to (['polling', 'websocket'])

請參考 RFC 7231 規範

注意:這一點很重要,默認的會使用長輪詢的連接方式作為第一手方案,隨後如果設備支持的話會升級到使用 WebSocket。如果 transports 選項的值設置為 ['websocket'],則意味著直接使用 WebSocket 方式建立連接,並且如果這一連接方式不能使用,也不會自動切換到備用的連接方案(polling)。因此目前建議使用默認的設置即可,除非你明白確信使用場景和你想要做什麼。

Engine.io 的工作流程長什麼樣?

Engine.io 從長輪詢升級到 WebSocket 的工作流程圖
Engine.io 連線過程的封包流程截圖

Engine.io 有哪兩種編碼方式?

engine.io 有兩種編碼方式:

packet

例如:2probe => 2(packet type id)+ probe(data)

Type說明
0 open當打開一個新傳輸時,服務端檢測並發送
1 close請求關閉傳輸,但不是主動斷開連接
2 ping客戶端發出,服務端應該返回包含相同數據的 pong packet 進行應答
3 pong服務端發出,用以響應客戶端的 ping packet
4 message真實數據,客戶端和服務端應該調用回調中的 data
5 upgrade升級傳輸方式
6 noop空操作

payload

Payload 是綁定在一起的一系列編碼分組,其格式是:<length1>:<packet1>[<length2>:<packet2>[...]]

例如:

97:0{"sid":"Peed250dk55pprwgAAAA","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":60000}2:40

Engine.io 支持哪些傳輸方式?

engine.io 支持的傳輸方式:

  • websocket
  • polling:jsonp、xhr

常見問題

QEngine.io 和 Socket.IO 的關係是什麼?

Socket.io 是在 engine.io 的基礎上去實作的,engine.io 是底層的雙向通信引擎,負責連線、傳輸與編碼;Socket.IO 則在其上加入了命名空間、房間、事件等高階功能。

Q為什麼 engine.io 預設先用 polling 再升級到 WebSocket?

為了兼容不支援 WebSocket 的低版本瀏覽器。預設先用長輪詢(HTTP)詢問,若伺服器回傳 101 Switching Protocols 才發起 WebSocket 連接,確保任何環境都能建立連線。

Q可以直接設定只用 WebSocket 嗎?

可以,把 transports 設為 ['websocket'] 就會直接用 WebSocket 建立連接,但如果連不上也不會自動切換回 polling。除非確信使用場景,否則建議使用默認設定。

Q什麼是 payload 格式?

Payload 是綁定在一起的一系列編碼分組,格式為 <length1>:<packet1>[<length2>:<packet2>[...]],例如 2:40 代表長度 2 的 40 封包。

參考資料

延伸閱讀

最後更新

2026-08-28(原文發布於 2020-03-13,本文保留原始筆記內容並補上 GEO 結構。)

關於作者

Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。

首次發布:2020-03-13