【Web微知識系列】雙向溝通的技術,什麼是Websocket?

閱讀時間約 7 分鐘
進入本篇章前建議您可以先了解以下兩個篇章,主要是介紹單向過程中的訂閱概念:
這種雙向溝通機制主要是為了更即時的反應,舉例來說今天我們有一個應用是即時語音辨識,那麼勢必會有一個互動的過程,使用者端進行錄音後,即時的送到伺服器進行辨識並將辨識結果即時呈現於畫面上時,就必須透過這種雙向溝通機制才能完成。

簡介

傳統的Http是一種Stateless的傳輸方式, 因此不會維持原本狀態, 而是需要更新、新增、查詢...等操作時才進行請求, 因此假設有即時性互動的應用時就不太適用了, 因為每進行一個動作就要向Server端發送請求, 而每次的請求都必須經過交握式連接的過程, 在效能上就不是那麼理想了, Websocket允許瀏覽器跟Server端只經過一次的交握過程, 就能建立一條長連接的溝通管道, 並透過這條管道進行「雙向傳輸」。

Websocket與TCP、HTTP的關係

  • Websocket與HTTP屬於應用層, 同樣都是基於TCP來進行傳輸, 而進行Handshake時也會透過HTTP進行, 但真正傳輸資料時就不必經過HTTP的方式。
  • 與HTTP一樣可以進行加密傳輸, HTTP的部份為https, Websocket則為wss。

為什麼要使用Websocket?

其實以往我們網頁資料刷新有以下幾種方式可以實作:

Polling

這種方式是早期透過Javascript定時(setInterval、setTimeout)來向後端請求最新資料並呈現於頁面之上, 這麼做的好處是容易實現, 但我們並不知曉Server端何時會更新, 只能傻傻的定時獲取, 造成的影響就是頻寬的浪費以及資料呈現不即時。

Long-Polling

長時間輪詢的方式就是收到前端請求後, Server端會等待, 若這段時間有資料就會將最新資料回傳給前端, 因此等待的這段期間Client什麼事情也不用做, 等待資料回傳後再發送下一個請求, 雖然長時間的連接解決了Polling開銷的問題, 但如果在更新資料很頻繁的狀況下也會造成連續的Polling的動作產生, 未必效能較佳。

Server Sent Events

這種方式比較少被使用, 因為SSE能做的功能Websocket也能完成, 差別只是雙向溝通還是單向溝通而已, 不過在某些應用上, 瀏覽器不太需要傳遞資料給Server端, 例如: 股市行情、即時新聞...等, 只需要接收Server端的最新資料即可, 不太需要主動發送, 當然實作起來也較容易, 簡單來說就是伺服端單向的推送資料給瀏覽器。

Websocket

以上幾個方式的共同點就是都基於HTTP進行傳輸, 而我們也知道HTTP的傳輸為了確保正確性會帶有較多的標頭...等資訊, 而Websocket只有一開始確定連線時會走HTTP以外, 之後的傳輸都不是基於HTTP, 因此傳輸上會來的更有效率, 且提供了雙向溝通的功能。
常見的線上互動遊戲、雲端協作、線上聊天...等, 若使用上述的幾種方式都有延遲的議題存在,因此需要即時互動的應用就非常適合使用Websocket的方式來進行實作。

建立連接

  • 以javascript來說, 通常我們在建立Websocket物件的時候, Browser就開始進行Handshake的過程。
var socket = new WebSocket("ws://127.0.0.1:8080/ws")
  • 建立連線成功後,會發送支援的版本號、主機地址...等資訊給Server端。
Accept-Encoding: gzip, deflate

Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7

Cache-Control: no-cache

Connection: Upgrade

Host: 127.0.0.1:8080

Origin: http:*//127.0.0.1:8080*

Pragma: no-cache

Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Sec-WebSocket-Key: sZrnswRjM0ZXxxmAIJhrvQ==

Sec-WebSocket-Version: 13

Upgrade: websocket

User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
  • Server端收到後會回傳狀態碼101及相關資訊。
HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: 3zg/SIKvYpT51lJJKbF4WjFuCTY=

Access-Control-Allow-Origin: *

Access-Control-Allow-Headers: Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
  • 如果過程失敗的話就會進入onerror的handler, 成功的話就代表可以開始傳輸資料。

如何確保連線狀態

假設連線的過程中發生了以下兩種狀況:
  1. 長時間不發送訊息或者防火牆阻擋了連接, Server端無法得知。
  2. Client端與Server端之間斷開網路, Server端也未感知。
此時就需要一種Heartbeat的機制, 來偵測彼此的連線是否存活。
  1. 由發送端發送ping訊號給接收端。
  2. 接收端成功收到之後, 回應pong訊號給發送端。
  3. 成功接收到pong訊號, 代表連線正常。
發送端 -> ping -> 接收端

發送端 <- pong <- 接收端
對於Client端來說就有開發者提供了Heartbeat的套件websocket-heartbeat-js, 讓我們開發前端時省去自行實做的時間。

📝 Web微知識系列文章

喜歡撰寫文章的你,不妨來了解一下:
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
118會員
263內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
我們前一篇介紹了「【Web系列】訂閱技術的基石,RSS Feed是什麼?」,相信也對於訂閱的機制具備一定的認識了,雖然RSS已經能夠滿足我們訂閱的一些基本需求,但由於主要的訂閱端還是定期去檢查更新資訊,因此假設我們想要在最短時間內掌握最新資訊時,仍會有一些延遲,再者也非常浪費頻寬。 結語
什麼是RSS Feed? 我們常常在聽的Podcast、看的Youtube都有提供訂閱的機制,那這個訂閱的背後到底是怎麼做的呢? 讓我們一起來了解看看吧! RSS的運作機制 為什麼Podcast需要RSS Feed? ⭐ 透過以上的機制,讓更新的部分自動化同步,將寶貴的時間花費在創作上。
大數據的時代,如何有效率的搜尋來找到我們要的答案?這時候就要透過一些資訊檢索的技術來幫我們提升效率了,而本篇會介紹索引的基本概念以及為什麼演化至倒排索引,為我們帶來了哪些好處? 什麼是索引? 那什麼又是倒排索引? 能解決什麼問題呢? 為什麼更快更精準? 結語
我們前一篇介紹了「【Web系列】訂閱技術的基石,RSS Feed是什麼?」,相信也對於訂閱的機制具備一定的認識了,雖然RSS已經能夠滿足我們訂閱的一些基本需求,但由於主要的訂閱端還是定期去檢查更新資訊,因此假設我們想要在最短時間內掌握最新資訊時,仍會有一些延遲,再者也非常浪費頻寬。 結語
什麼是RSS Feed? 我們常常在聽的Podcast、看的Youtube都有提供訂閱的機制,那這個訂閱的背後到底是怎麼做的呢? 讓我們一起來了解看看吧! RSS的運作機制 為什麼Podcast需要RSS Feed? ⭐ 透過以上的機制,讓更新的部分自動化同步,將寶貴的時間花費在創作上。
大數據的時代,如何有效率的搜尋來找到我們要的答案?這時候就要透過一些資訊檢索的技術來幫我們提升效率了,而本篇會介紹索引的基本概念以及為什麼演化至倒排索引,為我們帶來了哪些好處? 什麼是索引? 那什麼又是倒排索引? 能解決什麼問題呢? 為什麼更快更精準? 結語
你可能也想看
Google News 追蹤
Thumbnail
一、什麼是WinSocket? 也就是大家常說的WinSock全名為Windows Sockets API (WSA),它會透過TCP/IP通訊協定來做網路的通訊,會用在Windows操作系統上來開發網路應用的API(應用程式介面)   二、WinSocket用在哪裡?   Socket可以
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
HTTP(Hyper Text Transfer Protocol,超文字傳輸協定) 通常執行在TCP協定上。請求和回傳訊息的頭是ASCII,而內容是MIME。 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer) 以HT
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
你是否曾對那些支撐著我們日常生活、工作與娛樂的網路系統背後的運作原理感到好奇?想知道是什麼力量讓我們能夠順暢地上網購物、交友、瀏覽資訊嗎?就現在,就讓我們一起探索伺服器(Server)的秘密,從定義到種類,從現狀到趨勢,一篇文章帶你全面探索伺服器的世界!
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
在當今社會,訂閱服務已成為人們日常生活的一部分。從影音娛樂到外送美食,從雲端儲存到日常消費,訂閱服務無處不在,提供了便利與豐富多樣的選擇。然而,隨著市場上訂閱服務的數量急劇增加,消費者面臨著選擇過多而導致的決策困難,以及管理多個訂閱帳戶的繁瑣。這些問題迫切需要一個解決方案,一種能將不同服務整合在一起
Thumbnail
透過 Webhook 與 No Code 自動化工具,在 SurveyCake 問卷填答後,自動寄個人化信件。全程無需寫程式,即可自動帶入問卷特定填答內容,還可與 Google Sheets 結合,帶入不重複專屬序號至信件中,讓行銷應用更完整!幫助你節省人工成本,提高資料準確性、通知即時性和工作效率
Thumbnail
Webhook 提供一個「即時觸發」的資料傳送方式。Webhook 與 API 的差異及在自動化流程中的作用是什麼?它讓你在事件發生時獲得通知。透過生活化的情境舉例,理解 Webhook 的運作原理,並了解如何透過 No Code 自動化工具設定 Webhook,實現自動化整合,提升工作效率!
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
一、什麼是WinSocket? 也就是大家常說的WinSock全名為Windows Sockets API (WSA),它會透過TCP/IP通訊協定來做網路的通訊,會用在Windows操作系統上來開發網路應用的API(應用程式介面)   二、WinSocket用在哪裡?   Socket可以
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
HTTP(Hyper Text Transfer Protocol,超文字傳輸協定) 通常執行在TCP協定上。請求和回傳訊息的頭是ASCII,而內容是MIME。 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer) 以HT
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
你是否曾對那些支撐著我們日常生活、工作與娛樂的網路系統背後的運作原理感到好奇?想知道是什麼力量讓我們能夠順暢地上網購物、交友、瀏覽資訊嗎?就現在,就讓我們一起探索伺服器(Server)的秘密,從定義到種類,從現狀到趨勢,一篇文章帶你全面探索伺服器的世界!
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
在當今社會,訂閱服務已成為人們日常生活的一部分。從影音娛樂到外送美食,從雲端儲存到日常消費,訂閱服務無處不在,提供了便利與豐富多樣的選擇。然而,隨著市場上訂閱服務的數量急劇增加,消費者面臨著選擇過多而導致的決策困難,以及管理多個訂閱帳戶的繁瑣。這些問題迫切需要一個解決方案,一種能將不同服務整合在一起
Thumbnail
透過 Webhook 與 No Code 自動化工具,在 SurveyCake 問卷填答後,自動寄個人化信件。全程無需寫程式,即可自動帶入問卷特定填答內容,還可與 Google Sheets 結合,帶入不重複專屬序號至信件中,讓行銷應用更完整!幫助你節省人工成本,提高資料準確性、通知即時性和工作效率
Thumbnail
Webhook 提供一個「即時觸發」的資料傳送方式。Webhook 與 API 的差異及在自動化流程中的作用是什麼?它讓你在事件發生時獲得通知。透過生活化的情境舉例,理解 Webhook 的運作原理,並了解如何透過 No Code 自動化工具設定 Webhook,實現自動化整合,提升工作效率!
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!