Điểm khác biệt trong giao thức WebSocket mới

Thông số kỹ thuật của giao thức WebSocket gần đây đã được cập nhật để giải quyết các vấn đề bảo mật trước đó và nhìn chung là ổn định. Dưới đây là bản tóm tắt về các thay đổi liên quan, cùng một số lưu ý về cách triển khai hiện tại.

Điều gì đã thay đổi kể từ WebSocket HyBi 00?

  • Định dạng khung giao thức đã thay đổi. HyBi 00 từng sử dụng "0x00" cho đầu và "0xff" cho đuôi cho mỗi khung hình. HyBi 10 hiện sử dụng định dạng mới như sau:
      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 ...                |
     +---------------------------------------------------------------+

Các vấn đề về bảo mật đã được giải quyết

  • Sec-WebSocket-KeySec-WebSocket-Accept được thêm thay cho ba khoá của HyBi 00. Trình duyệt cung cấp số được tạo ngẫu nhiên cho Sec-WebSocket-Key. Sau đó, máy chủ sử dụng mã này với GUID cụ thể của giao thức WebSocket (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) và SHA1 / BASE64, v.v. để trả về Sec-WebSocket-Accept để trình duyệt có thể xác nhận rằng trình duyệt hiểu được WebSocket. Điều này giúp ngăn chặn cuộc tấn công trên nhiều giao thức.
  • Giờ đây, bạn bắt buộc phải che khung trên mỗi khung. Điều này giúp ngăn chặn việc nhiễm độc bộ nhớ đệm trên proxy. Sec-WebSocket-Origin được thêm vào để ngăn chặn quyền truy cập của các tập lệnh mà nhà cung cấp dịch vụ không biết.
  • Sec-WebSocket-Origin được thêm vào thay cho khoá Origin của HyBi 00 để ngăn các tập lệnh mà nhà cung cấp dịch vụ không biết truy cập. Xin lưu ý rằng đây sẽ chỉ là "Origin" trên HyBi 11.

Thay đổi về API JS

  • subprotocol hiện có thể là mảng, cho phép chữ ký phương thức của new WebSocket(String url, Array subprotocol)
  • Thuộc tính .protocol [Chuỗi]
  • Thuộc tính .binaryType [Blob|ArrayBuffer]
  • .extension [Chuỗi]
  • Mã trạng thái và lý do (lý do kết nối bị đóng) đã được thêm vào CloseEvent. Hàm close() cũng đã được thay đổi để chấp nhận 2 đối số này cho phù hợp.

Phần mở rộng

  • Đã thêm Sec-WebSocket-Extensions. Các tiện ích được đề xuất là:
  • deflate-frame nén các khung hình tại nguồn và trích xuất tại đích.
  • x-google-mux để hỗ trợ tính năng đa kênh nhưng đang ở giai đoạn đầu.

Có khả năng tương thích giữa HyBi 00 và HyBi 10 trên cả máy chủ và trình duyệt khi triển khai không?

  • Việc triển khai máy chủ có thể hỗ trợ cả HyBi 00 và HyBi 10 bằng cách xem xét tiêu đề HTTP bắt tay. Tuy nhiên, bạn không nên hỗ trợ HyBi 00 vì phiên bản này đã được xác định là dễ bị tấn công.
  • API JavaScript WebSocket có nhiều điểm tương đồng giữa phiên bản cũ và mới. Tuy nhiên, như đã lưu ý ở trên, bạn không nên hỗ trợ HyBi 00 vì phiên bản này đã được xác định là dễ bị tấn công.

Trình duyệt nào hỗ trợ HyBi 10?

  • Chrome 14 hỗ trợ giao thức HyBi 10 mặc dù các thay đổi về API JavaScript WebSocket được đề cập ở trên vẫn đang trong quá trình triển khai. Firefox 7 cũng dự kiến sẽ hỗ trợ HyBi 10.