狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

有了HTTP為什么還要Websocket?一文帶你解密Websocket協(xié)議

admin
2024年10月24日 8:4 本文熱度 843

我們的外賣、打車、購(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連接

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

看過(guò)我分享http協(xié)議的同學(xué),就可以發(fā)現(xiàn),這個(gè)分明就是一個(gè)http請(qǐng)求嘛。但是多了幾個(gè)東西

Upgrade: websocket
Connection: Upgrade

這兩個(gè)頭就是websocket的核心,告訴http服務(wù)器,我發(fā)起的是websocket協(xié)議,別把我當(dāng)http協(xié)議處理了

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

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)碼?翻翻我前幾文章吧

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

這就告訴客戶端即將升級(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ì)比

HTTP

HTTP是一種應(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ù)傳輸。

WebSocket

WebSocket 是一種全雙工通信協(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

  • 協(xié)議類型: 無(wú)狀態(tài)、請(qǐng)求-響應(yīng)型協(xié)議。

  • 通信方式: 單向通信,客戶端發(fā)送請(qǐng)求,服務(wù)器返回響應(yīng)。

  • 持久連接: 支持持久連接,通過(guò) HTTP Keep-Alive 頭字段可以在一次連接中發(fā)送多個(gè)請(qǐng)求和響應(yīng)。

WebSocket

  • 協(xié)議類型: 全雙工通信協(xié)議。

  • 通信方式: 雙向通信,客戶端和服務(wù)器可以隨時(shí)發(fā)送消息。

  • 持久連接: 基于單個(gè) TCP 連接,保持連接狀態(tài),避免了每次通信都需要重新建立連接的開銷。

連接方式對(duì)比

HTTP

  • 連接建立: TCP連接建立之后,客戶端直接發(fā)送http請(qǐng)求。

  • 連接關(guān)閉: http/2協(xié)議之前,服務(wù)器在響應(yīng)之后會(huì)關(guān)閉連接(http1.1的keepalive機(jī)制也只能保證在一段時(shí)間內(nèi)連接不關(guān)閉),客戶端需要重新建立連接發(fā)送新的請(qǐng)求。

WebSocket

  • 連接建立: 通過(guò) HTTP 協(xié)議建立初始連接,然后升級(jí)為 HTTP 101的Upgrade機(jī)制 升級(jí)到websocket協(xié)議。建立連接后保持開放狀態(tài)。

  • 連接關(guān)閉: 可以由客戶端或服務(wù)器發(fā)起關(guān)閉連接請(qǐng)求,而不需要重新建立連接。

通信性質(zhì)對(duì)比

HTTP

  • 單向通信: 請(qǐng)求-響應(yīng)模式,客戶端發(fā)送請(qǐng)求,服務(wù)器返回響應(yīng)。

  • 輪詢: 實(shí)現(xiàn)實(shí)時(shí)性的方式之一是通過(guò)輪詢,但效率低,增加了網(wǎng)絡(luò)負(fù)擔(dān)。

WebSocket

  • 雙向通信: 客戶端和服務(wù)器可以隨時(shí)發(fā)送消息,實(shí)現(xiàn)實(shí)時(shí)的雙向通信。

  • 事件驅(qū)動(dòng): 基于事件的模型,服務(wù)器或客戶端可以通過(guò)事件觸發(fā)實(shí)現(xiàn)及時(shí)的通信。

性能對(duì)比

HTTP

  • 資源消耗: http/2之前請(qǐng)求都需要重新建立連接,增加了資源消耗。

  • 實(shí)時(shí)性: 不適用于對(duì)實(shí)時(shí)性要求較高的應(yīng)用,如在線游戲、實(shí)時(shí)聊天、IOT設(shè)備實(shí)時(shí)控制等。

WebSocket

  • 資源消耗: 通過(guò)單個(gè) TCP 連接保持長(zhǎng)連接,減少了資源消耗。

  • 實(shí)時(shí)性: 適用于對(duì)實(shí)時(shí)性要求較高的應(yīng)用,具有低延遲和高吞吐量的特點(diǎn)。

協(xié)議頭對(duì)比

HTTP

  • 頭部開銷: 每個(gè)請(qǐng)求和響應(yīng)都有較大的頭部開銷,包含大量元數(shù)據(jù)。

  • Cookie: 支持通過(guò) Cookie 進(jìn)行狀態(tài)管理。

WebSocket

  • 頭部開銷: 頭部開銷相對(duì)較小,只包含必要的控制信息。

  • Cookie: 可以通過(guò) HTTP 協(xié)議的 Upgrade 頭字段攜帶 Cookie 進(jìn)行身份驗(yàn)證。

安全性對(duì)比

HTTP

  • 安全性: HTTP 本身不具備加密功能,數(shù)據(jù)傳輸可能被竊聽或篡改。

  • TLS/SSL: 可以通過(guò)使用 HTTPS(基于 TLS/SSL 協(xié)議)來(lái)加密通信。

WebSocket

  • 安全性: 支持加密傳輸,可以通過(guò) WSS(WebSocket Secure)實(shí)現(xiàn)安全通信。

  • TLS/SSL: 基于 TLS/SSL 協(xié)議,提供端到端的加密。

狀態(tài)及緩存

HTTP

  • ? http請(qǐng)求無(wú)狀態(tài)且獨(dú)立的

  • ? http請(qǐng)求可以被緩存

Websocket

  • ? websocket是可以有狀態(tài)的,消息會(huì)可能會(huì)有上下文的關(guān)聯(lián)關(guān)系(取決于業(yè)務(wù)實(shí)現(xiàn))

  • ? websocket本身無(wú)法像http協(xié)議那樣做內(nèi)容緩存

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è)置和管理

考慮隨著時(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ù)傳輸和編碼

考慮您希望如何傳輸數(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ù)

考慮哪些錯(cuò)誤處理方法對(duì)用戶影響最小

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ò)展性

考慮您的應(yīng)用程序的資源消耗需求

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)

考慮您的應(yīng)用程序的性能預(yù)期

得益于持久連接,WebSocket 可以減少開銷和延遲。這會(huì)帶來(lái)更好的性能、更快的實(shí)時(shí)更新以及更少的處理能力。

由于 HTTP 通常必須在會(huì)話的生命周期內(nèi)處理多個(gè)連接,因此與 WebSocket 相比,它自然會(huì)花費(fèi)更多的時(shí)間和資源。

WebSocket 與 HTTP 連接的安全性

考慮哪一個(gè)對(duì)您來(lái)說(shuō)最容易確保安全

WebSocket 和 HTTP 連接在安全考慮方面類似。websocket的WS與HTTP都會(huì)到如跨站腳本的攻擊。通過(guò)TLS的加持,WSSHTTPS都可以實(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)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved