聊聊什么是WebSocket協(xié)議?
隨著科技發(fā)展,人們需求越來越多,生活的方方面面都離不開一些實時信息。比如:疫情期間在家協(xié)同辦公、疫情監(jiān)控目標(biāo)人的實時運動軌跡、社交中的實時消息、多玩家互動游戲、每秒瞬息萬變的股市基金報價、體育實況播放、音視頻聊天、視頻會議、在線教育等等,都可以借用WebSocket TCP鏈接可以讓數(shù)據(jù)飛起來。下面就聊一下WebSocket協(xié)議。
WebSocket 是HTML5開始提供的一種瀏覽器與服務(wù)器間進(jìn)行全雙工通訊的網(wǎng)絡(luò)技術(shù),一種基于 TCP 連接上進(jìn)行全雙工通信的協(xié)議,相對于 HTTP 這種非持久的協(xié)議來說,WebSocket 是一個持久化網(wǎng)絡(luò)通信的協(xié)議。依靠這種技術(shù)可以實現(xiàn)客戶端和服務(wù)器端的長連接,雙向?qū)崟r通信。
它不僅可以實現(xiàn)客戶端請求服務(wù)器,同時可以允許服務(wù)端主動向客戶端推送數(shù)據(jù)。是真正的雙向平等對話,屬于服務(wù)器推送技術(shù)的一種。在 WebSocket API 中,客戶端和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
「其他特點包括:」
- 建立在 TCP 協(xié)議之上,服務(wù)器端的實現(xiàn)比較容易。
- 與 HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務(wù)器。
- 數(shù)據(jù)格式比較輕量,性能開銷小,通信高效。
- 可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)。
- 沒有同源限制,客戶端可以與任意服務(wù)器通信。
- 協(xié)議標(biāo)識符是ws(如果加密,則為wss),服務(wù)器網(wǎng)址就是 URL。
- 協(xié)議標(biāo)識符是ws(如果加密,則為wss),服務(wù)器網(wǎng)址就是 URL。
ws://xxx.ayunw.cn:80/some/path
wss://xxx.ayunw.cn:443/some/path
另外客戶端不只是瀏覽器,只要實現(xiàn)了ws或者wss協(xié)議的客戶端socket都可以和服務(wù)器進(jìn)行通信。
先說一下為什么需要 WebSocket 協(xié)議?
在 Web 應(yīng)用架構(gòu)中,連接由 HTTP/1.0 和 HTTP/1.1 處理。HTTP 是客戶端/服務(wù)器模式中 請求一響應(yīng) 所用的協(xié)議,在這種模式中,客戶端(一般是瀏覽器)向服務(wù)器提交 HTTP 請求,服務(wù)器響應(yīng)請求的資源(例如 HTML 頁面)。
HTTP 是無狀態(tài)的,也就是說,它將每個請求當(dāng)成唯一和獨立的。無狀態(tài)協(xié)議具有一些優(yōu)勢,例如,服務(wù)器不需要保存有關(guān)會話的信息,從而不需要存儲數(shù)據(jù)。但是,這也意味著在每次 HTTP 請求和響應(yīng)中都會發(fā)送關(guān)于請求的冗余信息,比如使用 Cookie 進(jìn)行用戶狀態(tài)的驗證。
隨著客戶端和服務(wù)器之間交互的增加,HTTP 協(xié)議在客戶端和服務(wù)器之間通信所需要的信息量快速增加。
從根本上講,HTTP 還是 半雙工 的協(xié)議,也就是說,在同一時刻信息的流向只能單向的:客戶端向服務(wù)器發(fā)送請求(單向),然后服務(wù)器響應(yīng)請求(單向)。半雙工方式的通信效率是非常低的。
同時 HTTP 協(xié)議有一個缺陷:通信只能由客戶端發(fā)起。
這種單向請求的特點,注定了如果服務(wù)器有狀態(tài)變化,是無法主動通知客戶端的。
為了能夠及時的獲取服務(wù)器的變化,我們嘗試過各種各樣的方式:
- 輪詢(polling):每隔一段時間,就發(fā)出一個請求,了解服務(wù)器有沒有新的信息。不精準(zhǔn),有延時,大量無效數(shù)據(jù)交換。
- 長輪詢( long polling):客戶端向服務(wù)器請求信息,并在設(shè)定的時間段內(nèi)保持連接。直到服務(wù)器有新消息響應(yīng),或者連接超時,這種技術(shù)常常稱作“掛起GET”或“擱置POST”。占用服務(wù)器資源,相對輪詢并沒有優(yōu)勢,沒有標(biāo)準(zhǔn)化。
- 流化技術(shù):在流化技術(shù)中,客戶端發(fā)送一個請求,服務(wù)器發(fā)送并維護(hù)一個持續(xù)更新和保持打開(可以是無限或者規(guī)定的時間段)的開放響應(yīng)。每當(dāng)服務(wù)器有需要交付給客戶端的信息時,它就更新響應(yīng)。服務(wù)器從不發(fā)出完成 HTTP 響應(yīng)。代理和防火墻可能緩存響應(yīng),導(dǎo)致信息交付的延遲增加。
上述方法提供了近乎實時的通信,但是它們也涉及 HTTP 請求和響應(yīng)首標(biāo),包含了許多附加和不必要的首標(biāo)數(shù)據(jù)與延遲。此外,在每一種情況下,客戶端都必須等待請求返回,才能發(fā)出后續(xù)的請求,而這顯著地增加了延退。同時也極大地增加了服務(wù)器的壓力。
什么是websocket協(xié)議?
Websocket其實是一個新協(xié)議,借用了HTTP的協(xié)議來完成一部分握手,只是為了兼容現(xiàn)有瀏覽器的握手規(guī)范而已。Websocket 是一種自然的全雙工、雙向、單套接字連接,解決了 HTTP 協(xié)議中不適合于實時通信的問題。
「一個典型的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
其中Websocket的核心如下,它告訴Apache、Nginx等服務(wù)器:注意,我發(fā)起的是Websocket協(xié)議,快點幫我找到對應(yīng)的助理處理而不是那個老土的HTTP。
Upgrade: websocket
Connection: Upgrade
「服務(wù)器返回如下:」
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
至此,HTTP已經(jīng)完成它所有工作了,接下來就是完全按照Websocket協(xié)議進(jìn)行了。