Как веб-сервер сообщает клиенту о поддержке HTTP/2?

Как веб-сервер сообщает клиенту о поддержке HTTP/2?
Как веб-сервер сообщает клиенту о поддержке HTTP/2?

Я создал HTTP2-сервер nodeJS на своем локальном хосте: 127.0.0.1:8443. Пошел к wirehark и выбрал адаптер обратной связи для захвата трафика, когда я попадаю на сервер из своего хрома. Я не вижу, чтобы сервер указывал в шагах связи, поддерживает ли он HTTP2. Chrome просто идентифицирует HTTP 1.1 как протокол связи. Я хочу понять, когда сервер будет указывать протоколы, которые он поддерживает, и почему связь в моем случае не происходит через HTTP2, когда я создал сервер nodeJS как HTTP2?

Я прошел через это: Как определяется HTTP-версия запроса браузера и HTTP-версия ответа сервера? но это не помогает.

Короткий ответ

Для безопасных соединений намерение использовать HTTP/2 согласовывается во время согласования TLS через TLS-ALPN. Затем, после завершения согласования TLS, обе стороны обмениваются предисловиями подключения HTTP/2 и с этого момента продолжают использовать HTTP/2.

Для незащищенных соединений намерение использовать HTTP/2 больше не согласовывается (и, возможно, никогда не согласовывалось). Клиент (браузер) просто должен каким-то образом уже знать, что сервер поддерживает HTTP/2, и как только небезопасное рукопожатие TCP завершится, клиент должен начать соединение с предисловием к соединению HTTP/2, на которое сервер должен ответить своим собственным Предисловие к подключению HTTP/2, и с этого момента обе стороны должны продолжать использовать HTTP/2.

Длинный ответ

Это описано в спецификации HTTP/2, последней версией которой на момент написания этой статьи является RFC 9113. Особо следует обратить внимание на Раздел 3, «Запуск HTTP/2».

https://www.rfc-editor.org/rfc/rfc9113#starting

[Примечание: более ранняя версия спецификации HTTP/2 позволяла небезопасным соединениям обновляться с HTTP/1.1 до HTTP/2, но она никогда не была широко распространена и теперь устарела. Я не знаю, какие версии браузера или версии сервера могли его поддерживать, но в нем клиент делал запрос HTTP/1.1 с некоторыми специальными заголовками, сообщающими, что он поддерживает HTTP/2 и хотел бы, чтобы сервер обновил соединение до HTTP. /2, если это возможно, а затем сервер ответит ответом «HTTP/1.1 101 Switching Protocols», а затем обработает остальную часть соединения как HTTP/2 (т. е. путем обмена HTTP/2 Connection Prefaces с клиентом и т. д.) ]

Поэтому, если вы хотите установить небезопасное соединение HTTP/2, браузер просто должен каким-то образом уже знать, что сервер поддерживает HTTP/2, и ему нужно просто установить соединение TCP, а затем начать с предисловия к соединению HTTP/2.

В случае https:// URI с защитой TLS клиент указывает, что он хочет использовать HTTP/2 через согласование протокола уровня приложения TLS (TLS-ALPN), как указано в RFC 7301.

После завершения согласования TLS клиент и сервер отправляют Предисловие к соединению HTTP/2.

Судя по снимку экрана трассировки пакетов, ваш браузер вообще не пытается использовать HTTP/2. Несмотря на то, что ваш номер порта 8443 предлагает альтернативный порт 443, предлагающий TLS, я не вижу, чтобы TLS происходил, поэтому я предполагаю, что TLS-ALPN не происходит, но, возможно, это происходит, но ваш скриншот этого не показывает. Ваш браузер также не запускает соединение с предисловием к соединению HTTP/2, он запускает его с соединением HTTP/1.1 даже без устаревших заголовков Upgrade. Таким образом, вам может потребоваться выяснить, как указать браузеру обрабатывать ваш сервер как HTTP/2, и это может включать в себя включение TLS и TLS-ALPN на вашем сервере, чтобы ваш браузер мог узнать о поддержке HTTP/2 через TLS- ALPN во время согласования TLS.


NevaDev, 15 марта 2023 г., 12:09