This page looks best with JavaScript enabled

What Is Websocket

 ·  ☕ 2 min read

Websocket

https://www.cnblogs.com/nuccch/p/10947256.html#websocket%E5%8D%8F%E8%AE%AE%E6%98%AF%E4%BB%80%E4%B9%88
是一個應用層的 protocol (跟 http 同層)
最重要的功用大概就是雙向傳輸,建立連線後就把連線開著,client 和 server 之間都可以互相傳訊息,且 overhead 比 http 少
http 傳送訊息時都是一整個一起傳
websocket 可以切成很多 frame 分開送,建立連線後每個 frame 的 header 也很小。這是應用層的 frame,到達應用層級時 protocol 會幫你組好

為何使用

原本的一個 http server 必須等待 client 傳 req 才可以回應(像是下面的1、2)
如果是想要持續更新數據,這樣會造成很多 overhead

其餘持續更新數據方法

  1. polling
    每一段時間都發 http request 去問,有點浪費頻寬而且不一定會命中

  2. long polling
    發一個 http req 給 server,server 先把連線留著不回應,等到有資料再回應。client 收到後再發一個 req。重複以上動作
    資料更新頻繁時 client 也是要一直發 req 才行

  3. server sent event
    單向 (server->client) 資料傳輸,websocket 太方便了所以這個比較少人用
    不過在某些特定時候還是可以出場,但我也沒用過
    詳情請參考:https://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource

建立連線

Client 先發 http request (http2.0 不可升級)

GET /index HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: websocket
// other field, version 之類的

成功的話,就會把這個連線升級為 websocket

HTTP/1.1 101 switching protocol xxxx
Connection: upgrade
Upgrade: websocket
// other field

就變成 websocket 連線了

和 http2 的關係

目前看到比較合理的解答XD
https://stackoverflow.com/questions/28582935/does-http-2-make-websockets-obsolete

websocket 最重要的功能之一就是雙向溝通,兩方隨時都可以傳送資訊,不必被 request + response 綁住

而 http2 也有 server push,這樣的話 websocket 會被取代嗎??
server push 大多都被拿來使用在瀏覽器讀網頁的效能增進,例如 client 要一個 html,server 可以把裡面的圖片等等資源一起給,避免多次 request
所以 http2 常常被認為是 request/response + server push (回應時多回一些東西),而無法雙向傳輸

http2 其實是可以達到雙向傳輸的(例如 grpc 就可以,grpc 使用 http2 的資料傳輸機制再加上 protobuf)
但是瀏覽器並沒有 expose 足夠的 API 讓 javascript 去操作這塊,所以目前無法達成
大家只好繼續在瀏覽器上用 websocket

Share on

Marko Peng
WRITTEN BY
Marko Peng
Good man