Заголовки 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.