Двунаправленный означает, что вы можете отправлять данные в обоих направлениях.
Полнодуплексный режим означает, что вы можете отправлять данные в обоих направлениях одновременно - у вас может быть два потока, один для записи данных и один для чтения данных, которые выполняются одновременно.
Если мы возьмем в качестве конечных точек «клиент» и «сервер» (независимо от того, сколько TCP-соединений между ними), то очевидно, что и HTTP / 1.1, и HTTP / 2 являются полнодуплексными.
Если мы возьмем в качестве конечных точек два конца одного TCP-соединения между клиентом и сервером, снова и HTTP / 1.1, и HTTP / 2 - в общем - полнодуплексные.
Это очевидно для HTTP / 2, но менее известно для HTTP / 1.1, поскольку его обычно считают протоколом «сначала запрос, затем ответ» - однако это не так. Это вполне возможно, например, для сервера, который повторяет байты содержимого, которые отправляет клиент, чтобы клиент сделал большую загрузку, и пока загрузка все еще продолжается, сервер уже начинает отвечать, повторяя байты - загрузить и загрузка происходит одновременно.
Теперь мы можем перейти к вопросу незапрашиваемой связи от сервера к клиенту.
Это невозможно в HTTP / 1.1. Даже с Server Sent Events (SSE) клиент делает запрос, а сервер отвечает «бесконечным ответом», но клиент должен сделать запрос первым.
В HTTP / 1.1 SSE не является полнодуплексным с точки зрения одного TCP-соединения: сначала клиент делает запрос, а затем сервер отвечает «бесконечным ответом». С этого момента клиент может взаимодействовать с сервером только путем выполнения другого запроса, что означает открытие нового соединения.
В HTTP / 2 SSE является полнодуплексным, потому что клиент может связаться с сервером, сделав другой запрос в том же TCP-соединении, благодаря мультиплексированию HTTP / 2.
«Бесконечный ответ» SSE можно рассматривать как «сервер записывает блоки данных, которые можно интерпретировать как отправленные сообщения», но протокол SSE слишком прост, чтобы разрешать общие сообщения от сервера к клиенту (например, данные не могут быть двоичными). Вы не стали бы рассматривать загрузку, которая заикается, как сервер, отправляющий данные клиенту :)
Незапрашиваемая связь от сервера к клиенту также невозможна в HTTP / 2, поскольку HTTP / 2 может «протолкнуть» ресурс клиенту, но только в контексте предыдущего запроса.
Например, клиент HTTP / 2 устанавливает соединение с сервером, но не отправляет никаких запросов; в этом случае сервер не сможет отправить что-либо клиенту (даже страницу приветствия), поскольку для этого ему нужен предыдущий запрос.
Вот почему HTTP / 2 не может быть полной заменой протокола WebSocket, который является единственным веб-протоколом, который вы можете использовать для полной незапрашиваемой связи от сервера к клиенту.
person
sbordet
schedule
01.03.2019