Кратко

  • По RFC 9110 клиент может отправить Upgrade, приглашая сменить протокол в том же соединении; сервер может это приглашение проигнорировать, а посредник обязан удалить поле, относящееся к соединению, перед обычной пересылкой.
  • Доказательство завершённого перехода начинается с корректного ответа 101 Switching Protocols, выбирающего предложенный протокол, и включает завершение исходного запроса и первый корректный обмен по новому протоколу.

Представим панель миграции, которая видит Upgrade: websocket в запросе и сразу помечает сеанс как «WebSocket включён». Однако прокси между клиентом и исходным сервером исполняет указание Connection и удаляет приглашение для конкретного участка. Сервер его не получает и возвращает обычный 200 OK по HTTP/1.1. Ни одна сторона не меняет протокол, но панель фиксирует успех, потому что приняла предложение за результат.

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

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

Приглашение относится к конкретному соединению. Отправитель Upgrade обязан также включить upgrade в поле Connection. Это не позволяет посредникам бездумно пересылать полученную опцию как сквозную. Посредник сначала удаляет поля, перечисленные в Connection. Если прокси поддерживает запрошенный протокол и решает пригласить следующий узел, он может создать новое поле Upgrade для этого участка и обязан включить upgrade в собственное поле Connection пересылаемого сообщения. Поэтому запись на стороне клиента не доказывает, что исходный сервер видел то же предложение; серверная запись не доказывает неизменную доставку ответа клиенту. Сервер HTTP/1.0, получивший Upgrade, обязан его игнорировать.

Корректное принятие имеет более строгую форму. Сервер, переключающий протокол, обязан отправить 101 Switching Protocols и поле Upgrade с выбранным протоколом. Он не вправе выбирать протокол, которого клиент не предлагал. Поэтому 101 — граница решения: до неё клиент только предлагает, а после корректного ответа стороны согласуют новую интерпретацию того же соединения.

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

Механизм не меняет нижележащий транспорт и не создаёт другое соединение. Меняется только верхний прикладной протокол существующего соединения. Если телеметрия связывает предложение на одном соединении с 101 или кадром на другом, она создаёт переход, которого стандарт не описывает. Нужны идентификатор соединения, порядок байтов и направление захвата.

Этот ракурс отличается от R067 о полноте Via, R064 о Alt-Svc и альтернативном пути, Strategic Local о восстановлении приоритета и B842 о корреляции временных IPv6-идентификаторов. Здесь контролируется привязанное к соединению переключение прикладного протокола, а доказательством служит упорядоченная запись согласования и обмена.

Надёжная запись связывает точный запрос, упорядоченные предложения, токены Connection, наблюдения до и после каждого посредника, итоговый статус, выбранный протокол, завершение байтов запроса, точку переключения, первое корректное сообщение нового протокола, откат или закрытие. Такая запись не является протокольным элементом IETF; это редакционное объединение эксплуатационных доказательств. «Предложение замечено» всегда должно отличаться от «переход завершён».

Источники