Пытаюсь понять, что возможно и как это сравнивается с веб-сокетами. Http2 позволяет серверу непрерывно передавать данные клиенту. Существуют ли какие-либо ограничения, которые не позволяют использовать его для отправки видеопакетов достаточно быстро для работы потокового видео?
подходит ли HTTP2 для потокового видео или многопользовательских игр в реальном времени?
Ответы (1)
HTTP/2 push был разработан для отправки ресурсов, связанных с первичным ресурсом.
Он в основном используется для браузеров, где при запросе index.html страницы они получают style.css и application.js, на которые ссылается index.html.
Технически возможна потоковая передача видео клиенту в одном ответе на запрос клиента (массовая загрузка).
Для более продвинутых функций, таких как буферизация с небольшим опережением и загрузка только при потреблении видеопотока, HTTP-клиенты могут отправлять запросы диапазона. а>.
Для загрузки параллельных потоков с разным разрешением — 720p против 1080p — клиент может сделать два разных запроса.
HTTP/2 необходимо настроить так, чтобы у клиентов было большое окно управления потоком (см. этот ответ ), но для браузеров это уже так, и большинство клиентских библиотек HTTP/2 поддерживают такую конфигурацию.
Технически это возможно, но как это сравнить с WebSocket?
В WebSocket полностью отсутствует понятие метаданных, поэтому разработчику приложения придется изобретать некоторый формат метаданных для запросов и ответов, таких как идентификатор/название видеопотока, разрешение, диапазон и т. д., а затем загружать необработанное видео.
Заголовок кадра HTTP/2 составляет 9 байт, заголовок кадра WebSocket — 10 байт (при условии, что кадры большие). Однако максимальный размер кадра составляет 16 КиБ для HTTP/2 и может быть больше для WebSocket, хотя, вероятно, не рекомендуется делать его слишком большим (поскольку клиент может решить не выделять ресурсы для сверхбольших кадров, отправляемых сервером).
Кроме того, в WebSocket существует понятие максимального размера сообщения. Обычно вы не можете просто отправлять кадры WebSocket, принадлежащие одному и тому же сообщению, поэтому вам нужно будет разделить видео на несколько небольших сообщений (но это чисто технический аспект).
Наконец, HTTP/2 может поддерживать связь WebSocket в потоке HTTP/2 (RFC8441).
Это означает, что запрос/ответ HTTP/2 может идеально имитировать связь через WebSocket: у вас будет «бесконечный» запрос — запрос, содержимое которого никогда не заканчивается (пока связь не будет закрыта) — для связи клиента с сервером, и « бесконечный" ответ - тот, у которого есть содержание ответа, которое никогда не заканчивается (пока связь не закрыта) - для связи сервера с клиентом.
Таким образом, я бы не стал использовать HTTP/2 push для потоковой передачи видео: обычный ответ HTTP/2 может выполнять эту работу более эффективно (как WebSocket).
Я считаю, что WebSocket действительно полезен для незапрашиваемой связи между сервером и клиентом. При использовании HTTP/2 клиент всегда должен инициировать запрос.