Почему кодирование Хаффмана является дополнительным в HTTP / 2 HPACK? - PullRequest
0 голосов
/ 28 сентября 2019

Я хочу убедиться, что правильно понимаю: это из раздела 5.2 RFC7451

   Header field names and header field values can be represented as
   string literals.  A string literal is encoded as a sequence of
   octets, either by directly encoding the string literal's octets or by
   using a Huffman code (see [HUFFMAN]).

     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | H |    String Length (7+)     |
   +---+---------------------------+
   |  String Data (Length octets)  |
   +-------------------------------+

Это означает, что я могу отправлять строковые литералы заголовка с H, равным 1, с Хаффманом.Закодированная строка;или с Н, равным 0, и исходными строковыми октетами;и существующий сервер / реализация HTTP / 2 должен их правильно анализировать, верно?

1 Ответ

0 голосов
/ 28 сентября 2019

Заголовки HTTP в основном состоят из кодов ASCII.ASCII использует коды фиксированной длины, где каждый символ имеет длину 8 битов (на самом деле только 7 битов, поскольку заголовки HTTP используют только первые 127 кодов в исходном наборе символов ASCII, но 8-й бит установлен в 0).

Кодирование Хаффмана использует кодирование переменной длины.Более часто используемые символы имеют более короткие коды менее 8 бит, а менее часто используемые символы имеют более 8 бит.Большая часть текста состоит из наиболее часто используемых кодов, поэтому длина должна быть короче, чем ASCII, в большинстве случаев.Это особенно верно, поскольку ASCII «теряет» немного, когда используется только тот базовый символ, для которого требуется всего 7 бит, но сохраняйте его в 8 битах пространства.

Таким образом, будут некоторые фрагменты текста, которые на самом деле длиннее, чемASCII, если используется кодирование Хаффмана.

Таблица кодирования Хаффмана, используемая в HPACK, показана здесь , и в качестве примера вы можете видеть, что < кодируется как 111111111111100, что составляет 15 битов.Поэтому для кодирования Хаффмана строка <<<< будет занимать 4 октета в ASCII, но 60 бит или 8 октетов в кодировке Хаффмана.

Поэтому в этом случае HPACK позволяет использовать ASCII, поскольку это более эффективно.

Может быть, это немного сложнее, и мы должны просто принять немного менее эффективное кодирование в этих редких случаях - некоторые говорят, что IETF одержим сохранением битов - но именно поэтому оно есть.

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

Кстати, если вы хотите понять HPACK более подробно, чемСпецификация дает, затем я освещаю это (включая ответ на этот вопрос!) в главе 8 моей книги: https://www.manning.com/books/http2-in-action.

...