1. 程式人生 > >WebSocket協議與抓包

WebSocket協議與抓包

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請求有幾點不同:

  1. GET請求的地址不是類似/path/,而是以ws://開頭的地址;
  2. 請求頭Upgrade: websocket和Connection: Upgrade表示這個連線將要被轉換為WebSocket連線;
  3. Sec-WebSocket-Key是用於標識這個連線,並非用於加密資料;
  4. 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即可檢視此連線收發的資料

&n