Введение

Протокол передачи гипертекста HTTP (Hypertext Transfer Protocol) – это протокол для распределенных информационных систем. Он был создан для обмена данными по сети Интернет.

HTTP базируется на протоколе TCP/IP, который используется для передачи данных (HTML страниц, результатов запросов, изображений и т.д.) по сети Интернет. По умолчанию, TCP использует 80-й порт, другие порты могут быть настроены дополнительно. TCP предоставляет стандартизированный способ взаимосвязи компьютеров между собой. Спецификация HTTP определяет, как именно запросы клиента должны быть построены и отправленность на сервер, и то, как сервер должен отвечать на эти запросы.


Основные свойства

HTTP является простым, но в то же время сильным протоколом благодаря трем свойствам:

  • HTTP не зависит от соединения

    Клиент HTTP (чаще всего браузер), отправляет HTTP-запрос и, после отправки запроса, отсоединяется от сервера и ждет ответа. Сервер обрабатывает запрос и создает новое соединение с клиентом для отправки ответа.

  • HTTP не привязан к конкретному типу данных

    Это означает, что с помощью HTTP мы можем передавать любой тип данных при условии, что и клиент и сервер умеют работать с данным типом данных. Сервер и клиент должны определить тип контента с помощью определенного типа MIME.

  • HTTP взаимодейтсвует только через соединение

    Клиент и сервер могут взаимодействовать друг с другом только с помощью запроса. После этого они забывают друг о друге. Из-за этой особенности протокола ни клиент, ни сервер не могут получить информацию за пределами запроса.

HTTP/1.0 использует соединение для каждого цикла “запрос/ответ”.

HTTP/1.1 может использовать один или несколько циклов “запрос-ответ” внутри одного соединения.


Базовая архитектура

В крайне упрощенной форме, архитектуру HTTP можно представить следующим образом:

Протокол HTTP основан на клиент-серверной архитектуре, в которой браузер, “поисковик” и т.д. действует как “клиент”, а веб-сервер – как “сервер”.


Клиент

Клиент HTTP отправляет запрос на сервер в виде метода запроса, URL и версии протокола, после которых идет MIME-сообщение, которое и содержит модификаторы запроса, информацию о клиенте и, возможно, контент соединения TCP/IP.


Сервер

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

Параметры

Обсудим несколько важных параметров протокола HTTP и то, как они используются при обмене данными (формат ссылки, формат даты и т.д.).

Это поможет нам строить свои запросы и ответы во время написания клиентских и серверных HTTP-программ. Мы увидим использование этих параметров в следующих статьях, посвященных HTTP.


Версия HTTP

Для обозначения версии HTTP используется формат <основной>. <второстепенный> – для обозначения версии протокола. Версия HTTP-сообщения обозначается в поле HTTP-Version в первой строке. На практике это выглядит таким образом:

HTTP
/
1.0

========

HTTP
/
1.1

URL

URL (Uniform Resource Identifiers) имеют простой формат строки, которая включает в себя имя, расположение, порт и т.д. для определения ресурса (веб-сайт, веб-сервис и т.д.)

По умолчанию используется порт 80, но он может быть изменен.

Пример URL:

http://proselyte.net:80/tutorials/

Формат времени и даты

В HTTP время и дата должны быть представлены во времени GMT (Greenwich Mean Time). Во всех случаях без исключений, HTTP допускает несколько представлений:

Tue Nov  16 12:57:37 2016       ; ANSI C's asctime() format
Tue, 16 May 2016 12:57:37 GMT  ; RFC 822, updated by RFC 1123
Tuesday, 16-May-16 12:57:37 GMT ; RFC 850, obsoleted by RFC 1036

Наборы символов

Для определения набора символов мы используем набор, предпочитаемый клиентом. Несколько наборов отделяются запятыми. По умолчанию используется набор US-ACSII.

Пример:

US-ASCII, ISO-8859-1, ISO-8859-7

Кодировка контента

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

В HTTP/1.1 кодировка указывается в полях Accept-Encoding и Content-Encoding.

Пример:

Accept-encoding: compress
Accept-encoding: gzip
Accept-encoding: deflate

Типы медиафайлов

Тип медиафайлов обеспечивает типизирование данных и указывается в полях элемента header: Content-Type и Accept. Все значения типов медиафайлов зарегистрированы в IANA (Internet Assigned Number Authority).

Пример:

Accept: image/jpg

Метка языка

В HTTP метки языка указываются в полях Accept-Language и Content-Language элемента header. Метка состоит из одной или нескольких частей.

Пример:

ru, ru-Ru

Использование двухбуквенной метки является аббревиатурой языка ISO-639, и любые двухбуквенные подметки – кодом страны ISO-3166.

Сообщения

HTTP основан на “клиент-серверной” архитектуре и построен на основе обмена сообщениями с помощью TCP/IP соединения.

При работе с HTTP “Клиент” – это программа (например: веб-браузер), которая устанавливает соединение с сервером для отправки одного или нескольких HTTP-запросов.

HTTP “Сервер” – это программа (чаще всего, веб-сервер, например: Apache), которая принимает соединение для обработки запроса путем отправки HTTP-ответа.

HTTP использует URL для определения необходимого ресурса и устанавливает соединение. После того, как соединение было установлено, HTTP-сообщения отправляются в формате, который крайне похож на используемый при обмене email через интернет (RFC5322) и MIME (Multipurpose Internet Mail extensions – RFC2045). В эти сообщения входит информация от клиента к серверу и ответ от сервера клиенту.

Данное сообщение имеет следующий формат:

 HTTP
-сообщение
=
<
Запрос
>
|
<
Ответ
>
;
 HTTP
/
1.1
 сообщения

HTTP-запрос и HTTP-ответ использует для передачи необходимой информации общий формат сообщения RFC822. Это сообщение состоит из следующих четырех элементов:

  • Стартовая строка (обязательный элемент)
  • Header (опциональный элемент)
  • Пустая строка, которая определят конец полей элемента header (обязательный элемент)
  • Тело сообщения (опциональный элемент)

Стартовая строка

Стартовая строка имеет следующий формат:

стартовая-строка = Строка-Запроса | Строка-Статуса

Рассмотрим отдельно примеры HTTP-запроса и HTTP-ответа.

HTTP запрос:

GET /рgoodDay.htm HTTP/1.1     (Строка-запрос, сделанный клиентом)

HTTP ответ:

HTTP/1.1 200 OK             (Строка-Статуса, отправленная сервером)

Поля Header

HTTP header обеспечивает необходимую информацию о запросе, ответе или отправленном объекте в теле сообщения. Существует четыре типа HTTP сообщений header’a:

  • General-header

    Применимы как для запроса, так и для ответа.

  • Request-header

    Применимы только для запроса.

  • Response-header

    Применимы только для ответа.

  • Entity-header

    Определяют мета-информацию об объекте, переданном в теле, либо, если сообщение не содержит тела, о ресурсе, определенном запросом.

Ниже приведены примеры различных полей элемента header:

User-Agent: curl/8.15.2 libcurl/8.15.2 OpenSSL/1.1.5l zlib/1.0.8
Host: www.proselyte.net
Accept-Language: en, ru
Date: Tue, 17 May 2016 00:28:53 GMT
Server: Apache
Last-Modified: Mon, 16 May 2016 23:15:47 GMT
ETag: "xxx-yyy-xxx"
Accept-Ranges: bytes
Content-Length: 873
Vary: Accept-Encoding
Content-Type: text/plain

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

Это опциональный (необязательный) элемент HTTP сообщения, который содержит объект, связанный с запросом, либо с ответом. Если объект тела связан с обычным Content-Type и Content-Length, то строки элемента header определяют тип конкретного объекта.

Тело сообщения содержит данные HTTP-запроса (тип данных и т.д.), а HTTP-ответ содержит данные, полученные от сервера (файлы, изображения и т.д.).

Ниже приведен пример тела сообщения:

<
html
>
<
body
>
<
h1
>
HTTP Tutorial from Proselyte
<
/h1
>
<
/body
>
<
/html
>

Запросы

HTTP-клиент посылает запрос на сервер в форме cсообщения-запроса, которое имеет следующий формат:

  • Строка запроса (обязательный элемент)
  • Заголовок (опционалный элемент)
  • Пустая строка (обязательный элемент)
  • Тело сообщения (опциональный элемент)

Рассмотрим каждый из этих элементов по отдельности.


Строка запроса

Строка запроса начинается с токена метода, после которого следует URI запроса и версия протокола. Элементы отделяются друг от друга пробелами:

Строка-запроса = Метод (пробел) URI запроса (пробел) версия-HTTP (следующая строка)

Рассмотрим данный элемент более подробно.

Метод запроса

Данный элемент указывает на метод, который должен быть вызван на стороне сервера по указанному индентификатору URI.

В HTTP существует восемь методов:

  • Используется для получения строки статуса и заголовка от сервера по URI. Не изменяет данные.

  • GET

    Используется для получения данных от сервера по указанному URI. Не изменяет данные.

  • POST

    Используется для отправки данных на сервер (например: информация о разработчике и т.д.) при помощи форм HTML.

  • PUT

    Замещает все предыдущие данные на ресурсе новыми загруженными данными.

  • DELETE

    Удаляет все текущие данные на ресурсе, определенном URI.

  • CONNECT

    Устанавливает тоннельное соединение с сервером по указанному URI.

  • OPTIONS

    Описывает свойства соединения для указанного ресурса.

  • TRACE

    Предоставляет сообщение, содержащее обратный рейс расположения, указанного в URI ресурса.

URI запроса

URI (Uniform Resource Identifier) – это идентификатор ресурса, на который отправляется запрос. Ниже приведен наиболее часто встречающийся формат URI:

URI-запроса = "*" | абсолютныйURI | абсолютный_путь | источник

‘*’используется, когда HTTP-запрос не относится к конкретному ресурсу, но к серверу. Используется только в случае, когда метод не обязательно применять к ресурсу. Например:

OPTIONS * HTTP/1.1

абсолютныйURI используется, когда HTTP-запрос выполняется на прокси. Прокси запрашивается для передачи запроса из доступного кэша и возвращает ответ. Например:

GET http://www.proselyte.net/tutorials HTTP/1.1

асболютный_путь | источник используется наиболее часто. Запрашивается конкретный ресурс определенного сервера. Например, клиент хочет получить ресурс с сервера через 80-й порт. Адрес ресурса “www.proselyte.net”, он отправляет следующий запрос:

GET /tutorials HTTP/1.1

Host: www.proselyte.net

Запрос полей заголовка

Поля заголовка позволяют клиенту передать серверу дополнительную информацию о запросе и о себе самом. Эти поля действуют как модификаторы запроса.

Ниже приведен список наиболее важных полей заголовка, которые могут быть использованы:

  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Authorization
  • Expect
  • From
  • Host
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • If-Unmodified-Since
  • Range
  • Referer
  • User-Agent

Если мы захотим реализовать своего собственного клиента и свой собственный веб-сервер, то сможем создать собственные поля заголовка.


Пример HTTP-запроса

GET /tutorials HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.proselyte.net
Accept-Language: ru-Ru
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

Ответы

После получения и обработки запроса от клиента, сервер посылает ответ в виде HTTP-сообщения, которое имеет вид:

  • Строка статуса (обязательный элемент)
  • Заголовок (опциональный элемент)
  • Пустая строка (указывает на окончание заголовка – обязательный элемент)
  • Тело сообщения (опциональный элемент)

Рассмотрим каждый из этих элементов по отдельности.


Строка статуса

Строка статуса содержит версию протокола, код статуса и текстовое сообщение, связанное с этим статусом.

Строка-статуса = Версия-HTTP (пробел) Код-статуса (пробел) Текстовое-сообщение

Версия HTTP

Если сервер поддерживает версию протокола HTTP 1.1, получим элемент Версия-HTTP:

Версия-HTTP = HTTP/1.1

Код статуса

Код статуса – это число, состоящее из трех цифр, первая из которых определяет тип ответа, а две последующие цифры указывают на конкретную ошибку.

Код и описание
1 1xx: Информационное Означает, что запрос был успешно получен и идет его обработка.
2 2xx: Успешное выполнение Запрос был успешно получен, понят и принят.
3 3xx: Перенаправление Последующие действия должны быть предприняты для выполнения запроса.
4 4xx: Ошибка на стороне клиента Запрос содержит синтаксическую ошибку, либо некорректен.
5 5xx: Ошибка на стороне сервера Сервер не может обработать корректный запрос.

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


Поля заголовка ответа

Позже мы более подробно рассмотрим заголовки General и Entity, а сейчас мы разберемся, что из себя представляют поля заголовка ответа в общих чертах.

Поля заголовка ответа позволяют серверу предать дополнительную информацию об ответе, которая не может быть помещена в строке состояния. Эти поля дают информацию о сервере и последующем доступе к ресурсам по указанному URI запроса:

  • Accept-Ranges
  • Age
  • ETag
  • Location
  • Proxy-Authenticate
  • Retry-After
  • Server
  • Vary
  • WWW-Authenticate

Если мы хотим написать свои собственный веб-сервер и веб-клиент, можно создать собственное поле.


Пример HTTP ответа

Ниже приведен пример HTTP-ответа для несуществующей страницы nullpage.html на сайте proselyte.net

HTTP/1.1 404 Not Found
Date: Mon, 23 May 2016 13:49:49 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1
<
!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"
>
<
html
>
<
head
>
<
title
>
404 Not Found
<
/title
>
<
/head
>
<
body
>
<
h1
>
Not Found
<
/h1
>
<
p
>
The requested URL 
ullpage.html was not found on this server.
<
/p
>
<
/body
>
<
/html
>

Коды статусов

Код статуса представляет собой ответ сервера, который состоит из трех цифр, первая из которых определяет класс ответа, а две другие – указывают на конкретный ответ.

Существует пять основных категорий кодов статусов. Все они приведены ниже:

Код и описание
1 1xx: Информационное Означает, что запрос был успешно получен и идет его обработка.
2 2xx: Успешное выполнение Запрос был успешно получен, понят и принят.
3 3xx: Перенаправление Последующие действия должны быть предприняты для выполнения запроса.
4 4xx: Ошибка на стороне клиента Запрос содержит синтаксическую ошибку, либо некорректен.
5 5xx: Ошибка на стороне сервера Сервер не может обработать корректный запрос.

Коды статусов расширяемы и HTTP-приложение не должно понимать значение всех кодов.
Ниже приведены наиболее распространенные коды статусов по категориям:


1ХХ: Информационные

Сообщение Описание
100 Continue Только часть запроса была получена сервером, но на данный момент запрос не был отклонен. Клиент должен продолжать запрос.
101 Switching Protocols Сервер выбирает протокол.

2ХХ: Успешное выполнение

Сообщение Описание
200 OK Запрос успешный.
201 Created Запрос выполнен, новый ресурс создан.
202 Accepted Запрос принят, но обработка не завершена.
203 Non-authoritative Information Информация в заголовке получена из локальной или сторонней копии, а не от оригинального сервера.
204 No Content Код статуса и заголовок переданы в ответе, но данные отсутствуют.
205 Reset Content Браузер должен очистить форму для этой транзакции для дополнительного ввода.
206 Partial Content Сервер возвращает часть данных. Используется для ответа на запрос, содержащий заголовок Content-Range.

3ХХ: Перенаправление

Сообщение Описание
300 Multiple Choices Список ссылок. Пользователь может выбрать ссылку и перейти к локации. Максимальное количество ссылок – 5.
301 Moved Permanently Запрашиваемая страница была перенесена на новую URL.
302 Found Запрашиваемая страница была временно перенесена на новую URL.
303 See Other Запрашиваемая страница может быть найдена по другой URL.
304 Not Modified Код ответа для заголовка If-Modifier-Since или If-None-Match, где URL не была изменена с крайней даты обновления.
305 Use Proxy Доступ к запрашиваемой странице должен быть запрошен через прокси, который указан в заголовке Location.
306Unused Данный код использовался в предыдущей версии, но на данный момент он не используется, а сам код был зарезервирован.
307 Temporary Redirect Запрашиваемая страница была временно перенесена на новую URL.

4ХХ: Ошибка на стороне клиента

Сообщение Описание
400 Bad Request Сервер не понял запрос.
401 Unauthorized Запрашиваемая страница требует имя пользователя и пароль.
402 Payment Required На данный момент клиент не может использовать данный код.
403 Forbidden Доступ к запрашиваемой странице запрещен.
404 Not Found Сервер не может найти запрашиваемую страницу.
405 Method Not Allowed Метод, указанный в запросе, является недопустимым.
406 Not Acceptable Сервер генерирует ответ, который не может быть принят клиентом.
407 Proxy Authentication Required Клиент должен авторизироваться с помощью прокси-сервера прежде, чем запрос сможет быть обработан.
408 Request Timeout Запрос длился дольше, чем сервер был готов ждать.
409 Conflict Запрос не может быть завершен из-за конфликта.
410 Gone Запрашиваемая страница больше недоступна.
411 Length Required Элемент “Content-Length” не определен. Сервер не может принять запрос без данного элемента.
412 Precondition Failed Сервер признал предусловия запроса ошибочными.
413 Request Entity Too Large Сервер не примет данный запрос, так как тело запроса слишком большое.
414 Request-url Too Long Сервер не примет данный запрос, так как URL слишком большая (длинная).
415 Unsupported Media Type Сервер не примет данный запрос, так как данный тип медиафайла не поддерживается.
416 Requested Range Not Satisfiable Запрашиваемый диапазон байтов недоступен и находится за пределами диапазона.
417 Expectation Failed Ожидания, переданные в заголовке запроса, не могут быть удовлетворены данным сервером.

5ХХ: Ошибка на стороне сервера

Сообщение Описание
500 Internal Server Error Запрос не выполнен. Сервер попал в непредвиденные условия.
501 Not Implemented Запрос не выполнен. Сервер не поддерживает запрашиваемый функционал.
502 Bad Gateway Запрос не выполнен. Сервер получил недоступный запрос от следующего сервера.
503 Service Unavailable Запрос не выполнен. На данный момент сервер перегружается или не работает.
504 Gateway Timeout Соединение закрыто по времени.
505 HTTP Version Not Supported Сервер не поддерживает данную версию протокола HTTP.

Поля заголовка

Поля заголовка обеспечивают необходимую информацию о запросе, ответе или о переданном объекте. Существует четыре типа заголовка HTTP-сообщения:

  • Общий заголовок

    Применяется как для запроса, так и для ответа.

  • Заголовок запроса клиента

    Применяется только для запроса.

  • Заголовок ответа сервера

    Применяется только для ответа.

  • Заголовок сущности

    Определяет мета-данные сущности. Если сущности нет, то мета-данные URI запроса.


Общие заголовки

Cache-Control Данное поле заголовка определяет директивы, которые должны быть выполнены системой кэширования. Этот заголовок имеет следующий вид:

Cache-Control: директива-кэш-запроса | директива-кэш-ответа

Сервер или клиент могут использовать данный заголовок кэширования или запроса документов из кэша.

Пример:

Cache-control: no-store

В таблице ниже приведен список наиболее важных директив, которые могут быть использованы HTTP-клиентом в запросах:

Директива кэш-запроса и описание
1 no-cache Кэш не должен использовать запрос для удовлетворения подзапроса без успешной перевалидации сервером.
2 no-store Кэш не должен хранить ничего о запросе клиента или ответе сервера.
3 max-age = seconds Акцентирует внимание на том, что клиент должен принимать ответ, возраст которого не более, чем время, указанное в секундах.
4 max-stale [ = seconds ] Акцентирует внимание на том, что клиент должен принимать ответ, который превышает время истечения. Если даны секунда, то время истечения не должно превышать указанного времени.
5 min-fresh = seconds Акцентирует внимание на том, что клиент должен принимать ответ, время обновления которого не менее, чем текущий возраст, плюс время, указанное в секундах.
6 no-transform Не преобразует сущности.
7 only-if-cached Не получает новые данные. Кэш может отправлять документ только в том случае, если он находится в кэше, и не должен связываться с сервером для получения более новых существующих копий.

Ниже приведены наиболее важные директивы ответа кэша, которые могут быть использованы сервером в HTTP-ответе:

Кэш запроса и описание
1 public Указывает, что ответ может быть кэширован любым кэшем.
2 private Указывает, что весь ответ или его часть предназначены одному пользователю и не должны быть кэшированы общим кэшем.
3 no-cache Кэш не должен использовать ответы для удовлетворения последующих запросов без успешной ревалидации сервером.
4 no-store Кэш не должен хранить информацию о запросе клиента или ответе сервера.
5 no-transform Не преобразует сущность.
6 must-revalidate Кэш должен подтвердить статус валидности документа перед использованием и не должен использовать тех, время валидности которых истекло.
7 proxy-revalidate То же самое, что и must-revalidate, за исключением того, что данная директива не принимает необщие кэши пользователя.
8 max-age = seconds Акцентирует внимание на том, что клиент должен принимать запросы, возраст которых не больше указанного в секундах.
9 s-maxage = seconds Максимальный возраст, заданный данной директивой, переопределяет максимальный возраст, определенный директивой max-age или заголовком Expires. Всегда игнорируется приватным кэшем.

Connection

Данное поле заголовка позволяет отправителю определить желаемые свойства данного конкретного соединения и не должно связываться с прокси через текущее соединение.

Данное поле заголовка имеет следующий вид:

Connection: "Соединение"

Версия HTTP 1.1 определяет свойство соединения “close” отправителю для того, чтобы указать, что соединение будет закрыто после выполнения ответа.

Например:

Connection: close

По умолчанию, HTTP/1.1 использует персистентные соединения, в которых соединение не закрывается автоматически после выполнения транзакции. HTTP/1.0 не имеет персистентного соединения по умолчанию, и, если мы хотим его использовать, нам необходимо использовать параметр keep-alive.
Пример:

Connection: keep-alive

Дата
При работе с HTTP, время и дата должны быть представлены во времени Гринвич (Greenwich Mean Time – GMT) во всех случаях без исключений.

При работе с HTTP-приложениями допускается использование одного из следующих трех форматов:

Tue, 24 May 2016 15:15:15 GMT   ;
Tuesday, 24-May-16 15:15:15 GMT ;
Tue May  24 15:15:15 2016       ;

Наиболее часто встречается первый формат.

Pragma

Данное поле используется для внедрения имплементации специальных иректив, которые могут быть приняты любым реципиентом в цепочке запрос/ответ.

Например:

Pragma: no-cache

Директива no-cache является единственной директивой, которую поддерживает версия HTTP/1.0. Для обратной совместимости она поддерживается и HTTP/1.1. В будущем создание новых директив Pragma не планируется.

Trailer
Это поле указывает, что данный набор заголовков представлен в виде последовательности сообщений, которые закодированы с помощью фрагментирования кодировки передачи.
Например:

Trailer: имя-поля

Сообщения данного заголовка не должны включать следующие поля:

  • Trailer
  • Content-Length
  • Transfer-Encoding

Transfer-Encoding

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

Пример:

Transfer-Encoding: chunked

Upgrade
Данное поле позволяет клиенту определять дополнительные протоколы обмена данными, которые он поддерживает и хотел бы использовать в случае, если он поддерживается сервером.
Пример:

Upgrade: HTTP/1.1, SHTTP/1.2, RTA/x11

Via
Это поле используется соединениями и прокси для указывания промежуточных протоколов и адресатов. Если данные идут не напрямую, а через прокси.

Например:

Via: 1.2 some_proxy, 1.1 website.com (Apache/1.1)

Warning
Данное поле используется для хранения дополнительной информации о статусе или преобразовании данных, которые могут не отображаться в самом сообщении.
Заголовок имеет следующий вид:

Warning: код-предупреждения (пробел) агент-предупржедения (пробел) текст-предупреждения (пробел) дата-предупреждения

Заголовки запросов клиента

Accept

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

Общий вид:

Accept: тип/подтип [q = qvalue]

Если мы хотим использовать несколько типов данных, нам необходимо отделить их запятыми и добавить необязательное значение qvalue (уровень качества) от 0 до 1.
Например:

Accept: text/plain; q=0.8, text/html; q=0.9, text/x-c

Т.е. наиболее предпочтительными являются типы text/x-c, но если они не существуют, то text/html, а если нет его – text/plain.

Accept-Charset
Указывает, какой набор символов приемлем для ответа.
Пример:

Accept-Charset: iso-8859-7, unicode-1-1; q=0.7

Accept-Encoding
Указывает приемлемую для ответа кодировку контента.
Пример:

Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.6, gzip;q=0.9
Accept-Encoding: gzip;q=0.9, identity; q=0.6, *;q=0

Accept-Language
Указывает набор приемлемых языков для ответа.
Пример:

Accept-Language: ru, en-us;q=0.6, en;q=0.8

Authorization
Содержит данные аутентификации пользователя для запрашиваемого ресурса.
Содержит имя_пользователя:пароль, закодированные базовой 64-битной кодировкой
Пример:

Authorization: BASIC K4Kma4Y1A3Hqn1LsNuO=

Cookie
Содержит пару “имя-значение” информации, хранящейся по данной URL.
Пример:

Cookie: имя1=значение1;имя2=значение2;имя3=значение3

Expect
Указывает, что данный набор поведений сервера требуется клиентом.
Пример:

Expect : 100-continue | ожидаемое-расширение

From
Данное поле содержит email пользователя, который контролирует запросы пользователя.
Пример:

From: [email protected]

Host
Определяет хост и порт запрашиваемого ресурса.
Пример:

GET /pub/WWW/ HTTP/1.1
Host: www.proselyte.net

If-Match
Данное поле используется для того, чтобы сделать метод условным. Если мы хотим, чтобы метод выполнялся только при соблюдении определенного условия.
Пример:

If-Match: "abcd"
If-Match: "aabcd", "avfgwfw", "wfwgp"
If-Match: *

В данном случае, если не выполнится ни одно из условий, то сервер не выполнит запрашиваемый метод и вернет код статуса 412.

If-Modified-Since

Используется для создания условий. Если запрашиваемая URL не была изменена с указанного времени, сущность будет возвращена сервером вместо ответа 304 (Not modified) без сообщения в теле.

Пример:

If-Modified-Since: Mon, 23 May 2016 16:37:12 GMT

If-None_Match
Используется для того, чтобы сделать метод условным. Выполняется только в том случае, если одно из переданных значений совпадает с тэгом, представленным ETag.
Пример:

If-None-Match: "abcdefg"

If-Range
Данное поле может быть использовано с условным GET для запроса определенной части данных.
Пример:

If-Range: Mon, 23 May 2016 16:37:12 GMT

Если документ не был изменен с указанной даты, то сервер вернет диапазон байтов, переданный заголовком Range.

If-Unmodified-Since
Данный заголовок делает метод условным.
Пример:

If-Unmodified-Since: Mon, 23 May 2016 16:37:12 GMT

Если запрашиваемый ресурс не был изменен с указанного времени, сервер должен выполнить запрашиваемые действия.

Max-Forwards
Этот заголовок обеспечивает механизм с методами TRACE и OPTIONS для ограничения количества прокси или соединений, которые могут передавать запрос следующему серверу.
Пример:

Max-Forwards : 10

В данном случае максимальное количество прокси и соединений – 10.

Proxy-Authorization
Данный заголовок позволяет клиенту определять себя (или своего пользователя) для прокси, который требует аутентификации.
Пример:

Proxy-Authorization : имя_пользователя_и_пароль

Range
Поле заголовка Range определяет диапазон запрашиваемого из документа контента в байтах.
Пример:

- Только первые 100 байтов
Range: bytes=0-999

Несколько диапазонов байтов указываются через запятую.

Referer
Данное поле заголовка позволяет клиенту определять URI ресурса, с которого пришел запрос на URL.
Пример:

Referer: http://www.proselyte.net/tutorials/http-tutorial.html

TE
Поле заголовка TE указывает расширение кодировки передачи, которая должна быть принята запросом или не должна.
Пример:

TE: deflate
TE:
TE: trailers, deflate;q=0.9

Означает, что клиент должен принимать поля trailer и фрагментированную кодировку передачи.

User-Agent
Данное поле заголовка содержит информацию об агенте пользователя, посылающего запрос.
Пример:

User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

Заголовки ответа сервера

Accept-Ranges
Позволяет среверу указывать принятие им диапазона запросов.
Пример:

Accept-Ranges: bytes

Сервер принимает запросы диапазонов байтов.

Age
Передает ожидания относительно времени (в секундах), прошедшего с момента ответа, который был сгенерирован сервером.
Пример:

Age: 900

Указывает, что ожидаемое время – 900 секунд (15 минут).

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

ETag: "abcdef"

Location
Используется для перенаправления реципиента на URL, отличную от запрашиваемой.
Пример:

Location: http://www.proselyte.net/http-tutoiral.html

Proxy-Authenticate
Данное поле заголовка должно быть включено как часть ответа 407 (Proxy Authentification Required).
Пример:

Proxy-Authenticate  : информация

Retry-After
Может быть использовано вместе с ответом 503 (Service Unavailable), чтобы указать, как долго сервис будет недоступен для запросов.
Пример:
Запрос после определенной даты

Retry-After: Sun, 29 May 2016 23:59:59 GMT

Запрос после определенного промежутка времени в секундах (в примере, через 600 секунд)

Retry-After: 600

Server
Содержит информацию о ПО, которое используется сервером, который обрабатывает запрос.
Пример:

Server: Apache/2.2.14 (Win32)

Set-Cookie
Содержит пары значений “имя/значение”, информации по этой URL.
Вот возможные значения, которые мы можем настроить:

Настройка и описание
1 Comment=comment Для определения любого комментария, связанного с cookie.
2 Domain=domain Определяет домен, для которого cookie валидны.
3 Expires=Date-time Дата, после которой cookie не действительны. Если пусто, то истекают сразу после закрытия браузера клиентом
4 Path=path Определяет подмножество URL, к которым применимы cookie.
5 Secure Дает указанию агенту пользователя возвращать cookie только под защищенным соединением

Пример:

Set-Cookie: имя1=значение1,имя2=значение2; Expires=Sun, 29 May 2016 23:59:59 GMT

Vary
Определяет, что сущность имеет несколько ресурсов, которые могут варьироваться в зависимости от определенного списка заголовков запроса.

Пример:

Vary: Accept-Encoding, Accept-Language

WWW-Authenticate
Должен быть включен в ответ 401 (Unauthorized).
Пример:

WWW-Authenticate: BASIC realm="administrator"

Заголовки сущности

Allow
Содержит список методов, которые поддерживаются ресурсом, определяемым URL.
Пример:

Allow: GET, HEAD, PUT, POST

Content-Encoding
Используется как модификатор типа медиафайлов.
Пример:

Content-Encoding: zip

Если кодировка контента, запрашиваемая клиентом, не поддерживается сервером, то будет получен ответ 415 (Unsupported Media Type).

Content-Language
Определяет языки для определенной сущности.
Если мы хотим использовать несколько языков, то мы должны указать их символы через запятую.
Пример:

Content-Language: ru, en

Content-Length
Данное поле заголовка указывает размер тела сущности десятичным числом (символы).
Пример:

Content-Length: 5000

Content-Location
Используется для поддержки локации ресурса для сущности, помещенной в сообщение, когда сущность запрашивается из локации, отличной от URI запрашиваемого ресурса.

Пример:

Content-Location: http://www.proselyte.net/http-tutorial.html

Content-MD5
Данный заголовок используется для поддержки MD5 для сущности.
Пример:

Content-MD5  : e0dd3b3c2d46826455f917a8e1f3f5a3

Content-Range
Данное поле заголовка отсылается с частью сущности для того, чтобы указать, где именно в целой сущности должна размещаться часть.
Пример:
Предположим, размер сущности 2000 байтов.

- Первые 800 байтов:
Content-Range : bytes 0-799/2000

- Вторые 800 байтов:
Content-Range : bytes 800-1599/2000

- Всё, кроме первых 800 байтов:
Content-Range : bytes 800-1999/2000

- Крайние 800 байтов:
Content-Range : bytes 1200-1999/2000

Когда HTTP-сообщение содержит контент с один диапазоном, то передается с заголовками Content-Range и Content-Length для того, чтобы показать количество уже переданных байтов.
Например:

HTTP/1.1 206 Partial content
Date: Mon, 23 May 2016 19:12:49 GMT
Last-Modified: Sun, 22 May 2016 22:39:11 GMT
Content-Range: bytes 31000-57019/57020
Content-Length: 26020
Content-Type: image/jpg

Content-Type
Данное поле заголовка указывает тип медиафайла тело сообщения, переданного реципиенту.
Пример:

Content-Type: text/html; charset=ISO-8859-5

Expires
Указывает дату и время, после которого ответ считается устаревшим.
Пример:

Expires: Sun, 29 May 2016 23:59:59 GMT

Last-Modified
Данное поле заголовка указывает дату и время, когда (по мнению сервера) крайний раз был изменен файл.
Пример:

Last-Modified: Sun, 29 May 2016 23:59:59 GMT

Кэширование

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

Главная цель кэширования в HTTP/1.1 – оценить необходимость отправки запроса и отправки полного ответа во многих случаях.

Базовый механизм кэширования – неявные команды кэшам, в которых сервер определяет время истекания и валидность. Для этих целей мы используем заголовок Cache-Control.

Заголовок Cache-Control позволяет клиенту или серверу передавать различные команды в запросы или ответы. Обычно эти команды переопределяют алгоритмы кэширования, определенные по умолчанию. Команды кэширования указывают списком и отделяются запятыми.

Пример:

Cache-control: no-cache

При HTTP-запросах клиент может использовать следующие команды кэширования:

Команда кэширования запроса и описание
1 no-cache Кэш не должен использовать ответ для удовлетворения запроса без успешной ревалидации начальным сервером.
2 no-store Кэш не должен хранить какую-либо информацию о запросе клиента или ответе сервера.
3 max-age = seconds Указывает максимальный возраст ответа (в секундах), который клиент может принимать.
4 max-stale [ = seconds ] Указывает, что клиент принимает ответы, которые превысили время истечения. Если секунды указаны, то ответ не должен превышать время, указанное в секундах.
5 min-fresh = secondsУказывает, что клиент должен принимать ответы, время обновления которых не менее текущего возраста, плюс время, указанное в секундах.
6 no-transform Не преобразует тело сущности.
7 only-if-cached Не принимает новые данные. Кэш может отправлять документ только в том случае, если он уже кэширован, и не должен устанавливать связь с сервером для получения более новых существующих копий.

В HTTP ответах сервер может использовать команды, которые указаны ниже:

Команда кэширования ответа и описание
1 public Ответ может быть кэширован любым кэшем.
2 private Все сообщение или его часть предназначены только для одного пользователя и не должны кэшироваться общими кэшами.
3 no-cache Кэш не должен использовать ответ для удовлетворения соответствующего запроса без успешной ревалидации начальным сервером.
4 no-store Кэш не должен хранить информацию о запросе клиента или ответе сервера.
5 no-transform Не преобразует тело сущности
6 must-revalidate Кэш должен проверить статус валидности документа перед его использованием. Документы, время валидности которых истекло, не должны использоваться.
7 proxy-revalidate То же самое, что и must-revalidate, за исключением того, что не общие кэши агентов пользователей не разрешены.
8 max-age = seconds Указывает максимальный возраст ответа (в секундах), который может быть принят клиентом.
9 s-maxage = seconds Переопределяет команду, максимальный возраст, определенный командой max-age или заголовком Expires. Данная директива всегда игнорируется приватным кэшем.

results matching ""

    No results matching ""