WebSocket是什么以及其與HTTP的區別
HTTP協議
HTTP是單向的,客戶端發送請求,服務器發送響應。舉個例子,當用戶向服務器發送請求時,該請求采用HTTP或HTTPS的形式,在接收到請求后,服務器將響應發送給客戶端,每個請求都與相應的響應相關聯,在發送響應后,連接關閉,每次HTTP或HTTPS請求都會建立到服務器的新連接,并且在獲得響應后,連接會自行終止。
HTTP是一種在TCP之上運行的無狀態協議,TCP是一種面向連接的協議,它保證使用三方握手方法傳遞數據包,并重新傳輸丟失的數據包。
HTTP可以在任何可靠的面向連接的協議(如TCP、SCTP)之上運行。當客戶端向服務器發送HTTP請求時,客戶端和服務器之間的TCP連接是打開的,在得到響應后,TCP連接被終止,每個HTTP請求都會打開到服務器的單獨TCP連接。例如,如果客戶端向服務器發送10個請求,則10個單獨的TCP連接將被打開,并在獲得響應/回退后關閉。
以ASCII編碼的HTTP消息信息,每個HTTP請求消息包括HTTP協議版本(HTTP/1.1、HTTP/2)、HTTP方法(GET/POST等)、HTTP標頭(內容類型、內容長度)、主機信息等,以及包含正在傳輸到服務器的實際消息的主體。HTTP標頭的大小從200字節到2KB不等,HTTP標頭的常見大小為700-800字節。當Web應用程序在客戶端使用更多的cookie和其他工具來擴展代理的存儲功能時,它會減少HTTP標頭負載。
圖1 HTTP連接示意圖
WebSocket
WebSocket是雙向的,是一種全雙工協議,用于相同的客戶端-服務器通信場景,與HTTP不同,它從ws://或wss://開始。它是一個有狀態的協議,這意味著客戶端和服務器之間的連接將保持有效,直到任何一方(客戶端或服務器)終止。客戶端和服務器關閉連接后,連接將從兩端終止。
讓我們舉一個客戶端-服務器通信的例子,有一個客戶端,它是一個Web瀏覽器和一個服務器,每當我們啟動客戶端和服務器之間的連接時,客戶端-服務器都會進行握手,并決定創建一個新的連接,這個連接將保持有效,直到它們中的任何一個終止。當連接建立并處于活動狀態時,使用相同的連接信道進行通信,直到通信終止。
這就是在客戶端-服務器握手之后,客戶端-服務器如何決定一個新的連接以保持其活動,這個新的連接將被稱為WebSocket。一旦通信鏈路建立和連接打開,消息交換將以雙向模式進行,直到客戶端-服務器之間的連接持續存在。如果他們中的任何人(客戶端服務器)宕機或決定關閉連接,雙方都將關閉連接。套接字的工作方式與HTTP的工作方式略有不同,狀態代碼101表示WebSocket中的交換協議。
圖2 WebSocket連接示意圖
PART.01何時使用WebSocket
1、實時Web應用:實時Web應用程序使用Web套接字在客戶端顯示數據,這些數據由后端服務器不斷發送。在WebSocket中,數據被不斷地推送/傳輸到已經打開的同一連接中,這就是為什么WebSocket更快并提高了應用程序性能。例如,在交易網站或比特幣交易中,為了顯示價格波動和移動數據,后端服務器使用WebSocket通道不斷向客戶端推送。
2、游戲應用程序:在游戲應用程序中,可能會關注這一點,服務器不斷接收數據,在不刷新UI的情況下,它將在屏幕上生效,UI甚至在不建立新連接的情況下自動刷新,因此它在游戲應用程序中非常有用。
3、聊天應用程序:聊天應用程序使用WebSocket只建立一次連接,以便在訂閱者之間交換、發布和廣播消息。它重用相同的WebSocket連接,用于發送和接收消息以及進行一對一的消息傳輸。
PART.02何時不使用WebSocket
如果我們想要通過網絡傳輸任何實時更新或連續的數據流,可以使用WebSocket。
如果我們只想獲取一次數據來用應用程序處理它,我們應該使用HTTP協議,只獲取一次的數據可以通過簡單的HTTP請求查詢,所以在這種情況下,最好不要使用WebSocket。

























