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

В настоящее время производительность HTTP/2 растет.

Последняя версия Node.js очень хорошо поддерживает HTTP/2.

https://nodejs.org/api/http2.html

Но я понятия не имею, как реализовать клиент HTTP/2 в среде браузера.

https://nodejs.org/api/http2.html#http2_client_side_example

Приведенная выше ссылка показывает, как использовать ее в клиенте Node.js.

Как я могу реализовать тот же клиент в браузере?


person Valeri    schedule 11.09.2018    source источник
comment
Я не думаю, что клиент http2 доступен в браузерах.   -  person Lewis    schedule 11.09.2018
comment
браузер будет использовать http/2, если сервер поддерживает http/2 - не нужно реализовывать клиент .. вы просто используете XHR или например выборку   -  person Jaromanda X    schedule 11.09.2018
comment
@JaromandaX fetch или XHR не могут контролировать push-обещания, отправленные с сервера. Я думаю, что предоставление клиента http2 в браузерах по-прежнему имеет смысл.   -  person Lewis    schedule 11.09.2018
comment
или вы можете использовать веб-сокеты в этом случае @Lewis (что такое push-обещание?)   -  person Jaromanda X    schedule 11.09.2018
comment
@JaromandaX Я имею в виду, что вы не можете управлять файлами, обслуживаемыми через запрос http2, без клиента http2 (события для определения состояния каждого push-уведомления сервера, ответа каждого push-уведомления сервера и т. д.)   -  person Lewis    schedule 11.09.2018
comment
Многие современные браузеры поддерживают HTTP/2, поэтому для него должны быть какие-то интерфейсы.   -  person Valeri    schedule 12.09.2018


Ответы (2)


В настоящее время вы не можете этого сделать. В целом HTTP/2 должен быть прозрачным при использовании для веб-страниц и веб-приложений, поэтому нет необходимости реализовывать низкоуровневые потоки HTTP/2 и детали подключения. Это часть красоты того, как это было реализовано — браузер позаботится обо всем этом, и веб-странице и веб-приложению не нужно знать, использовался ли HTTP/1.1 или HTTP/2.

Возможным исключением из этого является HTTP/2 push, и было предложение выставить HTTP/2 Push программно в рамках Рабочей группы по технологиям веб-гипертекстовых приложений (WHATWG): https://github.com/whatwg/fetch/issues/51. Хотя активность на этом, кажется, полностью упала. Поскольку есть несколько сложностей в реализации API push-уведомлений. В целом передача HTTP/2 сложна, особенно из-за разных реализаций браузеров. и ошибки, поэтому попытка предоставить push-сообщения веб-приложению будет сложной. Также многие считают, что push-уведомления HTTP/2 имеют ограниченное применение, и для большинства случаев использования есть лучшие технологии, такие как подсказки ресурсов (для запроса HTTP-ресурсов) или веб-сокеты (для двусторонней связи). Chrome даже экспериментирует с полным отключением.

Помимо push, приоритизация может быть еще одним вариантом использования для предоставления веб-приложениям подробностей HTTP/2 низкого уровня и, возможно, priority. подсказки в конечном итоге предоставят для этого сопоставление, не привязывая его к HTTP/2 (чтобы его можно было использовать под HTTP/1.1, QUIC или чем-то еще, что появится в будущем).

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

person Barry Pollard    schedule 12.09.2018
comment
Потребность в двунаправленном потоке, таком как в HTTP/2, в браузере может возникнуть из-за желания воссоздать функциональность веб-сокета - в настоящее время с HTTP/2 это невозможно - (действительно двунаправленный обмен двоичными данными). - person whale70; 27.12.2018
comment
WebSockets теперь возможны с HTTP/2 (tools.ietf.org/html/rfc8441), хотя по общему признанию, ни один браузер еще не реализовал их (очевидно, в Firefox они появятся в v65 - bugzilla.mozilla. org/show_bug.cgi?id=1434137, и Chrome, похоже, остановился на этом bugs.chromium.org/p/chromium/issues/detail?id=801564). В любом случае веб-сокеты, вероятно, являются лучшим вариантом, чем использование HTTP, который имеет больше накладных расходов: to-server-messages" title="http 2 или websockets для сообщений клиента с сервером с малой задержкой"> stackoverflow.com/questions/50956757/ - person Barry Pollard; 27.12.2018
comment
это приятно знать, спасибо за подсказку - я ожидаю, что Chrome догонит Firefox в отношении веб-сокетов через HTTP/2. Вообще хорошие новости! - person whale70; 29.12.2018
comment
Мой вариант использования — это веб-приложение на основе wasm, в котором я хочу использовать gRPC для связи со службой. - person daniatic; 26.05.2020

На стороне клиента:

Вам не нужно ничего делать в браузере, просто используйте тот, который уже поддерживает протокол HTTP 2.0 https://caniuse.com/#search=http2

На стороне сервера:

В зависимости от используемого вами сервера вам необходимо активировать некоторые модули и настроить некоторые файлы, здесь вы можете увидеть некоторые ссылки на конфигурации сервера: https://github.com/http2/http2-spec/wiki/Implementations

Относительно функции Server Push:

То же самое. Это зависит от сервера, но важно отметить, что вы можете настроить: Ручную отправку или Автоматическую отправку (Auto Push).

Примеры:

Ручная отправка

server {    
    # whenever a client requests demo.html, also push
    # /style.css, /image1.jpg and /image2.jpg
    location = /demo.html {
        http2_push /style.css;
        http2_push /image1.jpg;
        http2_push /image2.jpg;
    }
}

Автоматическая отправка

server { 
    # Intercept Link header and initiate requested Pushes
    location = /myapp {
        proxy_pass http://upstream;
        http2_push_preload on;
    }
}

//httpd.conf or .htaccess (cuando se cargue un html)
<FilesMatch "\.html$">
    Header set Link "</css/styles.css>; rel=preload; as=style"
<FilesMatch>
person Juanma Menendez    schedule 12.01.2019