В этом RFC для HTTP/1.1 говорится
Протокол HTTP представляет собой протокол запроса/ответа.
Переход на более новые протоколы HTTP. Спецификация HTTP/2 говорит, что каждый поток представляет собой двунаправленную последовательность кадров. И клиент, и сервер могут инициировать создание потока. (Хотя создание потока сервера происходит в ответ на запрос клиента и упоминается только в отношении отправки сервера H2, которая больше не актуальна)
gRPC и веб-сокеты запускаются на одном клиенте, инициированном Поток H2 также. Оба обеспечивают двустороннюю связь.
Означает ли это, что H2 и H3 больше не являются протоколами запроса/ответа?
Они по-прежнему являются протоколами запроса/ответа. Вы можете создавать другие типы протоколов поверх этого, но они по-прежнему являются запросом/ответом. Или вы можете определить «запрос/ответ» очень строго, так что HTTP/2 не является, но тогда и HTTP/1.1 не является, когда он используется с BOSH. Это не особо значимое обозначение.
Является ли одиночный поток H2 полнодуплексным?
Да. Потоки H2 являются двунаправленными.
Может ли сервер отправлять нежелательные сообщения клиенту?
Не конкретно, но это не то, как WebSockets работают через HTTP/2. См. RFC 8441.
WebSocket через HTTP/2 строится на запросе, инициированном клиентом с бесконечным телом, а также на ответе от сервера с бесконечным телом, поэтому вся связь WebSocket представляет собой один запрос/ответ для HTTP/2. Клиент по-прежнему должен инициировать запрос, поэтому сервер не может инициировать нежелательную связь, если только клиент не сделал запрос HTTP/2 для обновления до WebSocket. Таким образом, он не отличается от традиционной модели запроса/ответа — HTTP/2 не знает, что туннелируется, это просто очень длинное тело запроса с очень длинным телом ответа.
Договорился ж/сбордеть. Существование BOSH не сделало HTTP «не запрос/ответ». Тем не менее, «запрос/ответ» — это описание общего дизайна HTTP (и H2/3). Не существует строгого теста, который идеально отличал бы «запрос/ответ» от «не запроса/ответа», так же как мы не можем однозначно классифицировать объектно-ориентированные или функциональные языки программирования. И тот факт, что вы можете использовать язык иначе, чем его дизайн, не меняет его дизайна. Это всего лишь слова, которые мы используем, чтобы понять, как что-то работает. Это не строгие правила с идеально чистыми краями.
@sbordet Да, теперь имеет смысл думать об этом как о «одиночном запросе / разрешении с бесконечным телом» (как для WS, так и для gRPC).
@RobNapier Я не думаю, что BOSH сравним с WS в потоке H2, когда речь идет о модели req/res. Поскольку BOSH имеет четкое начало и конец цикла req/res, тогда как в случае WS это один бесконечный запрос и ответ. Но я понимаю вашу точку зрения. Сейчас трудно найти идеальные границы, поскольку сам протокол HTTP развивается.
Веб-сокеты через H2 используют туннелированный поток. поскольку веб-сокеты являются двунаправленными, для работы с потоком H2 сервер должен иметь возможность отправлять нежелательные сообщения H2 (комбинацию кадров) клиенту. Разве это не правильно? Учитывая, что сообщения H2 (несколько связанных кадров) сопоставляются с запросом/ответом HTTP/1.1, разве эта реализация (WS поверх H2) не отличается от традиционной модели, основанной на запросах/разрешениях.