Привет, читатель блога 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 сообщения выглядит следующим образом:

[php]

Start-line = Request-Line | Status-Line

[/php]

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

[php]

GET /hello.htm HTTP/1.1     (этот запрос посылает клиент)

 

HTTP/1.1 200 OK             (таким запросом отвечает сервер)

[/php]

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

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

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

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

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

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

[php]

message-header = field-name «:» [ field-value ]

[/php]

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

[php]

User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3

Host: www.example.com

Accept-Language: en, mi

Date: Mon, 27 Jul 2009 12:28:53 GMT

Server: Apache

Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT

ETag: «34aa387-d-1568eb00»

Accept-Ranges: bytes

Content-Length: 51

Vary: Accept-Encoding

Content-Type: text/plain

[/php]

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

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

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

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

[php]

message-body = entity-body

| <entity-body закодированно согласно

Transfer-Encoding>

[/php]

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

[php]

<html>

<body>

 

<h1>Hello, World!</h1>

 

</body>

</html>

[/php]

Длинна 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:

[php]

general-header = Cache-Control            ;

| Connection               ;

| Date                     ;

| Pragma                   ;

| Transfer-Encoding        ;

| Upgrade                  ;

| Via                      ;

[/php]

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

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

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

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

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

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

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


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

This article has 8 comments

  1. Сашка Reply

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

    • Кирилл Reply

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

  2. Котейка Reply

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

    • Кирилл Reply

      Добрый день!

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

  3. Котейка Reply

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

  4. Котейка Reply

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

    • Кирилл Reply

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

  5. Юлия Reply

    Добрый день! Спасибо за статью!

    Полагаю, произошла описка (последнее слово цитаты):

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

    общие заголовки – общие заголовки получили своё название из-за того, что используются и HTTP сообщениях запросов и в HTTP сообщениях ответов;

    заголовки запросов – получили свое название из-за того, что используются в HTTP сообщениях ответов;»

Leave a Comment

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

Loading Disqus Comments ...