Являются ли HTTP/2 и HTTP/3 протоколом, основанным на запросах и ответах?

В этом RFC для HTTP/1.1 говорится

Протокол HTTP представляет собой протокол запроса/ответа.

Переход на более новые протоколы HTTP. Спецификация HTTP/2 говорит, что каждый поток представляет собой двунаправленную последовательность кадров. И клиент, и сервер могут инициировать создание потока. (Хотя создание потока сервера происходит в ответ на запрос клиента и упоминается только в отношении отправки сервера H2, которая больше не актуальна)

gRPC и веб-сокеты запускаются на одном клиенте, инициированном Поток H2 также. Оба обеспечивают двустороннюю связь.

  • Означает ли это, что H2 и H3 больше не являются протоколами запроса/ответа?
  • Является ли одиночный поток H2 полнодуплексным? (Под полным дуплексом я подразумеваю, могут ли клиент и сервер одновременно писать и читать сообщения из одного потока. Я не говорю здесь о мультиплексировании H2.)
  • Может ли сервер отправлять нежелательные сообщения клиенту? (кроме серверного пуша - так как он больше не актуален). Если нет, как работает двунаправленная связь gRPC или Websockets через H2?
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Означает ли это, что H2 и H3 больше не являются протоколами запроса/ответа?

Они по-прежнему являются протоколами запроса/ответа. Вы можете создавать другие типы протоколов поверх этого, но они по-прежнему являются запросом/ответом. Или вы можете определить «запрос/ответ» очень строго, так что HTTP/2 не является, но тогда и HTTP/1.1 не является, когда он используется с BOSH. Это не особо значимое обозначение.

Является ли одиночный поток H2 полнодуплексным?

Да. Потоки H2 являются двунаправленными.

Может ли сервер отправлять нежелательные сообщения клиенту?

Не конкретно, но это не то, как WebSockets работают через HTTP/2. См. RFC 8441.

Веб-сокеты через H2 используют туннелированный поток. поскольку веб-сокеты являются двунаправленными, для работы с потоком H2 сервер должен иметь возможность отправлять нежелательные сообщения H2 (комбинацию кадров) клиенту. Разве это не правильно? Учитывая, что сообщения H2 (несколько связанных кадров) сопоставляются с запросом/ответом HTTP/1.1, разве эта реализация (WS поверх H2) не отличается от традиционной модели, основанной на запросах/разрешениях.

ns15 20.02.2023 08:06

WebSocket через HTTP/2 строится на запросе, инициированном клиентом с бесконечным телом, а также на ответе от сервера с бесконечным телом, поэтому вся связь WebSocket представляет собой один запрос/ответ для HTTP/2. Клиент по-прежнему должен инициировать запрос, поэтому сервер не может инициировать нежелательную связь, если только клиент не сделал запрос HTTP/2 для обновления до WebSocket. Таким образом, он не отличается от традиционной модели запроса/ответа — HTTP/2 не знает, что туннелируется, это просто очень длинное тело запроса с очень длинным телом ответа.

sbordet 20.02.2023 10:22

Договорился ж/сбордеть. Существование BOSH не сделало HTTP «не запрос/ответ». Тем не менее, «запрос/ответ» — это описание общего дизайна HTTP (и H2/3). Не существует строгого теста, который идеально отличал бы «запрос/ответ» от «не запроса/ответа», так же как мы не можем однозначно классифицировать объектно-ориентированные или функциональные языки программирования. И тот факт, что вы можете использовать язык иначе, чем его дизайн, не меняет его дизайна. Это всего лишь слова, которые мы используем, чтобы понять, как что-то работает. Это не строгие правила с идеально чистыми краями.

Rob Napier 20.02.2023 16:15

@sbordet Да, теперь имеет смысл думать об этом как о «одиночном запросе / разрешении с бесконечным телом» (как для WS, так и для gRPC).

ns15 21.02.2023 11:31

@RobNapier Я не думаю, что BOSH сравним с WS в потоке H2, когда речь идет о модели req/res. Поскольку BOSH имеет четкое начало и конец цикла req/res, тогда как в случае WS это один бесконечный запрос и ответ. Но я понимаю вашу точку зрения. Сейчас трудно найти идеальные границы, поскольку сам протокол HTTP развивается.

ns15 21.02.2023 11:55

Другие вопросы по теме