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