websocket和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服務足以從服務器獲取數據。

總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM