Spec-Zone.ru › HTTP

Механизм обновления протокола

Механизм обновления протокола

Протокол HTTP/1.1 предоставляет специальный механизм, который позволяет обновить уже установленное соединение до другого протокола с помощью поля заголовка Upgrade.

Этот механизм является необязательным: с его помощью нельзя принудительно изменить протокол. Реализации могут не использовать обновление, даже если поддерживают новый протокол. На практике этот механизм применяется в основном для инициализации соединения WebSocket.

Также следует отметить, что HTTP/2 явно запрещает использование этого механизма; он предназначен только для HTTP/1.1.

Обновление соединений HTTP/1.1

Клиенты используют поле заголовка Upgrade, чтобы предложить серверу переключиться на один из перечисленных протоколов в порядке убывания предпочтительности.

Поскольку Upgrade — это сквозной заголовок, его также необходимо указать в поле заголовка Connection. Поэтому типичный запрос, содержащий Upgrade, будет выглядеть примерно так:

GET /index.html HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: example/1, foo/2

В зависимости от запрашиваемого протокола могут потребоваться и другие заголовки. Например, при обновлении до WebSocket можно использовать дополнительные заголовки для настройки соединения WebSocket, а также для обеспечения определённого уровня безопасности при его установлении. Подробнее см. в разделе Обновление до соединения WebSocket.

Если сервер решит обновить соединение, он отправит ответ со статусом 101 Switching Protocols и заголовком Upgrade, в котором будут указаны протоколы для переключения. Если сервер не станет (или не сможет) обновлять соединение, он проигнорирует заголовок Upgrade и отправит обычный ответ (например, 200 OK).

Сразу после отправки кода состояния 101 сервер может начать использовать новый протокол и при необходимости выполнить дополнительные рукопожатия, специфичные для этого протокола. Как только ответ с обновлением будет завершён, соединение фактически становится двунаправленным каналом, и запрос, инициировавший обновление, можно завершить уже по новому протоколу.

Распространённые способы использования этого механизма

Здесь мы рассмотрим наиболее распространённые варианты использования заголовка Upgrade.

Обновление до соединения WebSocket

Самый распространённый способ обновления HTTP-соединения — использование WebSocket. Соединения WebSocket всегда создаются путём обновления соединения HTTP или HTTPS. Имейте в виду: если вы открываете новое соединение с помощью API WebSocket или любой библиотеки для работы с WebSocket, большая часть или весь этот процесс выполняется за вас. Например, для открытия соединения WebSocket достаточно вызвать один метод:

webSocket = new WebSocket("ws://destination.server.ext", "optionalProtocol");

Конструктор WebSocket() самостоятельно создаёт исходное соединение HTTP/1.1, а затем выполняет за вас рукопожатие и обновление.

Примечание: Для открытия защищённого соединения WebSocket также можно использовать схему URL "wss://".

Если вам нужно создать соединение WebSocket с нуля, процесс рукопожатия придётся выполнить самостоятельно. После создания исходного сеанса HTTP/1.1 запросите обновление: добавьте к стандартному запросу заголовки Upgrade и Connection, как показано ниже:

Connection: Upgrade
Upgrade: websocket

Заголовки, специфичные для WebSocket

В процессе обновления до WebSocket используются следующие заголовки. Кроме заголовков Upgrade и Connection, остальные обычно необязательны или обрабатываются браузером и сервером автоматически при обмене данными.

Sec-WebSocket-Extensions

Указывает одно или несколько расширений WebSocket на уровне протокола, которые предлагается использовать серверу. В запросе разрешено указывать несколько заголовков Sec-WebSocket-Extension; результат будет таким же, как если бы все перечисленные расширения были указаны в одном таком заголовке.

Sec-WebSocket-Extensions: extensions
extensions

Список запрашиваемых расширений (или расширений, поддержку которых вы согласны предоставить), разделённых запятыми. Их следует выбирать из реестра имён расширений WebSocket IANA. Параметры расширений указываются после точки с запятой.

Например, этот заголовок указывает два пользовательских расширения: superspeed и colormode (у последнего также задан параметр depth=16):

Sec-WebSocket-Extensions: superspeed, colormode; depth=16

Sec-WebSocket-Key

Предоставляет серверу информацию, необходимую для подтверждения того, что клиент вправе запросить обновление до WebSocket. Этот заголовок можно использовать, когда незащищённые клиенты (HTTP) хотят выполнить обновление, чтобы обеспечить некоторую защиту от злоупотреблений. Значение ключа вычисляется по алгоритму, определённому в спецификации WebSocket, поэтому оно не обеспечивает безопасность. Вместо этого оно помогает предотвратить случайные запросы на соединение WebSocket от клиентов, не поддерживающих WebSocket, а также запросы, отправленные такими клиентами в результате неправильного использования. По сути, этот ключ подтверждает: «Да, я действительно хочу открыть соединение WebSocket».

Клиенты, которые используют этот заголовок, добавляют его автоматически; добавить его с помощью методов fetch() или XMLHttpRequest.setRequestHeader() нельзя.

Sec-WebSocket-Key: key
key

Ключ для запроса на обновление. Клиент добавляет его, если хочет использовать; сервер включит в ответ собственный ключ, который клиент проверит, прежде чем передать вам ответ с обновлением.

Значение заголовка Sec-WebSocket-Accept в ответе сервера будет вычислено на основе указанного key.

Sec-WebSocket-Protocol

Заголовок Sec-WebSocket-Protocol указывает один или несколько протоколов WebSocket, которые вы хотите использовать, в порядке предпочтительности. Сервер выберет первый поддерживаемый им протокол и укажет его в заголовке Sec-WebSocket-Protocol в ответе. Этот заголовок также можно использовать несколько раз; результат будет таким же, как если бы в одном заголовке был указан список идентификаторов подпротоколов, разделённых запятыми.

Sec-WebSocket-Protocol: subprotocols
subprotocols

Список имён подпротоколов, разделённых запятыми и расположенных в порядке предпочтительности. Подпротоколы можно выбирать из реестра имён подпротоколов WebSocket IANA или указывать собственное имя, которое понимают и клиент, и сервер.

Sec-WebSocket-Version

Заголовок запроса

Указывает версию протокола WebSocket, которую клиент хочет использовать, чтобы сервер мог подтвердить, поддерживается ли эта версия с его стороны.

Sec-WebSocket-Version: version
version

Версия протокола WebSocket, которую клиент хочет использовать для связи с сервером. Следует указать самую новую из доступных версий, перечисленных в реестре номеров версий WebSocket IANA. Последняя окончательная версия протокола WebSocket — версия 13.

Заголовок ответа

Если сервер не может обмениваться данными с использованием указанной версии протокола WebSocket, он ответит ошибкой (например, 426 Upgrade Required) и включит в заголовки ответов заголовок Sec-WebSocket-Version со списком поддерживаемых версий протокола, разделённых запятыми. Если сервер поддерживает запрошенную версию протокола, заголовок Sec-WebSocket-Version в ответ не включается.

Sec-WebSocket-Version: supportedVersions
supportedVersions

Список поддерживаемых сервером версий протокола WebSocket, разделённых запятыми.

Заголовки только для ответа

Сервер может включить в ответ следующие заголовки.

Sec-WebSocket-Accept

Включается в ответное сообщение сервера во время начального рукопожатия, если сервер готов установить соединение WebSocket. В заголовках ответа он будет указан не более одного раза.

Sec-WebSocket-Accept: hash
hash

Если был передан заголовок Sec-WebSocket-Key, значение этого заголовка вычисляется следующим образом: к значению ключа добавляется строка "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", затем для полученной строки вычисляется хеш SHA-1, в результате чего получается значение длиной 20 байт. Затем это значение кодируется в Base64, чтобы получить значение этого свойства.

Спецификации

Спецификация
Неизвестная спецификация>
Неизвестная спецификация>
Неизвестная спецификация>

См. также

  • API WebSocket
  • Эволюция HTTP
  • Термины глоссария:
    • HTTP
    • HTTP/2
    • QUIC

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Protocol_upgrade_mechanism

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API