繁體中文(香港)
  • HTTP 協議
  • WebSocket 協議
  • 網絡應用
  • TCP
  • 客戶端伺服器通信

HTTP 與 WebSocket

本文比較了 HTTP 和 WebSocket 協議,解釋了它們的主要差異、特點和理想的使用案例。它為開發者選擇適合其網絡應用程序的協議提供了重要的見解,對比了 HTTP 的請求-回應模型與 WebSocket 的實時雙向通信能力。

Darcy Ye
Darcy Ye
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

整個數字世界的基礎是機器之間的通信。授權客戶端創建請求,伺服器接收、解釋並提供適當的回應。這是普通人對數字通信的常識。然而,幕後的工作卻是複雜而繁瑣的。

應用開發者需要做很多工作以確保這種客戶端和伺服器的通信能夠正常運行。選擇合適的通信協議就是其中的一項任務。當開發者試圖選擇可行的通信協議時,HTTP 和 WebSocket 是他們會遇到的兩個常見概念。

理清這兩者的相似性、功能和其他方面,對於基於實際需求選擇正確的選項非常關鍵。

介紹 HTTP

讓我們先來了解一下 HTTP。它可能是數字通信領域中最常用的協議。HTTP 的初始版本於 1989 年推出,功能和應用範圍有限。但它很快得到了改善和升級,以支持瀏覽器與伺服器之間的大規模通信。

HTTP 是一種單向協議,意味著在任何給定時間,通信中只有一方可以發送或接收資訊。當客戶端向伺服器發送請求時,這個請求以 HTTP 或 HTTPS 的形式發送,伺服器在接收到該請求後發送相應的、唯一的回應給客戶端。每個 HTTP 或 HTTPS 請求都會建立與伺服器的新連接,並在收到回應後自動終止連接。

HTTP 的一些主要特點包括:

  • 無狀態
  • 可以基於面向連接的協議(如 SCTP 和 TCP)工作
  • 資訊以 ASCII 編碼
  • HTTP 請求的主要組件包括 HTTP 版本(HTTP/1.1, HTTP/2, HTTP/3)、方法、HTTP 標頭、主機資訊和訊息

什麼是 WebSocket?

WebSocket 是一種能夠在客戶端和伺服器之間實現實時雙向通信的通信協議。

WebSocket 是一種為網絡應用程序創建實時雙向通信通道的協議。不同於傳統的 HTTP 請求(通常一個請求對應一個回應),WebSocket 可以建立持久化連接,允許伺服器實時推送資料給客戶端,同時也能接收來自客戶端的數據。相比於傳統的輪詢,WebSocket 大大降低了網絡流量和延遲,提高了資料傳輸的效率和速度。它特別適合開發實時網絡應用程序和網絡遊戲。

WebSocket 的一些主要特點包括:

  • 基於持久性的 TCP 連接,該連接會保持開放狀態,直到客戶端或伺服器發起終止請求
  • 構建在 HTTP 協議之上,所有 WebSocket 請求都是通過標準的 HTTP 協議發送,然後在伺服器端識別為具有特定標頭訊息的升級
  • WebSocket 協議基於幀(數據包),一個完整的數據包可以被分成多個幀,每個幀包含部分數據和標頭資訊

HTTP 和 WebSocket 的關係

從上面的介紹中,我們可以看到 HTTP 和 WebSocket 協議都:

  • 使用 TCP 協議進行數據傳輸
  • 用作客戶端和伺服器之間的通信

我們可以通過下表更直觀地顯示 HTTP 和 WebSocket 之間的差異。

HTTPWebSocket
為每個請求建立新連接(除非使用長連接,如 HTTP/1.1 Keep-Alive),並在通信結束後關閉連接連接保持開放狀態,在成功初次握手後,除非主動關閉或發生錯誤
單向通信模式,客戶端發送請求,伺服器返回回覆,每次新通信都需要重新建立連接雙向通信模式,在建立連接後,客戶端和伺服器可以隨時發送數據,而不需重新建立連接
每次通信需要發送完整的請求和回應標頭,因此對於頻繁的短訊息通信,開銷較大一旦建立連接,資料傳輸變得輕量,不需每次傳輸標頭信息,適用於高頻、低延遲的通信需求
主要用於傳輸相對穩定的數據主要用於傳輸實時數據
由於每個請求需要重新建立連接,並通過標頭等傳輸必要信息,帶寬使用效率和響應速度受到影響持續連接消除了每次請求建立連接和傳輸必要信息的步驟,降低了延遲,提高了帶寬使用效率
頻繁請求影響性能頻繁請求不影響性能

如何選擇使用哪種協議?

基於上一節中 HTTP 和 WebSocket 優缺點的比較,我們可以從兩個不同的維度來評估使用場景:

  1. 數據是否快速變化,業務是否依賴於實時數據
  2. 是否涉及頻繁的雙向通信

例如,如果 Jack 想構建一個視頻聊天應用程序,其中每個用戶需要接收聊天對方的實時視頻數據並將自己的視頻流數據傳送給對方,那麼 WebSocket 是最佳選擇。

Logto 的管理控制台不需要頻繁獲取當前登錄用戶的資源使用情況,因為只有當用戶修改配置時資源才會改變狀態。它只需要在用戶操作資源時及時重新獲取資源狀態。從這個角度來看,HTTP 非常適合 Logto 管理控制台的使用場景。同樣,對於大多數雲服務儀表板,可以選擇 HTTP 作為儀表板和伺服器之間的通信協議。