有了HTTP為什么還要Websocket?一文帶你解密Websocket協(xié)議
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
我們的外賣、打車、購(gòu)物等都離不開HTTP或者Websocket等通信協(xié)議的實(shí)現(xiàn)。作為開發(fā)、SRE,在構(gòu)建和維護(hù)應(yīng)用程序時(shí),應(yīng)該使用哪種通信協(xié)議? 或者面試官問(wèn)你:websocket與http有什么區(qū)別?什么時(shí)候需要使用websocket?你又當(dāng)如何作答呢,跟我一起盤一盤唄!! Websocket是什么?WebSocket是一種網(wǎng)絡(luò)通信協(xié)議,它采用長(zhǎng)連接的方式,提供了在單個(gè)TCP連接上進(jìn)行全雙工通信的方式。與HTTP協(xié)議服務(wù)端只能被動(dòng)響應(yīng)的方式不同,websocket是支持主動(dòng)從服務(wù)端推送數(shù)據(jù)給客戶端。所以常用于IM聊天,在線游戲,通知等場(chǎng)景 Websocket連接WebSocket 協(xié)議會(huì)在客戶端與服務(wù)端之間建立全雙工通道,客戶端和服務(wù)器都可以通過(guò)長(zhǎng)連接同時(shí)發(fā)送和接收數(shù)據(jù)。這種通信方式比 HTTP 輪詢具有更少的開銷 因?yàn)?strong style="-webkit-tap-highlight-color: transparent; margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-width: 0px; border-style: solid; border-color: hsl(var(--border)); text-align: left; line-height: 1.75; font-size: inherit; color: rgb(15, 76, 129);">連接的雙方可以隨時(shí)發(fā)送消息,所以在需要快速傳輸大量數(shù)據(jù)時(shí),WebSocket 連接是一個(gè)很好的選擇。 比如在一個(gè)簡(jiǎn)單的聊天室中連接多個(gè)客戶端。一個(gè) WebSocket 服務(wù)器負(fù)責(zé)管理他們的會(huì)話,一個(gè)客戶端向服務(wù)器發(fā)送一條消息,服務(wù)器立即將其轉(zhuǎn)發(fā)給所有其他連接的客戶端。對(duì)于用戶而言,他們可以實(shí)時(shí)地相互發(fā)送消息。如下圖: ? WebSocket 連接的優(yōu)點(diǎn)雙向通訊由于連接雙方都可以隨時(shí)發(fā)送消息,因此當(dāng)您需要快速來(lái)回移動(dòng)大量數(shù)據(jù)時(shí),或者需要從服務(wù)端控制客戶端設(shè)備時(shí)(比如IOT終端控制),WebSocket 連接是一個(gè)絕佳的選擇。 更低的延遲HTTP 連接中相對(duì)高頻數(shù)據(jù)獲取的常見模式是輪詢,其中客戶端定期請(qǐng)求新的服務(wù)器數(shù)據(jù)。也許這種通信方法的最大缺點(diǎn)是延遲。websocket基于雙工長(zhǎng)連接的方式,不需要等待或者去服務(wù)端查詢狀態(tài),服務(wù)端處理完成之后,可以主動(dòng)發(fā)送內(nèi)容到客戶端。 通過(guò) WebSocket 連接,數(shù)據(jù)一旦可用就會(huì)立即會(huì)傳給客戶端。客戶不需要一直請(qǐng)求它。通信延遲大大降低。 持久連接websocket建立全雙工連接之后,不出問(wèn)題的情況下,就會(huì)持續(xù)保持。并且Websocket連接是可以有狀態(tài)的。對(duì)于傳統(tǒng)的 HTTP 連接,客戶端發(fā)出請(qǐng)求,服務(wù)器發(fā)送響應(yīng)后,連接將關(guān)閉。如果客戶端需要更多數(shù)據(jù),他們必須打開一個(gè)新連接。當(dāng)然在HTTP/1.1引入了Keepalive的機(jī)制,來(lái)保持TCP連接,不過(guò)一般在處理一定數(shù)量的http請(qǐng)求之后,連接依然會(huì)被關(guān)閉,HTTP/2之后采用了長(zhǎng)連接的方式,并支持服務(wù)端推送能力,在這兩個(gè)方面是同websocket類似的。 Websocket建立連接的過(guò)程從上圖就可以看出,Websocket連接的建立是依賴于HTTP協(xié)議的。下邊給大家一個(gè)簡(jiǎn)單的實(shí)例: 客戶端發(fā)起websocket連接
看過(guò)我分享http協(xié)議的同學(xué),就可以發(fā)現(xiàn),這個(gè)分明就是一個(gè)http請(qǐng)求嘛。但是多了幾個(gè)東西
這兩個(gè)頭就是websocket的核心,告訴http服務(wù)器,我發(fā)起的是websocket協(xié)議,別把我當(dāng)http協(xié)議處理了
Sec-WebSocket-Key是一個(gè)base64編碼的值,是客戶端隨機(jī)生成的,是用來(lái)驗(yàn)證websocket服務(wù)端 Sec-WebSocket-Protocol是用戶自定義的協(xié)議標(biāo)識(shí),用來(lái)區(qū)分在同URL下,不同的服務(wù),具體對(duì)應(yīng)什么功能由業(yè)務(wù)自己實(shí)現(xiàn)。目的是告訴服務(wù)端,今晚我要翻菀貴人,不是什么安小主,別搞錯(cuò)了 最后Sec-WebSocket-Version是告訴服務(wù)器自己使用的websocket版本 如果服務(wù)端支持websocket協(xié)議,并接受了客戶端的要求,就會(huì)返回下邊的響應(yīng)。還記得http1xx狀態(tài)碼?翻翻我前幾篇文章吧
這就告訴客戶端即將升級(jí)到websocket協(xié)議,Sec-WebSocket-Accept 表示服務(wù)端確認(rèn),后邊的隨機(jī)字符串是對(duì)Sec-WebSocket-Key的加密,目的就是告訴客戶端,我知道啦,這是我的身份證,你查查是莞貴人沒錯(cuò)吧。Sec-WebSocket-Protocol則是最終使用的協(xié)議。 到此,HTTP協(xié)議的使命,就已經(jīng)完成了。后續(xù)的所有操作都是基于Websocket協(xié)議了。 Websocket與HTTP協(xié)議的對(duì)比使用場(chǎng)景對(duì)比HTTPHTTP是一種應(yīng)用層協(xié)議,最初設(shè)計(jì)用于在客戶端和服務(wù)器之間傳輸超文本。它是一種無(wú)狀態(tài)的協(xié)議,每個(gè)請(qǐng)求都是獨(dú)立的,不保留前一次請(qǐng)求的狀態(tài)信息。HTTP 通常用于傳輸網(wǎng)頁(yè)、圖片、文本等靜態(tài)資源,以及通過(guò) RESTful API 進(jìn)行數(shù)據(jù)傳輸。 WebSocketWebSocket 是一種全雙工通信協(xié)議,建立在單個(gè) TCP 連接上,允許在客戶端和服務(wù)器之間進(jìn)行雙向通信。WebSocket 的設(shè)計(jì)旨在解決 HTTP 協(xié)議在實(shí)時(shí)性和交互性方面的不足。它廣泛應(yīng)用于實(shí)時(shí)聊天、在線游戲、金融行業(yè)的實(shí)時(shí)數(shù)據(jù)更新等場(chǎng)景。 協(xié)議對(duì)比HTTP
WebSocket
連接方式對(duì)比HTTP
WebSocket
通信性質(zhì)對(duì)比HTTP
WebSocket
性能對(duì)比HTTP
WebSocket
協(xié)議頭對(duì)比HTTP
WebSocket
安全性對(duì)比HTTP
WebSocket
狀態(tài)及緩存HTTP
Websocket
WebSocket與HTTP:選擇合適的協(xié)議在選擇 WebSocket 或 HTTP 協(xié)議之前,請(qǐng)考慮一下您正在構(gòu)建的內(nèi)容以及原因。請(qǐng)注意,每種通信協(xié)議在其他協(xié)議通常不足的幾個(gè)領(lǐng)域都表現(xiàn)出色。 WebSocket 與 HTTP 連接之間的技術(shù)權(quán)衡了解這兩種通信協(xié)議之間的技術(shù)權(quán)衡可以讓您深入了解哪一種最適合您的項(xiàng)目。 連接設(shè)置和管理
對(duì)于 WebSocket,持久連接是通過(guò)客戶端和服務(wù)器之間的握手建立的。即使消息之間存在明顯的延遲,它也會(huì)在會(huì)話期間保持打開狀態(tài)。 對(duì)于 HTTP,連接是通過(guò)握手建立的,然后用于Request-Response。HTTP/1.1 允許將同一個(gè) TCP/IP 連接重復(fù)用于多個(gè)請(qǐng)求-響應(yīng)對(duì),從而減少開銷并改善延遲,但程度與 WebSocket 不同。連接仍將在相對(duì)較短的時(shí)間內(nèi)關(guān)閉,從幾秒到幾分鐘不等。 數(shù)據(jù)傳輸和編碼
WebSocket 連接使用全雙工雙向通信 - 連接的任何一方都可以隨時(shí)發(fā)送消息。HTTP 連接使用半雙工通信;一次只有一方可以通信,服務(wù)器的消息始終響應(yīng)客戶端的請(qǐng)求。如果您需要從服務(wù)端主動(dòng)發(fā)消息給客戶端,那websocket就最合適不過(guò)。 WebSocket 和 HTTP 都可以發(fā)送以基于文本的格式(例如 JSON、XML 和純文本)編碼的數(shù)據(jù),以及二進(jìn)制編碼的數(shù)據(jù)。 錯(cuò)誤處理和恢復(fù)
WebSocket 連接可能會(huì)因各種原因而失敗,包括應(yīng)用程序代碼中的錯(cuò)誤。客戶端會(huì)收到一個(gè)錯(cuò)誤事件,他們可以Watch該事件,并且您可以按照自己認(rèn)為合適的方式處理監(jiān)聽到的錯(cuò)誤。 當(dāng)然,HTTP 連接可能會(huì)遇到類似的情況,但某些常見架構(gòu)可以在錯(cuò)誤處理方面提供優(yōu)勢(shì)。 HTTP 指定了服務(wù)器可以響應(yīng)的一系列狀態(tài)代碼,以大致指示請(qǐng)求是否成功。4xx 和 5xx 范圍分別是為客戶端和服務(wù)器錯(cuò)誤保留的。 可擴(kuò)展性
WebSocket 連接被設(shè)計(jì)的簡(jiǎn)單高效,是事件驅(qū)動(dòng)的——僅當(dāng)有需要發(fā)送消息的內(nèi)容時(shí)才會(huì)發(fā)送消息。 HTTP 連接可以通過(guò)長(zhǎng)輪詢實(shí)現(xiàn)類似于實(shí)時(shí)功能的功能,隨著請(qǐng)求增長(zhǎng),處理所有這些長(zhǎng)期 HTTP 請(qǐng)求的開銷會(huì)不斷增加。 在HTTP/2中使用HTTP Stream,連接可以始終保持打開狀態(tài)來(lái)傳輸數(shù)據(jù)流,這在概念上類似于 WebSocket,但它的push主要是基于已有的請(qǐng)求和可能的需求而被動(dòng)觸發(fā)的。 WebSocket 與 HTTP 連接的性能注意事項(xiàng)
得益于持久連接,WebSocket 可以減少開銷和延遲。這會(huì)帶來(lái)更好的性能、更快的實(shí)時(shí)更新以及更少的處理能力。 由于 HTTP 通常必須在會(huì)話的生命周期內(nèi)處理多個(gè)連接,因此與 WebSocket 相比,它自然會(huì)花費(fèi)更多的時(shí)間和資源。 WebSocket 與 HTTP 連接的安全性
WebSocket 和 HTTP 連接在安全考慮方面類似。websocket的WS與HTTP都會(huì)受到如跨站腳本的攻擊。通過(guò)TLS的加持,WSS與HTTPS都可以實(shí)現(xiàn)加密通信,這兩種協(xié)議都足夠安全。 通信協(xié)議的混合方法通常,建議的方法是在您的系統(tǒng)中同時(shí)支持這兩種協(xié)議,以發(fā)揮其最擅長(zhǎng)的作用。這意味著對(duì)大多數(shù)標(biāo)準(zhǔn)網(wǎng)絡(luò)流量使用 HTTP 連接,對(duì)任何需要實(shí)時(shí)通信的內(nèi)容使用 WebSocket 連接,例如通知、IM通話、IOT控制等。 當(dāng)然,你還可以考慮評(píng)估補(bǔ)充或替代技術(shù);畢竟,WebSocket 和 HTTP 并不是實(shí)時(shí)通信的唯一選擇。 WebRTC來(lái)實(shí)現(xiàn)音視頻通話服務(wù),MQTT來(lái)實(shí)現(xiàn)IOT設(shè)備控制等等。 總結(jié)您現(xiàn)在應(yīng)該對(duì)如何使用 WebSocket 和 HTTP 通信協(xié)議有了一定的了解,明確了他們的優(yōu)點(diǎn)和缺點(diǎn),并且可以根據(jù)自己的需求在二者之間進(jìn)行權(quán)衡。當(dāng)然,你也可以依此應(yīng)對(duì)各個(gè)公司關(guān)于HTTP協(xié)議,與websocket協(xié)議的考題了,祝您一切順?biāo)臁?/p> 該文章在 2024/10/24 9:19:37 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |