Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. В данной публикации мы поговорим про кодирование в HTTP, рассмотрим, как HTTP определяет кодовые таблицы для кодировки сообщений и их содержимого и как происходит кодирование передачи данных в HTTP. Давайте сразу оговоримся, что кодирование это не шифрование информации, а преобразование из машинного вида сообщения в человеческий. Еще раз повторю, что протокол HTTP не поддерживает шифрования данных для этого есть SSL и TLS.

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

Кодовые таблицы в HTTP

Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол. Кодовые таблицы в HTTP используются для того, чтобы преобразовывать последовательность байт в последовательность символов, понятных человеку. Для таких манипуляций в HTTP может применяться несколько кодовых таблиц. Таким образом HTTP протокол поддерживает различные виды кодирования: от простых, типа US-ASCII до сложных, которые подразумевают переключения, типа
ISO 2022. Пример кодовых таблиц:

[php]charset = token[/php]

Кодирование содержимого в HTTP

HTTP имеет параметр кодирования содержимого, который определяет какая таблица или какой метод кодирования будет применен к содержимому. Обратите внимание: кодирование содержимого в HTTP не подразумевает его шифрования (положений о шифровании в стандарте HTTP просто нет, а модель безопасности в HTTP очень слабая), кодирование содержимого используется  обычно для сжатия информации и обычно без потерь полезного содержимого этой информации.

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

[php]

Accept-encoding: gzip
или
Accept-encoding: compress
Или так
Accept-encoding: deflate

[/php]

Все значения кодирования содержимого (content-coding) не чувствительны к регистру. HTTP версии 1.1 использует значения кодирования содержимого (content-coding) в полях заголовка AcceptEncoding и Content-Encoding. Хотя значение описывает кодирование содержимого, но, что более важно — оно указывает, какой механизм декодирования потребуется для обратного процесса. gzip. Формат кодирования, производящий сжатие файла программой «gzip» (GNU zip. compress. Формат кодирования, производимый общей программой «compress» для сжатия UNIX файлов. deflate. Формат zlib, в комбинации с механизмом сжатия «deflate», описанным в RFC 1951.

Кодирование передачи в HTTP

Еще одним параметром HTTP протокола является кодирование передачи. Данный параметр влияет на способ кодирования тела объекта. Кодирования передачи в HTTP отличается от кодирования содержимого тем, что первое – это свойство HTTP сообщения, а не содержимого.

[php]

transfer-coding = «chunked» | transfer-extension

transfer-extension = token

[/php]

Кодирования передачи в HTTP — это аналоги значений Content-Transfer-Encoding MIME, которые были разработаны для обеспечения безопасной передачи двоичных данных при использовании 7-битного обслуживания передачи. В HTTP единственная опасная характеристика тела сообщения вызвана сложностью определения точной длины тела сообщения, или желанием шифровать данные при пользовании общедоступным транспортом.

Кодирование по кускам (chunked encoding) изменяет тело сообщения для передачи его последовательностью кусков, каждый из которых имеет собственный индикатор размера, сопровождаемым опциональным завершителем, содержащим поля заголовка объекта. Это позволяет динамически создаваемому содержимому передаваться вместе с информацией, необходимой получателю для проверки полноты получения сообщения.

[php]

Chunked-Body = *chunk
«0» CRLF
footer
CRLF
chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
hex-no-zero = <HEX за исключением «0»>
chunk-size = hex-no-zero *HEX
chunk-ext = *( «;» chunk-ext-name [ "=" chunk-ext-value ] )
chunk-ext-name = token
chunk-ext-val = token | quoted-string
chunk-data = chunk-size (OCTET)
footer = *entity-header

[/php]

Кодирование по кускам (chunked encoding) оканчивается куском нулевого размера, следующим за завершителем, оканчивающимся пустой строкой. Цель завершителя состоит в эффективном методе обеспечения информации об объекте, который сгенерирован динамически; HTTP приложения не должны посылать в завершителе поля заголовка, которые явно не предназначены для использования в завершителе, такие как Content-MD5 или будущие расширения HTTP для цифровых подписей и других возможностей.

Все HTTP/1.1 приложения должны быть в состоянии получать и декодировать кодирование передачи «по кускам» («chunked» transfer coding), и должны игнорировать расширения кодирования передачи, которые они не понимают. Серверу, который получил тело объекта со значением кодирования передачи, которое он не понимает, следует возвратить ответ с кодом состояния 501 (Не реализовано, Not Implemented, код ошибки сервера) и разорвать HTTP соединение. Сервер не должен посылать поля кодирования передачи (transfer-coding) HTTP/1.0 клиентам. Это требования HTTP стандарта

Возможно, эти записи вам покажутся интересными


Выберете удобный для себя способ, чтобы оставить комментарий

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Loading Disqus Comments ...