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

Если я напечатаю https://http2.golang.org/, браузер Chrome автоматически отправит запрос HTTP/2. Как это делается?

Ответ 1

Возьмем, например, stackoverflow, когда браузер отправляет запрос на stackoverflow.com, он должен выполнить следующие шаги:

  1. Поиск DNS. найти IP-адрес stackoverflow.
  2. TCP/IP рукопожатие
  3. TLS рукопожатие.
  4. HTTP запрос/ответ (протокол приложения).
  5. ...

TLS рукопожатие

Относительно рукопожатия TLS Step3 @Oleg есть хорошее объяснение.

Для проверки деталей пакета TCP/IP вам может понадобиться использовать некоторые инструменты для захвата пакетов. например, Wireshark.

Клиент отправляет ClientHello на сервер, который несет несколько вещей

  • поддерживаемый набор шифров. какие комплекты шифров вам нравятся?
  • поддерживаемая версия TLS.
  • случайное число.
  • поддерживаемые протоколы приложений. например HTTP/2, HTTP 1.1/Spdy/..
  • ...

Client Hello

Сервер отвечает SeverHello, который несет

  • выбранный набор шифров.
  • выбранная версия TLS.
  • случайное число
  • И, выбранные прикладные протоколы в согласовании протоколов прикладного уровня TLS (ALPN), например HTTP/2

enter image description here

Заключение

HTTP2 запрос/ответ происходит в шаге 4. До этого браузер уже знал, поддерживает ли сервер HTTP/2 через рукопожатие TLS.

Ответ 2

Браузер Chrome отправит HTTP/1.1 запрос на веб-сайт. Поскольку сайт HTTP/2 Enabled, он отправит браузеру сообщение, что он поддерживает HTTP/2. Сервер обновляет протокол связи между ним и сервером до HTTP/2, если находит браузер, способный распознавать HTTP/2. Таким образом, это, как правило, сервер, который преобразует запрос в HTTP/2 Connection. Браузер просто соответствует политике обновления сервера. Браузер Chrome показывает, что у вас есть соединение HTTP/2 с сервером или веб-сайтом, только после того, как сервер обновит протокол связи.

Ответ 3

Строка "h2" идентифицирует протокол, в котором HTTP/2 использует Transport Layer > Security (TLS) [TLS12]. Этот идентификатор используется в поле TCP-ALPN для согласования протокола уровня приложения (ALPN) > extension [TLS-ALPN] и в любом месте, где идентифицируется HTTP/2 через TLS.

Если сервер поддержки HTTP2.0 браузер найдет, что сервер поддерживает http2.0 в протоколе протокола уровня TLS. ссылка на ссылку!

Ответ 4

Сам сайт использует библиотеку Go 1.6. https://godoc.org/golang.org/x/net/http2
Но возможны и другие способы.
Вы должны проверить:
http://www.w3schools.com/default.asp для некоторых основных уроков, а затем попробуйте и узнайте что-нибудь об заголовках API и т.д., если вы заинтересованы в этом.