#http #https
Когда юзер заходит на сайт, браузер ведь не знает, поддерживает ли сайт http/2. Так же как и сервер не знает про возможности браузера. Как они договариваются между собой о поддержке http/2?
Ответы
Ответ 1
Для выбора между HTTPS и HTTP/2+TLS — по ALPN (RFC). Поскольку HTTPS и HTTP/2 оба могут работать по TLS 1.2 и выше, было создано расширение для TLS, ALPN, с помощью которого клиент и сервер могут договориться о доступных протоколах ещё на этапе TLS-"приветствия" (handshake). Протокол HTTP/2 идентифицируется в нём токеном h2, это разновидность HTTP/2, работающая поверх TLS, с шифрованием. "Крупные браузеры" заявили, что будут поддерживать только HTTP/2 по TLS (1, 2), поэтому других способов на практике можно запросто не встретить. Для HTTP/2 по "голому" TCP-соединению (поддержка которого так себе, см. выше) используется обычный механизм по заголовку Upgrade, тот же что и для Websocket, в котором: клиент должен совершить первый полный запрос, заявив о возможности обновить протокол до h2c (HTTP/2 через голый TCP) заголовком Upgrade и приложив ровно один заголовок HTTP2-Settings с base64-закодированными настройками протокола сервер, готовый это сделать: должен ответить 101 Switching Protocols завершив этот ответ, начать отдавать ответ на исходный запрос уже по HTTP/2, не дожидаясь подтверждения от клиента сервер, не готовый это сделать: может проигнорировать намерения клиентаОтвет 2
https://http2.github.io/http2-spec/#discover-http 3.2 Starting HTTP/2 for "http" URIs A client that makes a request for an "http" URI without prior knowledge about support for HTTP/2 on the next hop uses the HTTP Upgrade mechanism (Section 6.7 of [RFC7230]). The client does so by making an HTTP/1.1 request that includes an Upgrade header field with the "h2c" token. Such an HTTP/1.1 request MUST include exactly one HTTP2-Settings (Section 3.2.1) header field. For example: GET / HTTP/1.1 Host: server.example.com Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings:Перевод: 3.2 Инициация HTTP/2 через «http» URI Клиент, который делает запрос на «HTTP» URI без предварительного знания о поддержке HTTP/2 на следующем хопе использует механизм HTTP Upgrade (раздел 6.7 [RFC7230]). Клиент делает это путем создания запроса HTTP/1.1, который включает в себя заголовочное поле Upgrade с текстом «h2c». Такой HTTP/1.1 запрос должен включать в себя ровно одно заголовочние поле HTTP2-Settings (раздел 3.2.1). Например: GET / HTTP/1.1 Host: server.example.com Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings:
Комментариев нет:
Отправить комментарий