Когда юзер заходит на сайт, браузер ведь не знает, поддерживает ли сайт http/2. Так же как и сервер не знает про возможности браузера. Как они договариваются между собой о поддержке http/2?
Ответ
Для выбора между 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, не дожидаясь подтверждения от клиента
сервер, не готовый это сделать:
может проигнорировать намерения клиента