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

今天翻譯一篇關於 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 套接字在客戶端顯示數據,這些數據由後端服務器連續發送。在 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-socket-and-how-it-is-different-from-the-http/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章