什麼是 WebSocket,它與 HTTP 有何不同?

KevinYan發表於2020-03-15

今天翻譯一篇關於HTTPWebSocket的文章,HTTPWebSocket都是客戶端-伺服器通訊中使用的通訊協議。文章用幾個例子解釋了兩者的不同以及分別適用在什麼應用場景。有些容易混淆的概念(比如說HTTP長連線)和待補充的概念我用斜體字註解到了文章中。

HTTP協議

HTTP是單向的,客戶端傳送請求,伺服器傳送響應。舉例來說,當客戶端向伺服器傳送請求時,該請求以HTTPHTTPS的形式傳送,在接收到請求後,伺服器會將響應傳送給客戶端。每個請求都與一個對應的響應相關聯,在傳送響應後客戶端與伺服器的連線會被關閉。每個HTTPHTTPS請求每次都會新建與伺服器的連線,並且在獲得響應後,連線將自行終止。
HTTP是在TCP之上執行的無狀態協議,TCP是一種面向連線的協議,它使用三向握手方法保證資料包傳輸的傳遞並重新傳輸丟失的資料包。

HTTP可以執行在任何可靠的面向連線的協議(例如TCPSCTP)的上層。當客戶端將HTTP請求傳送到伺服器時,客戶端和伺服器之間將開啟TCP連線,並且在收到響應後,TCP連線將終止,每個HTTP請求都會建立單獨的TCP連線到伺服器,例如如果客戶端向伺服器傳送10個請求,則將開啟10個單獨的HTTP連線。並在獲得響應後關閉。

理解上面這段關於 HTTP的描述時我覺得還要了解一下HTTP長連線的概念,以及HTTPTCP的關係,簡單概括一下就是

  • HTTP協議的長連線和短連線,實質上是TCP協議的長連線和短連線。

  • 每個HTTP連線完成後,其對應的TCP連線並不是每次都會關閉。從 HTTP/1.1起,預設使用長連線,用以保持連線特性。使用長連線的HTTP協議,會在響應頭有加入這個頭部欄位:Connection:keep-alive

  • 在使用長連線的情況下,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線。Keep-Alive不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如ApacheNginxNginx中這個預設時間是 75s)中設定這個時間。實現長連線要客戶端和服務端都支援長連線。

  • HTTP屬於應用層協議,在傳輸層使用TCP協議,在網路層使用IP協議。IP協議主要解決網路路由和定址問題,TCP協議主要解決如何在IP層之上可靠的傳遞資料包,使在網路上的另一端收到發端發出的所有包,並且順序與發出順序一致。TCP有可靠,面向連線的特點。

HTTP訊息資訊是用ASCII編碼的,每個HTTP請求訊息均包含HTTP協議版本(HTTP/1.1HTTP/2),HTTP方法(GET/POST等),HTTP標頭(Content-TypeContent-Length),主機資訊等。以及包含要傳輸到伺服器的實際訊息的正文(請求主體)。HTTP標頭的大小從200位元組到2KB不等,HTTP標頭的常見大小是700-800位元組。當Web應用程式在客戶端使用更多cookie和其他工具擴充套件代理的儲存功能時,它將減少HTTP標頭的荷載。

WebSocket協議

WebSocket是雙向的,在客戶端-伺服器通訊的場景中使用的全雙工協議,與HTTP不同,它以ws://wss://開頭。它是一個有狀態協議,這意味著客戶端和伺服器之間的連線將保持活動狀態,直到被任何一方(客戶端或伺服器)終止。在通過客戶端和伺服器中的任何一方關閉連線之後,連線將從兩端終止。

讓我們以客戶端-伺服器通訊為例,每當我們啟動客戶端和伺服器之間的連線時,客戶端-伺服器進行握手隨後建立一個新的連線,該連線將保持活動狀態,直到被他們中的任何一方終止。建立連線並保持活動狀態後,客戶端和伺服器將使用相同的連線通道進行通訊,直到連線終止。

新建的連線被稱為WebSocket。一旦通訊連結建立和連線開啟後,訊息交換將以雙向模式進行,客戶端-伺服器之間的連線會持續存在。如果其中任何一方(客戶端伺服器)宕掉或主動關閉連線,則雙方均將關閉連線。套接字的工作方式與HTTP的工作方式略有不同,狀態程式碼101表示WebSocket中的交換協議。

何時使用WebSocket

  • 即時Web應用程式:即時Web應用程式使用一個Web套接字在客戶端顯示資料,這些資料由後端伺服器連續傳送。在WebSocket中,資料被連續推送/傳輸到已經開啟的同一連線中,這就是為什麼WebSocket更快並提高了應用程式效能的原因。
    例如在交易網站或比特幣交易中,這是最不穩定的事情,它用於顯示價格波動,資料被後端伺服器使用Web套接字通道連續推送到客戶端。

  • 遊戲應用程式:在遊戲應用程式中,你可能會注意到,伺服器會持續接收資料,而不會重新整理使用者介面。螢幕上的使用者介面會自動重新整理,而且不需要建立新的連線,因此在WebSocket遊戲應用程式中非常有幫助。

  • 聊天應用程式:聊天應用程式僅使用WebSocket建立一次連線,便能在訂閱戶之間交換,釋出和廣播訊息。它重複使用相同的WebSocket連線,用於傳送和接收訊息以及一對一的訊息傳輸。

不能使用WebSocket的場景

如果我們需要通過網路傳輸的任何實時更新或連續資料流,則可以使用WebSocket。如果我們要獲取舊資料,或者只想獲取一次資料供應用程式使用,則應該使用HTTP協議,不需要很頻繁或僅獲取一次的資料可以通過簡單的HTTP請求查詢,因此在這種情況下最好不要使用WebSocket

注意:如果僅載入一次資料,則RESTful Web服務足以從伺服器獲取資料。

總結

WEBSOCKET HTTP
WebSocket是一種雙向通訊協議,可以通過重用已建立的連線通道將資料從客戶端傳送到伺服器,或者從伺服器傳送到客戶端。連線保持活動狀態,直到被客戶端或伺服器終止。 HTTP協議是TCP協議之上的單向協議,TCP是面向連線的傳輸層協議,我們可以在獲得響應HTTP連線關閉後再使用HTTP請求方法來建立連線。
幾乎所有的實時應用程式(如(交易,監視,通知)服務)都使用WebSocket在單個通訊通道上接收資料。 簡單的RESTful應用程式使用無狀態的HTTP協議。
所有經常更新的應用程式都應該使用WebSocket,它比HTTP連線更快。 當我們不想在特定時間內保留連線或不重複使用單個連線來傳輸資料時使用HTTPHTTP連線的速度比WebSocket慢。

來源:GeeksforGeeks

原文連結:https://www.geeksforgeeks.org/what-is-web-...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

公眾號:網管叨bi叨 | Golang、PHP、Laravel、Docker等學習經驗分享

相關文章