今天翻譯一篇關於HTTP
和WebSocket
的文章,HTTP
和WebSocket
都是客戶端-伺服器通訊中使用的通訊協議。文章用幾個例子解釋了兩者的不同以及分別適用在什麼應用場景。有些容易混淆的概念(比如說HTTP
長連線)和待補充的概念我用斜體字註解到了文章中。
HTTP協議
HTTP
是單向的,客戶端傳送請求,伺服器傳送響應。舉例來說,當客戶端向伺服器傳送請求時,該請求以HTTP
或HTTPS
的形式傳送,在接收到請求後,伺服器會將響應傳送給客戶端。每個請求都與一個對應的響應相關聯,在傳送響應後客戶端與伺服器的連線會被關閉。每個HTTP
或HTTPS
請求每次都會新建與伺服器的連線,並且在獲得響應後,連線將自行終止。HTTP
是在TCP
之上執行的無狀態協議,TCP
是一種面向連線的協議,它使用三向握手方法保證資料包傳輸的傳遞並重新傳輸丟失的資料包。
HTTP
可以執行在任何可靠的面向連線的協議(例如TCP
,SCTP
)的上層。當客戶端將HTTP
請求傳送到伺服器時,客戶端和伺服器之間將開啟TCP
連線,並且在收到響應後,TCP
連線將終止,每個HTTP
請求都會建立單獨的TCP
連線到伺服器,例如如果客戶端向伺服器傳送10個請求,則將開啟10個單獨的HTTP
連線。並在獲得響應後關閉。
理解上面這段關於 HTTP
的描述時我覺得還要了解一下HTTP
長連線的概念,以及HTTP
與TCP
的關係,簡單概括一下就是:
HTTP
協議的長連線和短連線,實質上是TCP
協議的長連線和短連線。每個
HTTP
連線完成後,其對應的TCP
連線並不是每次都會關閉。從HTTP/1.1
起,預設使用長連線,用以保持連線特性。使用長連線的HTTP
協議,會在響應頭有加入這個頭部欄位:Connection:keep-alive
在使用長連線的情況下,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸
HTTP
資料的TCP
連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線。Keep-Alive
不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如Apache
,Nginx
,Nginx
中這個預設時間是 75s)中設定這個時間。實現長連線要客戶端和服務端都支援長連線。HTTP
屬於應用層協議,在傳輸層使用TCP
協議,在網路層使用IP
協議。IP
協議主要解決網路路由和定址問題,TCP
協議主要解決如何在IP
層之上可靠的傳遞資料包,使在網路上的另一端收到發端發出的所有包,並且順序與發出順序一致。TCP
有可靠,面向連線的特點。
HTTP訊息資訊是用ASCII
編碼的,每個HTTP
請求訊息均包含HTTP
協議版本(HTTP/1.1
,HTTP/2
),HTTP
方法(GET
/POST
等),HTTP
標頭(Content-Type
,Content-Length
),主機資訊等。以及包含要傳輸到伺服器的實際訊息的正文(請求主體)。HTTP
標頭的大小從200位元組到2KB
不等,HTTP
標頭的常見大小是700-800位元組。當Web
應用程式在客戶端使用更多cookie
和其他工具擴充套件代理的儲存功能時,它將減少HTTP
標頭的荷載。
WebSocket協議
WebSocket
是雙向的,在客戶端-伺服器通訊的場景中使用的全雙工協議,與HTTP
不同,它以ws://
或wss://
開頭。它是一個有狀態協議,這意味著客戶端和伺服器之間的連線將保持活動狀態,直到被任何一方(客戶端或伺服器)終止。在通過客戶端和伺服器中的任何一方關閉連線之後,連線將從兩端終止。
讓我們以客戶端-伺服器通訊為例,每當我們啟動客戶端和伺服器之間的連線時,客戶端-伺服器進行握手隨後建立一個新的連線,該連線將保持活動狀態,直到被他們中的任何一方終止。建立連線並保持活動狀態後,客戶端和伺服器將使用相同的連線通道進行通訊,直到連線終止。
新建的連線被稱為WebSocket
。一旦通訊連結建立和連線開啟後,訊息交換將以雙向模式進行,客戶端-伺服器之間的連線會持續存在。如果其中任何一方(客戶端伺服器)宕掉或主動關閉連線,則雙方均將關閉連線。套接字的工作方式與HTTP
的工作方式略有不同,狀態程式碼101
表示WebSocket
中的交換協議。
何時使用WebSocket
即時
Web
應用程式:即時Web
應用程式使用一個Web
套接字在客戶端顯示資料,這些資料由後端伺服器連續傳送。在WebSocke
t中,資料被連續推送/傳輸到已經開啟的同一連線中,這就是為什麼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 連線更快。 |
當我們不想在特定時間內保留連線或不重複使用單個連線來傳輸資料時使用HTTP ,HTTP 連線的速度比WebSocket 慢。 |
來源:GeeksforGeeks
本作品採用《CC 協議》,轉載必須註明作者和本文連結