HTTP (сокр. от англ. HyperText Transfer Protocol — «протокол передачи гипертекста») — это протокол высокого уровня (а именно, уровня приложений), обеспечивающий необходимую скорость передачи данных, требующуюся для распределенных информационных систем гипермедиа. HTTP используется проектом World Wide Web с 1990 года.

Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI (Universal Resource Identifier - Универсальный Идентификатор Ресурсов, в виде местонахождения (URL) или имени (URN)).

Протокол HTTP используется также для коммуникаций между различными пользовательскими агентами и шлюзами, дающими гипермедиа доступ к существующим Internet протоколам, таким как SMTP, NNTP, FTP, Gopher, и WAIS.

Семейство: TCP/IP.

Порт/ID: 80/TCP.

Программное обеспечение

Для работы с HTTP выделяется три больших категории ПО:

  • Серверы

основные поставщики услуг хранения и обработки информации (обработка запросов), во избежание путаницы с прокси серверами используется термин origin server. Основные реализации серверов: Apache, Internet Information Services, lighttpd, Nginx.

  • Клиенты

конечные потребители услуг сервера (отправка запроса). Клиентами являются браузеры, оффлайн-браузеры, менеджеры закачек, программы скачивания обновлений, поисковые машины Интернет.

  • Прокси

для выполнения транспортных служб. Основные реализации прокси: Squid, UserGate, Multiproxy, Naviscope, Nginx.

Основой HTTP является технология «клиент-сервер». Запрашивающая программа (клиент) устанавливает связь с обслуживающей программой-получателем (сервер, origin server) и посылает запрос серверу в следующей форме: метод запроса, URI, версия протокола, за которой следует MIME-подобное сообщение, содержащее управляющую информацию запроса, информацию о клиенте и тело сообщения, если оно присутствует. Сервер отвечает сообщением, содержащем строку статуса (включая версию протокола и код статуса - успех или ошибка), за которой следует MIME-подобное сообщение, включающее в себя информацию о сервере, метаинформацию о содержании ответа, и само тело ответа, если оно присутствует. Следует отметить, что одна программа может быть одновременно и клиентом и сервером, это зависит не от функционала программы, а от роли этой программы в течение конкретного сеанса связи.

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

Структура протокола

Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:

  • Стартовая строка (Starting line) — определяет тип сообщения;

  • Заголовки (Headers) — характеризуют тело сообщения, параметры передачи и прочие сведения;

  • Тело сообщения (Message Body) — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой.

Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом, так как указывает на тип запроса/ответа. Исключением является версия 0.9 протокола, у которой сообщение запроса содержит только стартовую строку, а сообщения ответа — только тело сообщения.

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

  • GET — для версии протокола 0.9.

  • HTTP/ — для остальных версий.

Где:

(метод) — название запроса, одно слово заглавными буквами. В версии HTTP 0.9 использовался только метод GET.

(универсальный идентификатор ресурсов) — определяет путь к запрашиваемому документу.

(версия) — версия протокола HTTP. Например: 0.9, 1.0 или 1.1.

Методы

Метод HTTP (HTTP Method) — последовательность из любых символов, кроме управляющих и разделителей, указывающая на основную операцию над ресурсом. Обычно метод представляет собой короткое английское слово, записанное заглавными буквами. Обратите внимание, что название метода чувствительно к регистру. Каждый сервер обязан поддерживать как минимум методы GET и HEAD. Если сервер не распознал указанный клиентом метод, то он должен вернуть статус 501 (Not Implemented). Если серверу метод известен, но он не применим к конкретному ресурсу, то возвращается сообщение с кодом 405 (Method Not Allowed). В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списком поддерживаемых методов. Кроме методов GET и HEAD, часто применяется метод POST.

Список методов для версии 1.1

  • OPTIONS

  • GET

  • HEAD

  • POST

  • PUT

  • PATCH

  • DELETE

  • TRACE

  • LINK

  • UNLINK

  • CONNECT

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

HTTP/

Где:

(версия) — пара разделённых точкой арабских цифр, как в запросе.

(код состояния) — три арабские цифры. По коду статуса определяется дальнейшее содержимое сообщения и поведение клиента.

(пояснение) — текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным.

Коды состояний

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

В настоящее время выделено пять классов кодов состояния:

1xx Informational (Информационный) — коды, информирующие о процессе передачи данных.

2xx Success (Успех) — сообщения данного класса информируют о случаях успешного принятия и обработки запроса клиента.

3xx Redirection (Перенаправление) — коды класса 3xx сообщают клиенту, что для успешного выполнения операции необходимо сделать запрос по другому URI. Адрес, по которому клиенту следует произвести запрос, сервер указывает в заголовке Location.

4xx Client Error (Ошибка клиента) — класс кодов 4xx предназначен для указания ошибок со стороны клиента. При использовании всех методов, кроме HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя.

5xx Server Error (Ошибка сервера) — коды 5xx выделены под случаи неудачного выполнения операции по вине сервера. Для всех ситуаций, кроме использования метода HEAD, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю.