Введение
Протокол передачи гипертекста 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 существует восемь методов:
HEAD
Используется для получения строки статуса и заголовка от сервера по 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. Данная директива всегда игнорируется приватным кэшем. |