путаница в отношении двунаправленного и дуплексного режима в статьях о http / 2 - PullRequest
0 голосов
/ 01 марта 2019

Некоторые статьи, описывающие http / 2, восхваляют его как двунаправленный, так и полнодуплексный.

Двунаправленный AFAIK означает, что обмен данными осуществляется в обоих направлениях, поэтому дуплекс по своей природе является двунаправленным, да?

Дуплекс может быть создан одним симплексным потоком, который обращен в некоторых конкретных точках (полудуплекс), или он может быть создан как два противоположных симплексных потока (полнодуплекс).

Может быть, двунаправленныйинициировать обмен сообщениями?В http / 1 только клиент может инициировать, отправив запрос на сервер, на котором сервер возвращает ответ.В http / 2 сервер может отправлять (отправлять) некоторый ресурс без явного запроса на него.Но мы можем использовать Server-sent events в http / 1.1 (то есть сервер может отправлять сообщения, если он этого захочет, после небольшой настройки как на клиенте, так и на сервере, но все равно по протоколу http / 1.1).

Когда вы думаете об этом, вы можете заметить, что http / 1 также является двунаправленным и полнодуплексным (так как конвейерная обработка была бы невозможна в полудуплексном режиме).Поэтому здесь нет изменений с точки зрения http / 2.

Что изменилось, так это то, что http / 1 требовал, чтобы ответы приходили в точном порядке, в котором они были запрошены.http / 2 поднимает это с помощью потоков и мультиплексирования.

1 Ответ

0 голосов
/ 01 марта 2019

Двунаправленный означает, что вы можете отправлять данные в обоих направлениях.

Полный дуплекс означает, что вы можете отправлять данные в обоих направлениях одновременно - вы можете иметь два потока, один для записи данных иодно чтение данных, выполняемое одновременно.

Если мы берем в качестве конечных точек «клиент» и «сервер» (независимо от того, сколько TCP-соединений между ними), то, очевидно, оба HTTP / 1.1 и HTTP / 2 являются полнодуплексными.

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

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

Теперь мы можем ввести вопрос незапрошенной связи от сервера к клиенту.

Это невозможно в HTTP / 1.1.Даже при отправленных событиях сервера (SSE) клиент делает запрос, а сервер отвечает «бесконечным ответом» - но клиент должен сначала сделать запрос.

В HTTP / 1.1 SSE не является полным дуплексом източка зрения единственного соединения TCP: клиент сначала делает запрос, затем сервер отвечает «бесконечным ответом».С этого момента клиент может связываться с сервером только путем другого запроса, что означает открытие нового соединения.

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

«Бесконечный ответ» SSE можно рассматривать как «сервер записывает порции данных, которыеможет интерпретироваться как отправленные сообщения ", но протокол SSE слишком прост, чтобы разрешить общие сообщения от сервера клиенту (например, данные не могут быть двоичными).Вы не рассматриваете загрузку, которая заикается как сервер, передающий данные клиенту:)

Нежелательная связь с сервера клиенту также невозможна в HTTP / 2, потому что HTTP / 2 может«протолкнуть» ресурс клиенту, но только в контексте предыдущего запроса.

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

Именно поэтому HTTP / 2 не может бытьполная замена протоколу WebSocket, который является единственным веб-протоколом, который вы можете использовать для полной незапрошенной связи от сервера к клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...