新版 WebSocket 通訊協定的差異

WebSocket 通訊協定規格最近已更新,解決先前的安全性疑慮,且目前穩定性良好。以下摘要說明相關異動,並提供目前實作方式的相關注意事項。

自 WebSocket HyBi 00 以來,有哪些變更?

  • 通訊協定格式已變更。HyBi 00 過去會在每個影格中使用 "0x00" 做為頭部,"0xff" 做為尾部。HyBi 10 現在使用以下新格式:
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/63)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
     |                     Payload Data continued ...                |
     +---------------------------------------------------------------+

已解決安全性問題

  • Sec-WebSocket-KeySec-WebSocket-Accept 會取代 HyBi 00 的三個鍵。瀏覽器會將隨機產生的號碼傳送至 Sec-WebSocket-Key。接著,伺服器會將其與 WebSocket 通訊協定的特定 GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) 和 SHA1 / BASE64 等連結,傳回 Sec-WebSocket-Accept,以便瀏覽器確認 WebSocket。這可以防止跨通訊協定的攻擊。
  • 每個影格現在都需要影格遮罩。這可避免快取在 Proxy 上遭到破壞。新增 Sec-WebSocket-Origin 可防止服務供應商未知的腳本存取資料。
  • Sec-WebSocket-Origin 會取代 HyBi 00 的 Origin 鍵,以防服務供應商未知的腳本存取資料。請注意,在 HyBi 11 上,這會是「Origin」。

JS API 異動

  • subprotocol 現在可以是陣列,允許 new WebSocket(String url, Array subprotocol) 的方法簽章
  • .protocol 屬性 [字串]
  • .binaryType 屬性 [Blob|ArrayBuffer]
  • .extension [字串]
  • 狀態碼和原因 (連線已關閉的原因) 已新增到 CloseEventclose() 函式也已調整為相應接受這兩個引數。

額外資訊

  • 已新增 Sec-WebSocket-Extensions。建議的擴充功能如下:
  • deflate-frame 會在來源處壓縮影格,並在目的地擷取影格。
  • x-google-mux 可支援多工處理,但功能目前處於早期開發階段。

在伺服器和瀏覽器實作中,HyBi 00 和 HyBi 10 之間是否相容?

  • 伺服器實作項目可查看握手 HTTP 標頭,同時支援 HyBi 00 和 HyBi 10。不過,我們不建議支援 HyBi 00,因為已知易受攻擊。
  • WebSocket JavaScript API 在新舊版本方面大致相似,不過,如上所述,我們不建議支援 HyBi 00,因為它已知存在安全漏洞。

哪些瀏覽器支援 HyBi 10?

  • Chrome 14 支援 HyBi 10 通訊協定,但上述的 WebSocket JavaScript API 異動仍在進行中。此外,Firefox 7 也預計支援 HyBi 10。