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