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