Проблема возникает не только из браузера. Использование curl, которое поддерживает HTTP2 по URL http: //, также не работает. Ниже приведены результаты от завитка:
$ curl -I --http2 http://54.208.83.136:8000/ -v -k
* Trying 54.208.83.136...
* Connected to 54.208.83.136 (54.208.83.136) port 8000 (#0)
> HEAD/HTTP/1.1
> Host: 54.208.83.136:8000
> User-Agent: curl/7.47.1
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
>
Как мы видим на выходе из винта. Он отправляет запрос HTTP/1.1 Upgrade с соответствующими заголовками, установленными в соответствии с http2 rfc.
На стороне сервера журналы были очень длинными, поэтому я представляю здесь только содержание сообщений в соответствующих трех журналах.
New incoming HTTP/2 connection
Client connection header prelude does not match
PROTOCOL ERROR, Fatal error, closing connection
Так что в основном сервер закрыл соединение, поскольку прелюдия заголовка соединения клиента не совпадает. Проверяя код, я понял, что ошибка возникла из функции readPrelude endpoint.js. Это функция для чтения заголовка клиента, но я не знаю, что это неправильно в заголовке клиента :(.
Таким образом, может быть, я могу сказать, что узел-http2 модуль не поддерживает http2 над открытым текстом.
Обновление: выясняется, что я ошибался. Модуль node-http2 поддерживает HTTP2 поверх открытого текста с прямым подключением, он не поддерживает HTTP/2 сервер с обновлением от HTTP/1.1. используя механизм Upgrade для подключения к серверу, не поддерживающему обновление. Использование клиента nghttp для подключения к серверу с предшествующими знаниями работает следующим образом.
$ nghttp http://127.0.0.1:8000/
Hello world from HTTP2!
Сервер nghttpd также поддерживает HTTP2 без TLS, хотя он не поддерживает HTTP Upgrade.
$ nghttpd -d /Documents/Proxy 8080 --no-tls -v
Поэтому я настоятельно рекомендую использовать nghttp, если вы хотите протестировать HTTP2 без TLS.