Почему HTTP / 2 выполняет мультиплексирование, хотя tcp делает то же самое?

Насколько мне известно, TCP разбивает сообщение на сегменты. Итак, почему снова мультиплексирование по HTTP2? Каковы преимущества двойного мультиплексирования?


person devhak    schedule 29.01.2018    source источник
comment
TCP работает на более низком уровне, чем http. Это означает, что тот факт, что TCP реализует пакетный подход, не имеет значения или полезности на уровне протокола. Здесь вам все равно придется настраивать новые подключения для каждого отдельного запроса.   -  person arkascha    schedule 30.01.2018
comment
Поскольку запросы HTTP / 1.1 блокируют TCP-соединение: stackoverflow.com/questions/36517829/   -  person Barry Pollard    schedule 30.01.2018


Ответы (3)


TCP не мультиплексируется. TCP - это просто гарантированный поток сообщений (т.е. пропущенные пакеты повторно запрашиваются, а поток TCP в основном временно блокируется, пока это происходит).

TCP, как протокол на основе пакетов, может использоваться для мультиплексных соединений, если протокол приложения более высокого уровня (например, HTTP) позволяет отправлять несколько сообщений. К сожалению, HTTP / 1.1 не позволяет этого: как только сообщение HTTP / 1.1 отправлено, никакое другое сообщение не может быть отправлено по этому соединению, пока это сообщение не будет возвращено полностью (игнорируя плохо поддерживаемую концепцию конвейерной обработки). Это означает, что HTTP / 1.1 в основном синхронный, и, если не используется полная пропускная способность и другие сообщения HTTP помещены в очередь, то он тратит впустую любую дополнительную емкость, которая может быть использована в базовом TCP-соединении.

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

Таким образом, HTTP / 2 добавляет к протоколу мультиплексирование, позволяющее использовать одно TCP-соединение для нескольких HTTP-запросов в полете.

Это достигается путем изменения текстового протокола HTTP / 1.1 на двоичный протокол на основе пакетов. Они могут выглядеть как пакеты TCP, но на самом деле это не актуально (точно так же, как утверждение, что TCP похож на IP, потому что он основан на пакетах, не имеет значения). Разделение сообщений на пакеты - действительно единственный способ позволить нескольким сообщениям быть в движении одновременно.

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

Фактически, поскольку TCP не позволяет использовать отдельные независимые потоки (т.е. мультиплексирование) и поскольку это гарантировано, это фактически создает новую проблему, когда один отброшенный пакет TCP удерживает все HTTP / 2. потоков в этом соединении, несмотря на то, что действительно должен быть затронут только один поток, а другие потоки должны иметь возможность продолжать работу, несмотря на это. Это может даже замедлить работу HTTP / 2 в определенных условиях. Google экспериментирует с переходом от TCP к QUIC, чтобы решить эту проблему.

Подробнее о том, что означает мультиплексирование в HTTP / 2 (и почему это хорошее улучшение!), Читайте в моем ответе здесь: Что означает мультиплексирование в HTTP / 2

person Barry Pollard    schedule 30.01.2018
comment
HTTP / 2 также добавляет концепцию потоков, так что пакеты могут принадлежать разным запросам - TCP не имеет такой концепции - и это то, что действительно делает HTTP / 2 мультиплексированным. Вы имеете в виду, что HTTP / 1.1 инкапсулирует одно сообщение HTTP (запрос или ответ) в один пакет TCP, а HTTP / 2 инкапсулирует несколько сообщений HTTP в одном пакете TCP? - person Maggyero; 24.02.2021
comment
Нет, я имею в виду, что TCP не имеет концепции маркировки пакета как для того или иного HTTP-запроса. Это просто поток пакетов. Таким образом, HTTP / 1.1 является просто парой символов, он должен предполагать, что все пакеты предназначены для запроса 1, пока он не увидит магические символы, сигнализирующие о конце запроса 1 - тогда он предполагает, что все для запроса 2, пока не увидит конец запроса 2. HTTP / 2, однако, разбивает каждый запрос на несколько кадров, помечает каждый кадр идентификатором запроса (ну, идентификатор потока, но поток в основном создается для запроса), чтобы вы могли объединить эти кадры, а затем разомните их на другом конце. - person Barry Pollard; 24.02.2021
comment
Спасибо, понятно. Фундаментальным улучшением HTTP / 2 является поток concurrency (чередование потоков), который разрешен новым разделением потоков на кадры с идентификаторами потоков. Параллелизм потоков был невозможен в HTTP / 1.1, поскольку потоки были разделены на символы без идентификаторов потоков. Таким образом, новинка HTTP / 2 - это не конвейерная обработка (которая уже была доступна в HTTP / 1.1, но не широко поддерживалась в веб-браузерах) и не мультиплексирование (которое уже было доступно в HTTP /1.1, поскольку мультиплексирование просто использует несколько потоков по одному соединению). - person Maggyero; 01.03.2021
comment
Почти, за исключением того, что мультиплексирование подразумевает параллелизм. Последовательные запросы (то есть один за другим, но без разрыва соединения между ними - стало возможным благодаря функции поддержки активности в HTTP / 1.1) не мультиплексируются. TCP предлагает последовательные запросы, следующие друг за другом и, согласно исходному вопросу, и первой строке моего ответа, которая не мультиплексируется. - person Barry Pollard; 01.03.2021
comment
Я думаю, это зависит от того, что вы считаете потоком. Если вы используете разные определения потоков для HTTP / 1.1 и HTTP / 2, то есть в HTTP / 2 вы определяете поток как одно сообщение (т.е. последовательность кадров), а в HTTP / 1.1 вы определяете поток как all сообщения (то есть последовательность сообщений), тогда да, HTTP / 1.1 не использует мультиплексирование, поскольку для каждого соединения (канала) существует единственный поток (сигнал). Но если вы используете одни и те же определения для HTTP / 1.1 и HTTP / 2, то есть вы определяете поток как одно сообщение для обоих, тогда HTTP / 1.1 действительно использует мультиплексирование, поскольку для каждого соединения существует несколько потоков. - person Maggyero; 01.03.2021
comment
Лично я бы не стал рассматривать второе определение как мультиплексирование. И вернемся к исходному вопросу: «Почему HTTP / 2 выполняет мультиплексирование, а TCP - то же самое?» TCP и HTTP / 1.1 не делают того же. И HTTP / 2 RFC очень четко описывает свое определение потока и почему HTTP / 1.1 не соответствует этим критериям, поскольку они не являются независимыми и не параллельными: tools.ietf.org/html/rfc7540#section-5 - person Barry Pollard; 01.03.2021
comment
Мы согласны с тем, что TCP и HTTP / 1.1 не выполняют то же самое, что HTTP / 2: TCP и HTTP / 1.1 используют последовательные сообщения (конкатенация), тогда как HTTP / 2 используют параллельные сообщения (чередование). Теперь эти свойства упорядочивания кажутся ортогональными мультиплексированию, которое разделяет канал для передачи нескольких сигналов (независимо от порядка) - за исключением нескольких бесконечные сигналы, когда мультиплексирование действительно подразумевает параллелизм. Итак, если вы считаете, что HTTP / 1.1 не использует мультиплексирование, в то время как HTTP / 2 использует, это означает, что ваше представление (и это нормально): HTTP / 1.1 signal = all messages; Сигнал HTTP / 2 = одно сообщение. - person Maggyero; 01.03.2021
comment
Да, это мое мнение, но я также отвечаю в контексте вопроса, тогда как ваше определение означало бы, что вопрос не имеет смысла. Я бы сказал, что вы говорите о постоянных соединениях, а не о мультиплексных соединениях: en.wikipedia.org/wiki/HTTP_persistent_connection имеет следующее. Более новый протокол HTTP / 2 использует ту же идею и развивает ее, позволяя мультиплексировать несколько одновременных запросов / ответов через одно соединение. - person Barry Pollard; 01.03.2021
comment
Да, на мой взгляд, исходный плакат вносит путаницу в терминологию, используя слово «мультиплексирование» как синоним «разбиения»: «TCP разбивает сообщение на сегменты. Так почему же снова происходит мультиплексирование на HTTP / 2? »Итак, я думаю, что на самом деле первоначальный плакат спрашивал: почему HTTP / 2 разбивает сообщения на фреймы, тогда как сообщения уже разбиты на пакеты на уровне TCP? Я не уверен, что он спрашивал о параллелизме, мультиплексировании или конвейерной обработке, но ответ на его вопрос - параллелизм. - person Maggyero; 01.03.2021
comment
Спасибо за ссылку. Заявление о постоянных соединениях HTTP / 2 было добавлено сюда. Но это не означает, что HTTP / 1.1 не позволяет мультиплексировать несколько сообщений через одно соединение. Это означает, что HTTP / 1.1 не позволяет мультиплексировать несколько одновременных сообщений через одно соединение. Но несколько последовательных сообщений могут быть мультиплексированы через одно соединение благодаря постоянным соединениям. Если только вы не рассматриваете их как единый сигнал через одно соединение. - person Maggyero; 01.03.2021

TCP не выполняет мультиплексирование. Сегменты TCP просто означают, что (одиночный) поток данных разбивается на части, которые могут быть отправлены в IP-пакетах. Каждый сегмент TCP идентифицируется только смещением потока (порядковым номером), а не каким-либо полезным способом идентификации отдельных потоков. (Мы проигнорируем редко используемую вещь Urgent Pointer.)

Итак, чтобы выполнить мультиплексирование, вам нужно что-то поставить поверх TCP. Что делает HTTP / 2.

person Ove    schedule 30.01.2018

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

Выглядит это так:

введите описание изображения здесь

Как видите, HTTP находится выше TCP. Ниже TCP - IP. Один из основных протоколов Интернета. Сам IP имеет дело с пакетами, которые коммутируются / мультиплексируются. Думаю, отсюда вы можете подумать, что TCP мультиплексирован, но это не так. Думайте о TCP-соединении как о туннеле с одной полосой движения, по которому никто не может проехать. Допустим, у него по одной полосе в каждом направлении. Вот как будет выглядеть TCP-соединение. Туннель, в который вы помещаете данные в один конец, а они выходят из другого в том же порядке, в котором они входили. Это TCP. Как видите, на этом нет мультиплексирования. Однако TCP действительно обеспечивает надежный протокол соединения, для которого другие протоколы могут быть построены поверх, например, HTTP. А для HTTP важна надежность.

HTTP 1.1 - это просто протокол ответа на запрос. Но, как вы понимаете, это не мультиплексирование. Таким образом, разрешайте только один невыполненный запрос за раз и нужно отправлять весь ответ на каждый запрос за раз. Раньше браузеры обходили это ограничение, создавая несколько TCP-соединений (туннелей) с сервером, с помощью которого можно было делать больше запросов.

HTTP 2 фактически снова разделяет данные и позволяет мультиплексировать по одному соединению, так что не нужно создавать никаких дополнительных соединений. Это означает, что сервер может начать обслуживать несколько запросов и мультиплексировать ответы, чтобы браузер мог получать изображения, страницы и другие ресурсы одновременно, а не по одному.

Надеюсь, что это проясняет.

person hookenz    schedule 30.01.2018
comment
Я не считаю это хорошим ответом на вопрос, потому что, хотя в нем есть хорошая информация, он фокусируется на абстракции более высокого уровня, а не на возможностях самого протокола TCP. Если абстракция была единственной причиной сделать что-то неэффективным способом (т. Е. Если бы существовал более эффективный способ использования протокола, если бы не абстракция), тогда абстракция плохая, ее следует изменить и, вероятно, давно бы поменяли. Таким образом, ИМХО, хороший ответ должен быть сосредоточен на том, почему сегментация TCP не способна к мультиплексированию, а не на том, что представлено на более высоких уровнях. - person Ove; 31.01.2018
comment
@Ove - Ты прав, это была чушь. Я переписал свой ответ с нуля. - person hookenz; 31.01.2018