Тема 3: HTTP сообщение: типы HTTP сообщений, заголовки HTTP сообщений, тело сообщения и примеры HTTP сообщений

Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. Сегодня мы с тобой поговорим про HTTP сообщения их структуру и синтаксис. Из статьи ты узнаешь: про структуру HTTP сообщений и про каждый элемент HTTP сообщения в отдельности: про начальную строку сообщения HTTP, про заголовки и тело HTTP сообщений, а так же мы с тобой разберем, как приложения определяют длину HTTP сообщения.

HTTP сообщения: структура и синтаксис

HTTP сообщения: структура и синтаксис


Общая информация и структура HTTP сообщений

Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол.  HTTP сообщение – это способ общения между клиентом и сервером по средствам HTTP протокола. Соответственно, HTTP сообщения делятся на два вида: HTTP сообщения запросы, которые посылает клиент и HTTP сообщения ответы, которые посылает сервер HTTP. В основе формата сообщений HTTP лежит формат IMF, который вы можете найти в RFC 822. Общая структура HTTP сообщений выглядит следующим образом:

  1. Начальная строка сообщения.
  2. Заголовок, который может содержать одно или несколько полей заголовка.
  3. Пустая строка (на самом деле эта строка не пустая, она содержит символ CTRLF), которая обозначает конец заголовка.
  4. Необязательное тело сообщения или HTTP объект.

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

Начальная строка HTTP сообщения

Общий синтаксис начальной строки HTTP сообщения выглядит следующим образом:

Когда мы начнем разговор про HTTP запросы и HTTP ответы мы поговорим более подробно о Request-Line и Status-Line, а сейчас давайте приведем пример начальной строки HTTP сообщения:

Заголовки HTTP сообщений

Сразу стоить отметить, что все HTTP заголовки имеют одинаковый формат. Общие заголовки, заголовки ответов и запросов, заголовки объектов у всех у них единый и обобщенный формат. Любое поле заголовка в HTTP сообщение имеет единый синтаксис: имя_заголовка : значение. Имена полей в заголовках HTTP сообщений не чувствительны к регистру символов.

Порядок HTTP заголовков, в котором они получаются, не имеет значения. Однако правилом хорошего тона считается следующий порядок заголовков в HTTP сообщениях: общие заголовки, заголовки запроса или заголовки ответа и последними идут заголовки объекта.

Давайте теперь рассмотрим область применения заголовков в HTTP сообщениях:

  • общие заголовки – общие заголовки получили своё название из-за того, что используются и HTTP сообщениях запросов и в HTTP сообщениях ответов;
  • заголовки запросов – получили свое название из-за того, что используются в HTTP сообщениях ответов;
  • заголовки ответов – их так назвали потому что применяются для HTTP сообщений ответов;
  • заголовки объектов – служат в HTTP сообщениях для передачи служебной (мета) информации о теле объекта, если тела нет, то в них содержится информация о ресурсе, указанном, как URI (URI в HTTP).

Давайте рассмотрим общий синтаксис заголовков в HTTP сообщениях:

А теперь приведем несколько примеров заголовков в HTTP сообщениях:

Вот так нехитро реализованы заголовки в HTTP сообщениях. Кстати, иногда значения в заголовках могут указываться через запятую.

Тело HTTP сообщения

Тело HTTP сообщения необязательная составляющая HTTP сообщения. Тело HTTP сообщения используется для передачи тела объекта запроса или тела объекта ответа. Между телом объекта и телом HTTP сообщения есть разница только в том случае, когда используется кодирование передачи, кодирование передачи указывается специальным полем Transfer-Encoding. Данное поле является частью HTTP сообщения, а не передаваемого объекта, поэтому его может удалить любая из общающихся сторон. Присутствие тела HTTP сообщения обозначается заголовками Content-Length и Transfer-Encoding.

Общий синтаксис тела HTTP сообщения выглядит так:

А вот пример тела HTTP сообщения:

Длинна HTTP сообщения

Если присутствует тело HTTP сообщения, то его длину следует определять одним из следующих методов по порядку:

  1. Любое HTTP сообщение ответа сервера, которое не должно включать тело сообщения, всегда должно быть завершено пустой строкой после заголовков.
  2. Если в заголовках HTTP сообщений присутствует поле Transfer-Encoding при этом у этого поля значение chunked, то длину HTTP сообщения следует определять методом кодирования по кускам (chunked encoding).
  3. Если у заголовка HTTP сообщения есть поле Content-Length, то значение, которое записано в Content-Length является длиной HTTP сообщения, измеряется в байтах.
  4. Если HTTP сообщение использует медиа типы «multipart/byteranges», который само разграничен, то он и определяет длину.
  5. Длинна HTTP сообщения определяется закрытием HTTP соединения со стороны сервера.

HTTP сообщения не должны одновременно включать и поле заголовка Content-Length и применять кодирование передачи типа «chunked». Если поступило HTTP сообщение с полем Content-Length и закодированное с применением кодирования передачи «chunked», то поле Content-Length должно игнорироваться.

Если поле Content-Length присутствует в HTTP сообщении, которое допускает наличие тела сообщения, то значение поля должно точно соответствовать числу байтов в теле сообщения. Клиенты версии HTTP/1.1 должны информировать пользователя в случае получения и обнаружения недопустимой длины.

Общие поля заголовка HTTP сообщений

В HTTP есть несколько полей заголовка, которые являются общими для всех типов сообщений HTTP. Эти поля не применяются к передаваемому объекту, а применяются только к сообщению HTTP:

Имена общих полей заголовка HTTP сообщений могут быть расширены только с появлением новой версии стандарта HTTP.

Пример HTTP сообщения

Напоследок приведу наглядный пример HTTP сообщения:

Пример HTTP сообщения ответа сервера

Пример HTTP сообщения ответа сервера

На рисунке четко видно, где идет начальная строка HTTP сообщения, где идут заголовки HTTP сообщения, так же показан разделитель HTTP сообщения и тело сообщения. И хочу заметить, что в примере используется HTTP ответ сервера, так как в статусной строке используется код состояния 200, относящийся к успешным кодам состояния. А вот если бы в статусной строке был HTTP метод, то это был бы запрос клиента, у которого были бы другие поля.

7 комментариев к записи Тема 3: HTTP сообщение: типы HTTP сообщений, заголовки HTTP сообщений, тело сообщения и примеры HTTP сообщений

Сашка

Всегда считал что HTTP протокол это что-то хитрое и сложное. Даже в этом убеждаться начал когда читал предыдущие твои посты, но могу сказать что почитав про HTTP сообщения и посмотрев примеры HTTP сообщений я понял что хитрого здесь ничего нет.

Кирилл

Да не, HTTP протокол — это ничего хитрого. Просто логика, придуманная умными дядьками из ЦЕРНа, по которой работают клиенты и сервера. А структура HTTP сообщений действительна простая, все будет кристально ясно и прозрачно в дальнейшем, когда начну разбирать заголовки HTTP сообщений.

Котейка

А вот сообщения, которые посылает Apache и сообщения, которые посылает IIS — это разные сообщения?

Кирилл

Добрый день!

Если смотреть на эти сообщения со стороны HTTP протокола, то это HTTP сообщения ответа сервера. Если посмотреть на сообщения Apache и на сообщения IIS, то легко можно заметить, что набор заголовков у HTTP сообщений разный и значения могут быть разные. Надеюсь, ответил на ваш вопрос 🙂

Котейка

Да, спасибо, ответили! А еще один можно?))

Котейка

http сообщения могут нанести вред моему компьютеру или сайту?

Кирилл

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

Текст комментария: