WebSocket協議與抓包
- 2019 年 10 月 13 日
- 筆記
WebSocket協議
WebSocket並不是全新的協議,而是利用了HTTP協議來建立連接,它的目的是在瀏覽器和伺服器之間建立一個不受限的雙向通訊的通道,比如說,伺服器可以在任意時刻發送消息給瀏覽器
WebSocket連接必須由瀏覽器發起,因為請求協議是一個標準的HTTP請求,格式如下:
GET ws://localhost:3000/ws/chat HTTP/1.1 Host: localhost Upgrade: websocket Connection: Upgrade Origin: http://localhost:3000 Sec-WebSocket-Key: client-random-string Sec-WebSocket-Version: 13
該請求和普通的HTTP請求有幾點不同:
- GET請求的地址不是類似/path/,而是以ws://開頭的地址;
- 請求頭Upgrade: websocket和Connection: Upgrade表示這個連接將要被轉換為WebSocket連接;
- Sec-WebSocket-Key是用於標識這個連接,並非用於加密數據;
- Sec-WebSocket-Version指定了WebSocket的協議版本
隨後,伺服器如果接受該請求,就會返回如下響應:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: server-random-string
該響應程式碼101
表示本次連接的HTTP協議即將被更改,更改後的協議就是Upgrade: websocket
指定的WebSocket協議。
版本號和子協議規定了雙方能理解的數據格式,以及是否支援壓縮等等。如果僅使用WebSocket的API,就不需關心這些
HTTP協議、WebSocket協議與TCP協議的關係
HTTP協議是建立在TCP協議之上的,TCP協議本身就實現了全雙工通訊,但是HTTP協議的請求-應答機制限制了全雙工通訊。WebSocket連接建立以後,其實只是簡單規定了一下:接下來,咱們通訊就不使用HTTP協議了,直接互相發數據吧。
安全的WebSocket連接機制和HTTPS類似。首先,瀏覽器用wss://xxx創建WebSocket連接時,會先通過HTTPS創建安全的連接,然後,該HTTPS連接升級為WebSocket連接,底層通訊走的仍然是安全的SSL/TLS協議
fiddler抓取WebSocket數據
fiddler
中雙擊WebSocket Session
即可查看此連接收發的數據