Чем отличается новый протокол 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-Key и Sec-WebSocket-Accept добавляются вместо трех ключей HyBi 00. Браузер присваивает Sec-WebSocket-Key случайно сгенерированный номер. Затем сервер использует его со специальным GUID протокола WebSocket ( 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 ) и SHA1 / BASE64 и т. д., чтобы вернуть Sec-WebSocket-Accept , чтобы браузер мог подтвердить, что он понимает WebSocket. Это предотвращает межпротокольную атаку.
  • На каждом кадре теперь требуется маскирование кадров . Это предотвращает отравление кэша на прокси-сервере. Sec-WebSocket-Origin добавляется для предотвращения доступа из сценариев, о которых поставщик услуг не знает.
  • Sec-WebSocket-Origin добавляется вместо ключа Origin HyBi 00, чтобы предотвратить доступ со стороны сценариев, о которых поставщик услуг не знает. Обратите внимание, что на HyBi 11 это будет просто « Origin ».

Изменения JS API

  • subprotocol теперь может быть массивом, что позволяет использовать сигнатуру метода new WebSocket(String url, Array subprotocol)
  • Атрибут .protocol [Строка]
  • Атрибут .binaryType [Blob|ArrayBuffer]
  • .extension [Строка]
  • В CloseEvent добавлен код состояния и причина (почему соединение закрыто). Функция close() также была изменена, чтобы принимать эти два аргумента соответственно.

Расширения

  • Добавлен Sec-WebSocket-Extensions . Предлагаемые расширения:
  • deflate-frame сжимает кадры в источнике и извлекает их в пункте назначения.
  • x-google-mux для поддержки мультиплексирования, но находится на ранней стадии.

Существует ли совместимость между HyBi 00 и HyBi 10 как в серверной, так и в браузерной реализации?

  • Реализации сервера могут поддерживать как HyBi 00, так и HyBi 10, просматривая HTTP-заголовок рукопожатия. Однако не рекомендуется поддерживать HyBi 00, поскольку известно, что он уязвим.
  • API JavaScript WebSocket во многом схож в старой и новой версиях. Но, как отмечалось выше, мы не рекомендуем поддерживать HyBi 00, поскольку известно, что он уязвим.

Какой браузер поддерживает HyBi 10?

  • Chrome 14 поддерживает протокол HyBi 10, хотя упомянутые выше изменения API JavaScript WebSocket все еще находятся в стадии разработки. Планируется, что Firefox 7 также будет поддерживать HyBi 10.