Почему говорят, что HTTP2 - это двоичный протокол? - PullRequest
0 голосов
/ 22 октября 2019

Я только что прочитал статью о различиях между http и http2 , но главный вопрос, который у меня возникает, - когда синица сказала, что http2 - это двоичный протокол, но http 1 - это текстовый протокол .

Возможно, я ошибаюсь, но я знаю, что любые данные, текст или любой другой формат могут иметь форму представления binray в памятии даже при передаче через tcp / ip-сеть данные разделяются в формате в соответствии с уровнем (модель OSI или представление модели TCP / IP), что означает, что технически текстовая форма не существует в контекстепередача данных через сеть.

Так что я не могу по-настоящему понять это различие между http2 и http1, не могли бы вы помочь мне, пожалуйста, с лучшим объяснением?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Двоичный код, вероятно, сбивает с толку термин - в конечном итоге все в двоичном виде в компьютерах!

HTTP / 2 имеет высоко структурированный формат, где сообщения HTTP форматируются в пакеты (называемые кадрами) и где каждый кадрназначенный потоку. Фреймы HTTP / 2 имеют определенный формат , включая длину, объявленную в начале каждого кадра, и различные другие поля в заголовке кадра. Во многом это похоже на пакет TCP. Чтение кадра HTTP / 2 может следовать определенному процессу (первые 24 бита - это длина этого пакета, затем 8 битов, которые определяют тип кадра ... и т. Д.). После заголовка кадра следует полезная нагрузка (например, заголовки HTTP или полезная нагрузка тела), и они также будут в определенном заранее известном формате. Сообщение HTTP / 2 может быть отправлено в одном или нескольких кадрах.

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

Преимущество, которое приносит HTTP / 2, заключается в том, чточто, упаковывая сообщения в определенные кадры, мы можем смешивать сообщения: вот немного запроса 1, вот немного запроса 2, вот еще немного запроса 1 ... и т. д. В HTTP / 1.1 это невозможно в качестве HTTPсообщение не упаковано в пакеты / кадры, помеченные идентификатором того, к какому запросу он относится.

У меня есть диаграмма здесь и анимированная версия здесь , котораяпомогите осмыслить это лучше.

0 голосов
/ 22 октября 2019

HTTP в основном кодирует все соответствующие инструкции в виде кодовых точек ASCII, например:

GET /foo HTTP/1.1

Да, это представлено в байтах на реальном транспортном уровне, но команды основаны на байтах ASCII и, следовательно, являются для чтения в виде текста .

HTTP / 2 использует действительные двоичные команды, то есть отдельные биты и байты, которые не имеют никакого представления, кроме битов и байтов, и, следовательно, не имеют читаемого представления. (Обратите внимание, что HTTP / 2 по сути оборачивает HTTP / 1 в таком двоичном протоколе, где-то там еще можно найти «GET /foo».)

...